SE の雑記

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

コンピューターのグループポリシーの情報をレジストリから取得する

leave a comment

グループポリシーの適用状況を確認する際に「gpresult /R」や「rsop.msc」を使って情報の確認をすることがあるかと思います。

リモートからグループポリシーの適用状況を確認しようとした場合、これら以外の方法で取得できないかを考えたところ、「コンピューターのグループポリシー」であれば、レジストリからも情報が取得することができるようです。

今回、情報の取得を行いたかったのは、「gpresult /R」を実行した際の「前回のグループポリシーの適用時間」の情報となります。
image
グループポリシーで適用されている設定については「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}」配下の情報を使用することで取得できました。
このレジストリには次のような情報が格納されています。
image
「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)))

 
実際に取得した情報が、次の画像となります。
image
同様の日時が取得できていることが確認できます。
レジストリの「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

 
それらしい情報にはなっているかと。
image
グループポリシーのメンテナンスを実施した際にリモートからポリシーの適用状況を確認するための方法として、このような方法が使えるのではないでしょうか。

Share

Written by Masayuki.Ozawa

8月 12th, 2019 at 3:52 pm

Posted in Windows Client,Windows Server

Tagged with ,

Leave a Reply