グループポリシーの適用状況を確認する際に「gpresult /R」や「rsop.msc」を使って情報の確認をすることがあるかと思います。
リモートからグループポリシーの適用状況を確認しようとした場合、これら以外の方法で取得できないかを考えたところ、「コンピューターのグループポリシー」であれば、レジストリからも情報が取得することができるようです。
今回、情報の取得を行いたかったのは、「gpresult /R」を実行した際の「前回のグループポリシーの適用時間」の情報となります。
グループポリシーで適用されている設定については「HKEY_LOCAL_MACHINE\SOFTWARE\Policies」配下のレジストリの値を確認する方法等がありますが、今回のような「適用タイミング」や「どのようなポリシーによってそのレジストリが設定されているか」という情報については、Policies 配下の情報からは判断は難しいと思います。
今回、必要となる情報にてついては「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine」配下のレジストリから必要な情報の取得ができるようです。
「グループポリシーがいつ適用されたか?」については、「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}」配下の情報を使用することで取得できました。
このレジストリには次のような情報が格納されています。
「StartTimeHi」「StartTimeLo」の情報を使用することで日付を算出できるのですが、この成型方法については https://gist.github.com/MyITGuy/79497012ab8fd3eb33f3d64a48394278 で紹介されている方法を使うことで確認することができます。
([datetime]::FromFileTime(([Int64] ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeHi) -shl 32) -bor ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeLo)))
実際に取得した情報が、次の画像となります。
同様の日時が取得できていることが確認できます。
レジストリの「GPO-List」の値を使用することで、適用されているグループポリシーの情報を取得することもできます。
# レジストリから、適用されている GPO の情報を取得 $regGPOList = Get-ChildItem -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\GPO-List" $result = @() foreach ($gpo in $regGPOList){ if ((Get-ItemProperty -Path $GPO.PSPath).WQLFilterPass -eq 1){ $wmiGUID = [System.Text.RegularExpressions.Regex]::Match((Get-ItemProperty -Path $GPO.PSPath)."WQL-Id", 'MSFT_SomFilter\.ID="(?<prefix>.*?)(?<guid>.*)(?<domain>)".Domain=.*?') $result += [PSCustomObject]@{ "ComputerName" = $env:COMPUTERNAME "LastComputerGPOAppliedTime" = ([datetime]::FromFileTime(([Int64] ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeHi) -shl 32) -bor ((Get-ItemProperty -Path "Registry::HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Extension-List\{00000000-0000-0000-0000-000000000000}").startTimeLo))) # 上記はレジストリの情報をベースに確認した GPO の適用タイミングとなる。 # ポリシー単位で個別に管理されているわけではなく、コンピューター全体としての値となり、適用の成功 / 失敗まではハンドリングできない。 # https://gist.github.com/MyITGuy/79497012ab8fd3eb33f3d64a48394278 "No" = $gpo.PSChildName "DisplayName" = (Get-ItemProperty -Path $GPO.PSPath).DisplayName "GPO-Disabled" = (Get-ItemProperty -Path $GPO.PSPath)."GPO-Disabled" # "Version" = (Get-ItemProperty -Path $GPO.PSPath).Version "Version" = [System.BitConverter]::ToInt16(([System.BitConverter]::GetBytes((Get-ItemProperty -Path $GPO.PSPath).Version))[0..1], 0) "WQLFilterPass" = (Get-ItemProperty -Path $GPO.PSPath).WQLFilterPass # "WQL-Id" = (Get-ItemProperty -Path $GPO.PSPath)."WQL-Id" "WQLGUID" = $wmiGUID.Groups["GUID"].Value "WMIFilterName" = ($wmiFilterInfo | ? FilterGUID -eq $wmiGUID.Groups["GUID"].Value).FilterName "Result" = "Success" "Message" = "" } } } Write-Output $result | Out-GridView
それらしい情報にはなっているかと。
グループポリシーのメンテナンスを実施した際にリモートからポリシーの適用状況を確認するための方法として、このような方法が使えるのではないでしょうか。