メモがてらの小ネタ集です。
HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER以外のキーを扱う
デフォルトの状態ではPowerShellから扱えるレジストリキー(PSDrive)はHKEY_LOCAL_MACHINE
とHKEY_CURRENT_USER
の2つだけです。
Get-PSDrive
でレジストリプロバイダーを確認すると以下の様な結果を返します。
PS C:\> Get-PSDrive -PSProvider Registry
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
HKEY_LOCAL_MACHINE
、HKEY_CURRENT_USER
以外のキーを扱うにはNew-PSDrive
コマンドレットで新しいPSDriveを作成する必要があります。
例えばHKEY_USERS
キーを扱うには以下の様にしてPSDriveを作成します。
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
PSDriveが作成されればあとはHKEY_LOCAL_MACHINE
、HKEY_CURRENT_USER
と同様にレジストリを操作できます。
実行例は以下の様な感じになります。
# HKEY_USERSをルートとしたPSDriveを作成 PS C:\> New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS Name Used (GB) Free (GB) Provider Root ---- --------- --------- -------- ---- HKU Registry HKEY_USERS # ローカルシステムアカウント(.DEFAULT)のレジストリキーを参照 PS C:\> ls HKU:\.DEFAULT Hive: HKEY_USERS\.DEFAULT Name Property ---- -------- Control Panel Environment TMP : C:\Users\Administrator\AppData\Local\Temp TEMP : C:\Users\Administrator\AppData\Local\Temp EUDC Keyboard Layout Printers Software
ちなみに、作成したPSDriveはセッション終了と共に無くなり永続化はされません。
New-PSDrive
には-Persist
オプションがあるのですが、これはネットワークドライブ専用でレジストリには適用できません。
永続化したい場合はプロファイルにNew-PSDrive
の呼び出しを仕込むなどして永続化している様に見せかけるしかない様です。
既定のキーを扱う
こいつはググればいろいろなサイトに載っていますが、メモ程度に本エントリでも記載しておきます。
PowerShellからレジストリの既定のキーを扱うには名前を(default)
にすればOKです。
実行例は以下の様な感じです。
# 既定のキーの値を取得 PS C:\> Get-ItemProperty -Path HKCU:\Software\MyApp -Name "(Default)" (default) : 既定のキーの値 PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MyApp PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software PSChildName : MyApp PSDrive : HKCU PSProvider : Microsoft.PowerShell.Core\Registry
ハイブファイルを扱う
Default
ユーザーやログインしていないユーザーのレジストリキーを扱う場合はハイブファイルをロードする必要があります。
PowerShell標準の機能ではハイブファイルをロードすることは出来ず、従来通りreg.exe
を使わなければいけません。
reg load [ロード先] [ハイブファイル]
でハイブをロード、操作が終わった後はreg unload [ハイブファイル]
でアンロードしてハイブを閉じます。
スクリプトとしては以下の様な感じになります。
# デフォルトユーザーのレジストリキーを編集するサンプル $RegFile = Join-Path (Split-Path $env:USERPROFILE -Parent) "default\NTUSER.dat" $RegRoot = "HKLM\DefaultUser" try { # Hiveをロード reg.exe load "$RegRoot" "$RegFile" if( -not $? ) { throw "Hiveのロードに失敗" } #コマンドを適当に } finally { # Hiveをアンロード reg.exe unload "$RegRoot" }