最近、PowerShell を使ってごにょごにょする機会が多く、勉強かねていろいろと作っています。
今回は OU / コンテナにどのような GPO が設定されているかを取得するためのサンプルを。
VBScript チックに書いてしまっているので、まだまだ修行が足りません…。
param( [String]$Domain = "AlwaysOn.local" ) $dom = [ADSI]"LDAP://$Domain" $domsearch = New-Object System.DirectoryServices.DirectorySearcher ($dom) $domsearch.psbase.Filter= "(gPLink=*LDAP*)" $search = $domsearch.FindAll() | Sort-Object -Property distinguishedName $DCName = "" foreach($DC in $domain.Split(".")){ if ($DCName -eq ""){ $DCName = "DC=$DC" }else{ $DCName += ",DC=$DC" } } $gplist = ([ADSI]"LDAP://$domain/CN=Policies,CN=System,$DCName").Children $result = @() foreach($obj in $search){ $gplinkAry = (($obj.Properties.gplink).Split("]")).Replace("[", "") $gpname = "" for($cnt = 0 ;$cnt -lt $gplinkAry.Length -1; $cnt++){ foreach($gp in $gplist | Sort-Object -Property displayName){ if($gplinkAry[$cnt] -like "*$($gp.properties.cn)*"){ if ($gpname -eq ""){ $gpname = $gp.Properties.displayName.Trim() }else{ $gpname += "," + $gp.Properties.displayName } } } } $result += [pscustomobject]@{dn=($obj.Properties.distinguishedname); gpname=$gpname} # $ret = New-Object PSObject # $ret | Add-Member -MemberType "NoteProperty" -Name "dn" -Value ($obj.Properties.distinguishedname) # $ret | Add-Member -MemberType "NoteProperty" -Name "gpname" -Value $gpname # $result += $ret } $result
実行すると以下のような結果が取得できます。
コメント化している部分は、[pscustomobject] が使えない時に利用しようと思って書いておいたものになります。
GPO が設定されている OU は、gpLink が設定されているので、それを LIKE 検索しています。
最初は * で検索していたのですが、GPO を一度設定して、外したものについては NULL ではなくなってしまうため、それを除外するために LDAP の文字列で検索をしています。
あとは GPO の名称を取得するためにごにょごにょやっていますが、この辺にセンスのなさを感じます…。
もっと PowerShell らしい書き方を覚えないとなと思う今日この頃です。