SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

PowerShell で GPO の設定状態を取得

leave a comment

最近、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

実行すると以下のような結果が取得できます。

image

コメント化している部分は、[pscustomobject] が使えない時に利用しようと思って書いておいたものになります。

GPO が設定されている OU は、gpLink が設定されているので、それを LIKE 検索しています。

最初は * で検索していたのですが、GPO を一度設定して、外したものについては NULL ではなくなってしまうため、それを除外するために LDAP の文字列で検索をしています。

あとは GPO の名称を取得するためにごにょごにょやっていますが、この辺にセンスのなさを感じます…。

もっと PowerShell らしい書き方を覚えないとなと思う今日この頃です。

Share

Written by Masayuki.Ozawa

12月 4th, 2013 at 1:30 am

Leave a Reply