Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

Windowsのレジストリ操作といえば、レジストリ エディター (regedit.exe) やコマンドライン ユーティリティの reg.exe) を思い浮かべる方が多いかもしれません。しかし、PowerShell を使えば、レジストリ キーや値の作成、変更、削除、検索、さらにはリモート コンピューターのレジストリへのアクセスまで、管理者向けの強力なツールセットとして活用できます。

PowerShell でレジストリをファイル システムのように操作する

PowerShell でレジストリを扱う感覚は、ローカル ディスク上のファイルやフォルダーを操作するのとよく似ています。異なるのは、レジストリ キーが「フォルダー」に、レジストリ値(パラメーター)が「ファイルのプロパティ」に相当する点です。

まず、利用可能なドライブ(PowerShell ドライブ)の一覧を表示してみましょう:

Get-PSDrive

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

ドライブ文字が割り当てられた通常のドライブのほか、レジストリ プロバイダー を通じて HKCU (HKEY_CURRENT_USER) と HKLM (HKEY_LOCAL_MACHINE) という特殊なドライブが見えます。これらを使って、通常のディレクトリと同じようにレジストリ ツリーを移動できます。HKLM:\HKCU:\ で各ハイブのルートにアクセスします。

cd HKLM:\
Dir -ErrorAction SilentlyContinue

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

こうして、ファイル/フォルダー管理用のコマンドレットをそのままレジストリ キーと値の操作に流用できます。

レジストリ キー自体を操作するには xxx-Item 系コマンドレットを使います:

  • Get-Item – レジストリ キーを取得
  • New-Item – 新しいレジストリ キーを作成
  • Remove-Item – レジストリ キーを削除

一方、レジストリ値(パラメーター)はキーのプロパティとして扱われるため、xxx-ItemProperty 系コマンドレットで管理します:

  • Get-ItemProperty – レジストリ値を取得
  • Set-ItemProperty – レジストリ値を変更
  • New-ItemProperty – 新しいレジストリ値を作成
  • Rename-ItemProperty – レジストリ値の名前を変更
  • Remove-ItemProperty – レジストリ値を削除

特定のレジストリ キーへ移動するには、例えば自動ドライバー更新の設定を持つキーへ以下のようにアクセスします:

cd HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
# または
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching

PowerShell でレジストリ値を取得する

レジストリ キーに格納される値は、入れ子になったオブジェクトではなく、そのキー自体のプロパティです。したがって、1 つのキーに複数の値を持たせることができます。

カレント キーの内容を一覧表示するには:

dir
# または
Get-ChildItem

このコマンドではサブキーの情報は表示されますが、カレント キー直下の値(プロパティ)である SearchOrderConfig は表示されません。

キー自体のプロパティ(値)を取得するには Get-Item を使います:

Get-Item .
# またはフル パスで
Get-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

この例では、DriverSearching キーに SearchOrderConfig という値(値は 1)が 1 つだけ存在していることがわかります。

値だけをピンポイントで取得するには Get-ItemProperty を使います:

$DriverUpdate = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching'
$DriverUpdate.SearchOrderConfig

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

これにより、SearchOrderConfig の値が 1 であることが確認できました。

PowerShell でレジストリ値を変更する

値を変更するには Set-ItemProperty を使用します。以下は SearchOrderConfig0 に変更する例です:

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0

変更が反映されたか確認します:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

新しいレジストリ キーまたは値を作成する

新しいキーを作成するには New-Item を使います。ここでは HKCU:\Control Panel\Desktop 配下に NewKey というキーを作成します:

$HKCU_Desktop = "HKCU:\Control Panel\Desktop"
New-Item -Path $HKCU_Desktop -Name NewKey

続けて、作成したキーの中に新しい値を追加します。型 REG_SZ(文字列)で、名前 SuperParamString、値 filetmp1.txt の値を作成する例:

New-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString" -Value "filetmp1.txt" -PropertyType "String"

指定可能なデータ型(PropertyType)は以下の通りです:

  • String (REG_SZ)
  • ExpandString (REG_EXPAND_SZ)
  • MultiString (REG_MULTI_SZ)
  • Binary (REG_BINARY)
  • DWord (REG_DWORD)
  • Qword (REG_QWORD)
  • Unknown (サポートされていない型)

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

レジストリ キーの存在を確認する

特定のキーが存在するかどうかを調べるには Test-Path を使います:

Test-Path 'HKCU:\Control Panel\Desktop\NewKey'

以下のスクリプトは、指定した値が存在しなければ新規作成する例です:

$regkey = 'HKCU:\Control Panel\Desktop\NewKey'
$regparam = 'testparameter'
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore) {
    Write-Host 'The registry entry already exists'
} else {
    New-ItemProperty -Path $regkey -Name $regparam -Value "woshub_test" -PropertyType "String"
}

Copy-Item を使えば、キーごと別の場所へコピーできます(サブキーごとコピーするには -Recurse を付けます):

$source = 'HKLM:\SOFTWARE\7-zip\'
$dest = 'HKLM:\SOFTWARE\backup'
Copy-Item -Path $source -Destination $dest -Recurse

レジストリ キーまたは値を削除する

値だけを削除するには Remove-ItemProperty を使います。先ほど作成した SuperParamString を削除する例:

$HKCU_Desktop = "HKCU:\Control Panel\Desktop"
Remove-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString"

キーごと(サブキーを含む全内容)削除するには Remove-Item-Recurse を付けます:

Remove-Item -Path $HKCU_Desktop\NewKey -Recurse

注意: -Recurse スイッチを指定すると、すべてのサブキーが再帰的に削除されます。

キー自体は残して中身だけ空にする場合:

Remove-Item -Path $HKCU_Desktop\NewKey\* -Recurse

レジストリ キーまたは値の名前を変更する

値の名前を変更するには Rename-ItemProperty を使います:

Rename-ItemProperty -Path 'HKCU:\Control Panel\Desktop\NewKey' -Name "SuperParamString" -NewName "OldParamString"

キーの名前を変更するには Rename-Item を使います:

Rename-Item -Path 'HKCU:\Control Panel\Desktop\NewKey' -NewName OldKey

PowerShell でレジストリを検索する

PowerShell を使えばレジストリ内を柔軟に検索できます。以下は HKCU:\Control Panel\Desktop 配下で、名前に dpi を含む値を探す例です:

$Path = (Get-ItemProperty 'HKCU:\Control Panel\Desktop')
$Path.PSObject.Properties | ForEach-Object {
    If ($_.Name -like '*dpi*') {
        Write-Host $_.Name ' = ' $_.Value
    }
}

特定の名前を持つキーを再帰的に検索する例(ここでは woshub を含むキー):

Get-ChildItem -Path HKLM:\ -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*woshub*" }

PowerShell でレジストリ キーのアクセス権を設定する

現在のアクセス権(ACL)を取得するには Get-Acl を使います(このコマンドレットは NTFS のアクセス権管理にも使えます):

$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
$rights.Access.IdentityReference

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

以下の例では、組み込みの「Users」グループに対して当該キーへの書き込み権限を付与しています:

# 現在の ACL を取得
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'

# 対象のユーザー/グループを指定
$idRef = [System.Security.Principal.NTAccount]"BuiltIn\Users"

# 付与する権限(キーへの書き込み)
$regRights = [System.Security.AccessControl.RegistryRights]::WriteKey

# 継承設定
$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None

# アクセス種別(Allow)
$acType = [System.Security.AccessControl.AccessControlType]::Allow

# アクセス ルールを作成
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)

# 現在の ACL にルールを追加
$rights.AddAccessRule($rule)

# 新しい ACL を適用
$rights | Set-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'

PowerShellでレジストリを操作する:キーと値の取得・変更・作成・削除

ACL に「Users」グループが追加されたことが確認できます。

リモート コンピューターのレジストリ値を取得する

PowerShell ではリモート コンピューターのレジストリにもアクセスできます。主に 2 つの方法があります。

方法 1: WinRM (Invoke-Command / Enter-PSSession) を使用

リモート セッション経由でコマンドを実行します:

Invoke-Command -ComputerName srv-fs1 -ScriptBlock { Get-ItemProperty -Path 'HKLM:\System\Setup' -Name WorkingDirectory }

方法 2: .NET のリモート レジストリ接続を使用

リモート レジストリ サービス (RemoteRegistry) が有効な場合に利用できます:

$Server = "lon-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey = $Reg.OpenSubKey("System\Setup")
$RegValue = $RegKey.GetValue("WorkingDirectory")

ヒント: ドメイン参加済みの複数のコンピューターで同じレジストリ設定を展開する場合は、グループ ポリシー (GPO) を利用するのがより効率的です。

以上、PowerShell を用いた Windows レジストリの典型的な操作例を紹介しました。これらを自動化スクリプトに組み込んで、効率的なシステム管理にお役立てください。

  1. Macのキーボードのキーを外す・掃除・交換する方法とキー配列の変更手順

    iMac、Mac、MacBookのキーボードからキーを取り外し、掃除・修理・交換する方法を、初心者にもわかりやすく解説します。さらに、macOSの設定や無料ツールを使ってキーの機能を入れ替える(リマップする)方法もご紹介します。 「Macのキーボードからキーを外して、後で元に戻すにはどうすればいいですか?コーヒーをこぼしてしまったので、中を掃除したいのです。せっかくなので、汚れたり傷んだりしたキーも新しいものに交換したいと思っています。」 Macのキーの移動や交換は、大きく分けて2つのケースがあります。1つ目は、キーボードのハードウェアとしてキーを物理的に移動・交換する場合です。例えば、US配

  2. Windowsレジストリエディターでキーと値を追加・変更・削除する方法【初心者向け完全ガイド】

    レジストリエディターは、Windowsパソコンの背骨とも呼ばれる重要な存在です。インストールされたプログラムやハードウェアに関する情報、設定、オプションなど、さまざまな値が格納されています。一般ユーザーがレジストリエディターを直接操作することはほとんどありませんが、Windowsの高度な設定に精通している上級者であれば、その扱い方を知っているはずです。 エラーを修正する際に、レジストリエディターでサブキーや値の追加・削除が必要になることがあります。しかし、「レジストリエディターでの変更を求められたら少し緊張する」という方は多いのではないでしょうか。「わずかなミスがシステム全体を壊し、パソコンを