さて、久々の更新です。
独りよがりで描かず、今後は定義を再確認しつつ
わかりやすく絵で表現していこうかなーと思っていたのですが、
少し作ってみたい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}
あとは、このオリジナルのリストと、取得したリストを比較するスクリプトを定期的にタスクで流して差異がでたら報告、みたいな作りをさせればなぁと思ったのですが。
そんなわけで、もう少しやり方考えなきゃなぁと思ってます。