2010/05/19

サーバのグループポリシーのリンク監視の方法を模索してみる


さて、久々の更新です。
独りよがりで描かず、今後は定義を再確認しつつ
わかりやすく絵で表現していこうかなーと思っていたのですが、
少し作ってみたいPowerShellのスクリプトができたので、
やっぱり今回もPowerShellのメモ描きですw

その作ってみたいスクリプトとは・・


他に良い案があればみなさんに教えてもらうとして・・(笑)
とりあえず、泥臭い手段でPowerShellを使って模索してみます。

PowerShell v2 になってからADに関するモジュールが追加されたので、それを利用してみましょう。
とりあえず、ActiveDirectory と、GroupPolicy のモジュールを追加してみる。
PS > Import-Module activedirectory
PS > Import-Module grouppolicy
これにより、ADやグループポリシーに関するコマンドを使用することができます。
PS> Get-Command -module activedirectory


CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-ADComputerServiceAccount    Add-ADComputerServiceAccount...
Cmdlet          Add-ADDomainControllerPasswo... Add-ADDomainControllerPasswo...
Cmdlet          Add-ADFineGrainedPasswordPol... Add-ADFineGrainedPasswordPol...
Cmdlet          Add-ADGroupMember               Add-ADGroupMember [-Identity...
Cmdlet          Add-ADPrincipalGroupMembership  Add-ADPrincipalGroupMembersh...
PS > Get-Command -module grouppolicy


CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Backup-GPO                      Backup-GPO -Guid -Pat...
Cmdlet          Copy-GPO                        Copy-GPO -SourceGuid ...
Cmdlet          Get-GPInheritance               Get-GPInheritance [-Target] ...
Cmdlet          Get-GPO                         Get-GPO [-Guid] [[-Do...
Cmdlet          Get-GPOReport                   Get-GPOReport [-Guid] ...
 さて、では例として下記のようにGPOがリンクされていた場合。

GPOのリンクが何がついているかを見るには、 Get-GPInheritance コマンドレットを使います。
PS> Get-GPInheritance -target "OU=GroupA,OU=UserList,DC=furyu,DC=local"




Name                  : groupa
ContainerType         : OU
Path                  : ou=groupa,ou=userlist,dc=furyu,dc=local
GpoInheritanceBlocked : No
GpoLinks              : {GPOtest1, GPOtest2}
InheritedGpoLinks     : {GPOtest1, GPOtest2, Default Domain Policy}
 ちょっとこれだけだとわかりづらいから、 GpoLinks だけを取り出してみる。
PS > Get-GPInheritance -target "OU=GroupA,OU=UserList,DC=furyu,DC=local" | % { $_.gpolinks }


GpoId       : 09ecc96a-2d91-4594-8474-4404e82241d2
DisplayName : GPOtest1
Enabled     : True
Enforced    : False
Target      : ou=groupa,ou=userlist,dc=furyu,dc=local
Order       : 1


GpoId       : 72e4f0a0-7b01-4944-9fba-6ad14faefb49
DisplayName : GPOtest2
Enabled     : True
Enforced    : False
Target      : ou=groupa,ou=userlist,dc=furyu,dc=local
Order       : 2
これで、 OUが "OU=GroupA,OU=UserList,DC=furyu,DC=local" のかかっているリンクのGPOをとりだすことができました。
しかし、監視するとなると全OUのリンク状況を知らないといけないですよね。
というわけで、全OUを列挙してみましょう。
OUを出すには、ActiveDirectoryモジュールを追加してできた、Get-ADOrganizationalUnit コマンドレットを使います。
PS > Get-ADOrganizationalUnit -Filter 'Name -like "*"'


City                     :
Country                  :
DistinguishedName        : OU=Domain Controllers,DC=furyu,DC=local
LinkedGroupPolicyObjects : {CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Polici
                           es,CN=System,DC=furyu,DC=local}
ManagedBy                :
Name                     : Domain Controllers
ObjectClass              : organizationalUnit
ObjectGUID               : ee6dfe99-a1f5-4579-b810-d12d22fcdfff
PostalCode               :
State                    :
StreetAddress            :
 これで全OUを取り出せるので、このオブジェクト群を変数にいれてしまいます。
PS > $oulist=Get-ADOrganizationalUnit -Filter 'Name -like "*"'
 では、この変数を利用してリンクが貼られているOUとそのGPOを出してみましょう。
PS > $oulist | % { Get-GPInheritance -target $_ } | ? { $_.gpolinks -ne "" } | fl -Property path,gpolinks


Path     : ou=domain controllers,dc=furyu,dc=local
GpoLinks : {Default Domain Controllers Policy}


Path     : ou=groupa,ou=userlist,dc=furyu,dc=local
GpoLinks : {GPOtest1, GPOtest2}


Path     : ou=groupb,ou=userlist,dc=furyu,dc=local
GpoLinks : {GPOtest2, GPOtest3, GPOtest1, GPOtest4}

あとは、このオリジナルのリストと、取得したリストを比較するスクリプトを定期的にタスクで流して差異がでたら報告、みたいな作りをさせればなぁと思ったのですが。


そんなわけで、もう少しやり方考えなきゃなぁと思ってます。

スポンサーリンク

スポンサーリンク