最近、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 らしい書き方を覚えないとなと思う今日この頃です。