しばたテックブログ

気分で書いている技術ブログです。

PowerShellでレジストリ操作する小ネタ

メモがてらの小ネタ集です。

HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER以外のキーを扱う

デフォルトの状態ではPowerShellから扱えるレジストリキー(PSDrive)はHKEY_LOCAL_MACHINEHKEY_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_MACHINEHKEY_CURRENT_USER以外のキーを扱うにはNew-PSDriveコマンドレットで新しいPSDriveを作成する必要があります。
例えばHKEY_USERSキーを扱うには以下の様にしてPSDriveを作成します。

New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS

PSDriveが作成されればあとはHKEY_LOCAL_MACHINEHKEY_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です。

実行例は以下の様な感じです。

f:id:stknohg:20151204193843p:plain

# 既定のキーの値を取得
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"
}