Windows TIPS
[System Environment]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

グループ・ポリシーの最終適用日時をレジストリから取得する

解説をスキップして操作方法を読む

デジタルアドバンテージ 島田 広道
2009/01/30
対象OS
Windows 2000
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
グループ・ポリシーを更新しても、それが各コンピュータに正しく適用されずに失敗することがある。
こんなとき、対象のグループ・ポリシーが最後に適用された日時を確認できると、調査範囲を絞り込んで原因究明までの時間を短縮しやすくなる。
グループ・ポリシーの最終適用日時を確認するには、クライアント側拡張(CSE)ごとにレジストリに格納されている値を取得すればよい。

解説

 グループ・ポリシーを更新して何らかの設定を変更した際、クライアントPCにその変更が正しく適用されない、というトラブルが生じることがある。グループ・ポリシーの動作がドメイン・コントローラやActive Directory、ネットワーク、クライアントPCという広い範囲にまたがっているため、トラブル原因を解明するには幅広く調査することになりがちだ。

 なるべく迅速に原因をつかむには、トラブル対象のグループ・ポリシーの適用処理が「いつ」行われたかを把握し、調査対象を絞り込むとよい。例えば、この最終適用日時がグループ・ポリシーの更新日時より前の場合、なぜ適用処理が実行されなかったのか、という点に焦点を当てて調査できる。逆であっても、関連するログ・ファイルから最終適用日時の付近に絞り込んで調査できる。

グループ・ポリシーのクライアント側拡張(CSE)(基礎解説)

 このグループ・ポリシーの最終適用日時は、実際にコンピュータ上で適用処理を行うクライアント側拡張(CSE)ごとに、特定のレジストリ・キーに保存されている。そのためレジストリ・エディタやreg.exeコマンドなどで、ローカルはもちろんリモートでも容易に情報を収集できる。本稿では、そのキーのパスや、値から日時を取得する方法について説明する。

 なお、ポリシーの結果セット(rsop.msc)でもCSEごとの最終処理日時と思われる情報は収集できる([コンピュータの構成]または[ユーザーの構成]のプロパティの[エラー情報]タブ−[詳細]欄に表示される)。しかし、調べた限りでは、実際のグループ・ポリシーの最終適用日時と異なる日時が表示される場合があったため、今回はレジストリからの取得方法のみ紹介している。

操作方法

レジストリ・キーから最終適用日時を取得する

 グループ・ポリシーの最終適用日時は、CSE(クライアント側拡張)ごとにクライアントPCのレジストリ・キーに格納されている。もし、対象のグループ・ポリシーを処理するCSEが分からない場合は、基礎解説「グループ・ポリシーのしくみ 第2回 グループ・ポリシーとは何か 5.クライアント側拡張(CSE)」で確認していただきたい。

 格納先のレジストリ・キーの名前には、各CSEに割り当てられた固有のGUIDが用いられているので、下表から対象CSEのGUIDすなわちキー名を特定する。

CSEの名称 CSEのGUID
ワイヤレス・ネットワーク {0ACDD40C-75AC-47ab-BAA0-BF6DE7E7FE63}
フォルダのリダイレクト {25537BA6-77A8-11D2-9B6C-0000F8080861}
管理用テンプレート(レジストリ) {35378EAC-683F-11D2-A89A-00C04FBBCFA2}
ディスクのクォータ {3610eda5-77ef-11d2-8dc5-00c04fa31a66}
QoSパケット・スケジューラ {426031c0-0b47-4852-b0ca-ac3d37bfcb39}
スクリプト {42B5FAAE-6536-11d2-AE5A-0000F87571E3}
Internet Explorerのゾーン・マッピング {4CFB60C1-FAA6-47f1-89AA-0B18730C9FD3}
セキュリティ {827D319E-6EAC-11D2-A4EA-00C04F79F83A}
Internet Explorerのブランド化 {A2E30F80-D7DE-11d2-BBDE-00C04F86AE3B}
暗号化ファイル・システム(EFS)の回復 {B1BE8D72-6EAC-11D2-A4EA-00C04F79F83A}
オフライン・フォルダ {C631DF4C-088F-4156-B058-4375F0853CD8}
ソフトウェアのインストール(アプリケーションの管理) {c6dc5466-785a-11d2-84d0-00c04fb169f7}
IPSec(IPセキュリティ) {e437bc1c-aa7d-11d2-a382-00c04f991e27}
主要なCSEとそのGUID

 特定したGUIDで下表の<CSEのGUID>を置き換えると、参照すべきキーと値が決まる。Windows Server 2003以前とWindows Vista以降でキーのパスが異なる点に注意すること。

項目 OS 内容
キー Windows 2000/
Windows XP/
Windows Server 2003
HKLMまたはHKCU、HKU\<SID>
SOFTWARE\Microsoft\Windows NT\CurrentVersion\
Winlogon\GPExtensions\<CSEのGUID>
Windows Vista/
Windows Server 2008
HKLMまたはHKCU、HKU\<SID>
SOFTWARE\Microsoft\Windows\CurrentVersion\
Group Policy\Status\GPExtensions\<CSEのGUID>
値の名前 LastPolicyTime
REG_DWORD
値の内容 最終適用日時(1980年1月1日 0時0分からの分単位のシリアル値)
グループ・ポリシーの最終適用日時が格納されているレジストリ・キー
ルート・キーはコンピュータ用ポリシーなら「HKLM」、ユーザー用ポリシーなら「HKCU」(ログオン中のユーザー)または「HKU\<SID>」(特定ユーザー)を指定する。<CSEのGUID>には、そのCSEに割り当てられた固有のGUIDが入る。最終適用日時はシリアル値で格納されており、後述の変換プログラムで実際の日時に変換する必要がある。

 CSEによっては、上記のキーにLastPolicyTimeが存在しない場合がある。これは、そのCSEによる適用処理対象のグループ・ポリシーが存在しないか、あるいはまったく適用されたことがないためだ。

読める形式で最終適用日時を表示する

 こうして取得できたLastPolicyTimeのデータは、1980年1月1日 0時0分を基準とした分単位のシリアル値のため、そのままでは日時を読み取れない。そこでLastPolicyTimeを一般的な日時表記に変換するVBScriptプログラムのサンプルを用意したので参考にしていただきたい。VBScriptの書き方や実行方法などについては、基礎解説「チェック式 WSH入門」や運用「Windows管理者のためのWindows Script Host入門」を参照していただきたい。

Option Explicit

Dim lngLastPolTime, dtmDateUTC, dtmDate, intHour, intMin
Const dtmBaseDate = #1980/1/1# '基準日
Const intTimeDiff = 9 '時差(+9:00)

'引数の確認
If WScript.Arguments.Count <> 1 Then
    WScript.Echo "LastPolicyTimeの10進数値を引数に指定してください"
    WScript.Quit
End If
If Not IsNumeric(WScript.Arguments.Item(0)) Then
    WScript.Echo "LastPolicyTimeは10進数値で指定してください"
    WScript.Quit
End If
lngLastPolTime = CLng(WScript.Arguments.Item(0))

'日時の変換
intMin = lngLastPolTime mod 60 '分
intHour = (lngLastPolTime \ 60) mod 24 '時
dtmDateUTC = CDate(lngLastPolTime \ (24 * 60)) + dtmBaseDate + _
    TimeValue(CStr(intHour) & ":" & CStr(intMin) & ":00") '補正前
dtmDate = DateAdd("h", intTimeDiff, dtmDateUTC) '補正後

'日時の表示
WScript.echo FormatDateTime(dtmDate, 2), _
    FormatDateTime(dtmDate, 4)
LastPolicyTimeを一般的な日時表記に変換するVBScriptのプログラム
第1引数をLastPolicyTimeと見なして、「年/月/日 時:分」形式に変換・表示するだけの簡単なスクリプトだ。これをLastPolicyTime.vbsなどというファイル名で保存し、LastPolicyTimeの10進数値を引数に指定して実行する。時差が+9:00(日本標準時)以外の地域では、intTimeDiff変数の値を変更していただきたい。

 これを、例えばLastPolicyTime.vbsというファイル名で保存し、次のようにLastPolicyTimeの10進数値を引数に指定して実行すると、最終適用日時が表示される。End of Article

C:\> cscript LastPolicyTime.vbs //Nologo 15294216
2009/01/29 08:36
変換プログラムの実行および出力の例
cscript.exeを使ってコンソールの標準出力に変換結果を出力している。
LastPolicyTimeはこの「15294216」のように10進数値で指定する。なお「//Nologo」はcscriptにロゴ表示を止めさせるオプション。
「15294216」が日時表記に変換された結果。もともとのデータが分単位なので、秒は出力していない。

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間