【Managemnt】WS2008 R2:ADMXファイルを作らずに業務アプリのレジストリ設定をグループポリシー化する

タイトルからでは意味がわかりずらいですね。というか完全に意味不明ですね…。すみません。

面白い機能なので早くお伝えしようとしていたのですが、そう思いつつ2ヶ月が経過してしまいました。

少し前に、USのグループポリシーチームBLOGに以下の投稿がありました。

Set a registry key value from the command line using Group Policy PowerShell cmdlets
https://blogs.technet.com/grouppolicy/archive/2009/04/01/set-a-registry-key-value-from-the-command-line-using-group-policy-cmdlets.aspx

曰く…

たとえばこんなシチュエーションを考えます。

  • クライアントに業務アプリケーションがインストールされている
  • 業務アプリの環境設定はレジストリで持っている
  • 業務アプリの環境変更は、レジストリを直接変更することで行っている
  • 業務アプリの利用者が間違えて環境を変えてしまう(レジストリが変わってしまう)ことがある
  • 本当は、ADMXファイルを作って、業務アプリの環境設定をグループポリシーに組み込みたい
  • そうすれば定期的に設定値がリフレッシュされることはわかっている
  • が、ADMXファイルを作るのは面倒…orz

さぁ、こんなときにどうしましょう?と。

上にも書かれているとおり、グループポリシーの良いところは「定期更新」機能があるところです。デフォルトでは90分に1回、バックエンドで再適用してくれるため、ユーザーが設定を変えてしまっても一定時間経過すれば管理者が意図した設定値に戻してくれます。更新間隔は変更することができますから、極端ですが1分に1回再適用なんてことも可能です。

ちなみに、更新間隔の変更は以下のノードで設定できます。

  • [コンピュータの構成]-[ポリシー]-[管理用テンプレート]-[システム]-[グループポリシー]-[コンピュータのグループポリシーの更新間隔]
  • [ユーザーの構成]-[ポリシー]-[管理用テンプレート]-[システム]-[グループポリシー]-[ユーザーのグループポリシーの更新間隔]

その恩恵にあずかるには、業務アプリ用の ADMXファイル を作成しなければなりません。

でも、書式を勉強しなければならないため、ちょいと面倒です。

こで、Windows Server 2008 R2 GPMC で提供されている グループポリシー用の PowerShellコマンドレットを使用します。

その名も set-GPRegistryValue  です。

これを使うには手順を踏まなければならないので、以下にStep-By-Stepで書きます。

1.Windows Server 2008 R2 で PowerShell プロンプトを開く

グループポリシーを操作するので管理者モードで開いてください。

2.Group Policy用のコマンドレットをインポートする

規定のままでは set-GPRegistryValue は使用できません。まずは、GroupPolicy関連のコマンドレットをインポートする必要があります。以下のコマンドを、プロンプトから入力してください。

PS C:\> Import-Module GroupPolicy –verbose
image

上の画面のように、インポートされたコマンドレットの一覧が表示されればOKです。念のために、
Get-Command *-GP* で Group Policy 関連のコマンドレットが参照できるかどうか確認してみましょう。以下のように、全部で25個のコマンドレットが表示されるはずです。

PS C:\> Get-command *-GP*

CommandType Name Definition ----------- ---- ---------- Cmdlet Backup-GPO Backup-GPO -Guid <Guid> -Pat... Cmdlet Copy-GPO Copy-GPO -SourceGuid <Guid> ... Cmdlet Get-GPInheritance Get-GPInheritance [-Target] ... Cmdlet Get-GPO Get-GPO [-Guid] <Guid> [[-Do... Cmdlet Get-GPOReport Get-GPOReport [-Guid] <Guid>... Cmdlet Get-GPPermissions Get-GPPermissions -Guid <Gui... Cmdlet Get-GPPrefRegistryValue Get-GPPrefRegistryValue -Gui... Cmdlet Get-GPRegistryValue Get-GPRegistryValue -Guid <G... Cmdlet Get-GPResultantSetOfPolicy Get-GPResultantSetOfPolicy [... Cmdlet Get-GPStarterGPO Get-GPStarterGPO -Guid <Guid... Cmdlet Import-GPO Import-GPO -BackupId <Guid> ... Cmdlet New-GPLink New-GPLink -Guid <Guid> -Tar... Cmdlet New-GPO New-GPO [-Name] <String> [-C... Cmdlet New-GPStarterGPO New-GPStarterGPO [-Name] <St... Cmdlet Remove-GPLink Remove-GPLink -Guid <Guid> -... Cmdlet Remove-GPO Remove-GPO -Guid <Guid> [-Do... Cmdlet Remove-GPPrefRegistryValue Remove-GPPrefRegistryValue [... Cmdlet Remove-GPRegistryValue Remove-GPRegistryValue [-Gui... Cmdlet Rename-GPO Rename-GPO -Guid <Guid> -Tar... Cmdlet Restore-GPO Restore-GPO -BackupId <Guid>... Cmdlet Set-GPInheritance Set-GPInheritance [-Target] ... Cmdlet Set-GPLink Set-GPLink -Guid <Guid> -Tar... Cmdlet Set-GPPermissions Set-GPPermissions -Guid <Gui... Cmdlet Set-GPPrefRegistryValue Set-GPPrefRegistryValue -Gui... Cmdlet Set-GPRegistryValue Set-GPRegistryValue -Guid <G...

PS C:\>

これらのコマンドレットは、グループポリシー管理機能がインストールされたWindows Server 2008 R2 だけでなく、RSAT(の中のグループポリシー管理ツール)がインストールされたWindows 7でも使用することができます。

(余談)Windows 7 RC にグループポリシー管理ツールを入れた場合には、規定のモジュールとして組み込まれるようです。つまり、Import-Module しなくても使えました。

ちなみに、Import-Module でロードしたモジュールは、現在のPowerShellセッションのみで有効となるため、毎回 Import-Module を行う必要があります。毎回自動的にImport-Moduleするには、プロファイルに書き込んでおく必要があります。

3.set-GPRegistryValue を使用してレジストリの値を設定する

これで Set-GPRegistryValue コマンドレットが使えるようになりました。

ではさっそく、業務に必要なレジストリ設定を行ってみます。仮に、以下のレジストリ設定が必要であると想定します。

キーのパス:HKEY_CURRENT_USER\Software\MyApp
値の名前 :InstallPath
値のタイプ:REG_SZ
値 :C:\Program Files\MyApp

これをグループポリシーの一部として組み込むには、以下のコマンドをPowerShellのプロンプトから入力します。

PS C:\> Set-GPRegistryValue -Name TestPolicy -Key "HKEY_CURRENT_USER\Software\My App" -ValueName "Installpath" -Value "C:\Program Files\MyApp" -Type String

DisplayName : TestPolicy DomainName : demodomain.com Owner : DEMODOMAIN\Domain Admins Id : 1eeb4b61-df4f-48eb-8e71-eb15d79bd855 GpoStatus : AllSettingsEnabled Description : CreationTime : 2009/06/01 11:48:21 ModificationTime : 2009/06/01 12:09:10 UserVersion : AD Version: 3, SysVol Version: 3 ComputerVersion : AD Version: 2, SysVol Version: 2 WmiFilter :

PS C:\>

赤い文字で書かれている「TestPolicy」とは、すでに存在するGPOの名前です。レジストリの設定をポリシーの一部として組み込むわけですから、どのポリシーに組み込むかを指定する必要があります。

「-Type String」 は値のタイプです。今回は Reg_SZ を意味する String を指定しました。このほかに、ExpandString、Binary、DWord、MultiString、QWord を指定することができます。詳しくは、Get-Help Set-GPRegistryValue でヘルプを参照してください。

以上で設定は完了です。複数のレジストリ値が存在する場合には同じ処理を繰り返せばよいわけです。

この操作によって、SYSVOL配下のPoliciesフォルダに格納されているGPOに、上記の設定が書き込まれます。

image

しばらくすると、上で設定した値が実際のレジストリに反映されます。強制的に反映したい場合には、従来通り、コマンドプロンプト(PSプロンプトでもOKです)から gpupdate /force を実行しましょう。

image

レジストリエディタ上からこのエントリを消したり変更しても、バックグラウンド更新機能によって強制的に値が書き戻されます。

4. 設定されている値を確認する

設定されている値を確認するには、Get-GPRegistryValue を使用します。

PS C:\> Get-GPRegistryValue -Name testpolicy -Key "hkey_local_machine\software\myapp"

KeyPath : software\myapp FullKeyPath : HKEY_LOCAL_MACHINE\software\myapp Hive : LocalMachine PolicyState : Set Value : C:\Program Files\MyApp

PS C:\>

設定した値は、あとで削除したり無効にしたくなることもあります。

その方法については次回。