Windows TIPS
[System Environment]
グループ・ポリシーの最終適用日時をレジストリから取得する
→ 解説をスキップして操作方法を読む
デジタルアドバンテージ 島田 広道
2009/01/30
対象OS
Windows 2000
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
■
グループ・ポリシーを更新しても、それが各コンピュータに正しく適用されずに失敗することがある。
■
こんなとき、対象のグループ・ポリシーが最後に適用された日時を確認できると、調査範囲を絞り込んで原因究明までの時間を短縮しやすくなる。
■
グループ・ポリシーの最終適用日時を確認するには、クライアント側拡張(CSE)ごとにレジストリに格納されている値を取得すればよい。
グループ・ポリシーを更新して何らかの設定を変更した際、クライアントPCにその変更が正しく適用されない、というトラブルが生じることがある。グループ・ポリシーの動作がドメイン・コントローラやActive Directory、ネットワーク、クライアントPCという広い範囲にまたがっているため、トラブル原因を解明するには幅広く調査することになりがちだ。
なるべく迅速に原因をつかむには、トラブル対象のグループ・ポリシーの適用処理が「いつ」行われたかを把握し、調査対象を絞り込むとよい。例えば、この最終適用日時がグループ・ポリシーの更新日時より前の場合、なぜ適用処理が実行されなかったのか、という点に焦点を当てて調査できる。逆であっても、関連するログ・ファイルから最終適用日時の付近に絞り込んで調査できる。
このグループ・ポリシーの最終適用日時は、実際にコンピュータ上で適用処理を行うクライアント側拡張(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進数値を引数に指定して実行すると、最終適用日時が表示される。
C:\> cscript LastPolicyTime.vbs //Nologo 15294216
2009/01/29 08:36
変換プログラムの実行および出力の例
cscript.exeを使ってコンソールの標準出力に変換結果を出力している。
LastPolicyTimeはこの「15294216」のように10進数値で指定する。なお「//Nologo」はcscriptにロゴ表示を止めさせるオプション。
「15294216」が日時表記に変換された結果。もともとのデータが分単位なので、秒は出力していない。
この記事と関連性の高い別のWindows TIPS
generated by
TechTargetジャパン
Windows Server Insider フォーラム 新着記事
キャリアアップ
**先週の人気講座ランキング**
〜 Android編 〜