レジストリをいじるのは本当に面倒な作業です。特にregedit.exeやreg.exeコマンドのようなグラフィカルツールに慣れているとなおさらです。PowerShellはまさに隠れた名器です。最初は少し戸惑うかもしれませんが、一度使いこなせば、その強力さに驚くでしょう。さらに、スクリプト作成やリモート管理も可能なので、複数のマシンを操作したり、自動化したりする必要がある場合には非常に便利です。問題は、多くの人がPowerShellを使ってレジストリキーやパラメータを操作、読み取り、変更、さらには作成できることに気づいていないことです。しかも、使い慣れたコマンドはPC上のファイル操作に似ています。
このガイドは、これらのコマンドの使い方を習得するのに役立つはずです。そうすれば、次回レジストリを微調整する必要があるときに、regeditを開いてあれこれクリックする手間を省くことができます。キーの検索、値の変更、新規キーの作成、さらには権限の設定まで、すべてコマンドラインから実行できるようになります。トラブルシューティング、修正の自動化、複数のコンピューターへの設定の展開などに役立ちます。ただし、レジストリ設定をいじると、注意しないとシステムが壊れてしまう可能性があるため、事前にバックアップしておくことをお勧めします。
PowerShell を使用して Windows のレジストリ エントリを管理する方法
PowerShell を使用して Windows レジストリをファイルシステムのように操作する
レジストリを単なるファイルシステムとして考えると分かりやすいのですが、実際のファイルではなくレジストリキーと値なので、少し奇妙に感じます。PowerShellを起動し、次のコマンドでドライブの一覧を表示できます。
get-psdrive
これらのドライブの中には、レジストリハイブを表す特別なドライブ、 HKCU(HKEY_CURRENT_USER)とHKLM (HKEY_LOCAL_MACHINE)があります。これらのドライブを操作するのは、ディレクトリを変更するのと似ています。
cd HKLM:\
または特定のパスへ:
cd HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
設定によっては、そのコマンドでエラーが発生する場合があるため、以下も試してください。
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
そこから、キーとそのプロパティの管理はファイルの操作と全く同じです。キーを参照または削除するには、、、などのコマンドを使用しますGet-Item。レジストリパラメータはプロパティと同様に扱われますNew-Item。Remove-Item
Get-ItemProperty値を読み取るSet-ItemPropertyそれらを変えるためにNew-ItemProperty新しいものを作るRename-ItemProperty既存のパラメータの名前を変更する
また、キー全体を でコピーすることもできますCopy-Item。設定セットをバックアップまたは複製するときに便利です。
$source='HKLM:\SOFTWARE\7-zip\' $dest='HKLM:\SOFTWARE\backup' Copy-Item -Path $source -Destination $dest -Recurse
PowerShell でレジストリパラメータ値を取得する
レジストリキー内の特定の値(ネストされたオブジェクトではない)を取得したい場合は、 を使用しますGet-ItemProperty。例えば、現在のキーの内容を確認するには、次のようにします。
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching'
指定したキー内で利用可能なすべてのパラメータが一覧表示されます。SearchOrderConfigの値だけを取得するには、次のようにします。
$val = Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig $val. SearchOrderConfig
通常、1 や 0 などの数値が返され、何らかの設定を制御します。もしそれがおかしい場合は、値が期待通りかどうかを確認してください。あるマシンではすぐに動作するのに対し、別のマシンでは動作が不安定な場合があり、その場合は権限を再確認したり、パスが正しいことを確認したりする必要があります。
PowerShell でレジストリ値を変更する
レジストリ値を 1 から 0 へ、あるいはその逆へ切り替えるのは、 を使えば簡単ですSet-ItemProperty。例えば、
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0
実行後、動作したかどうかを再確認します。
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig
注:権限やUACの不具合により変更がブロックされることがあります。変更が行われない場合は、PowerShellを管理者として実行することを検討してください。環境によっては、これらのコマンドが失敗したり、実行後にシステムの再起動が必要になったりする場合がありますので、その場合は驚かないでください。
PowerShell を使用して新しいレジストリ キーまたはパラメーターを作成する方法
新しいキーを追加する必要がある場合は、New-Item友達に連絡してください。
$HKCU_Desktop='HKCU:\Control Panel\Desktop' New-Item -Path $HKCU_Desktop -Name 'NewKey'
そのキー内に新しいパラメータ(特に文字列値)を追加するには、 を使用しますNew-ItemProperty。例えば、値を持つ文字列パラメータ「SuperParamString」を作成するには、次のようにします。
New-ItemProperty -Path "$HKCU_Desktop\NewKey" -Name 'SuperParamString' -Value 'filetmp1.txt' -PropertyType 'String'
PowerShellは、REG_SZ(文字列)、REG_DWORD、REG_QWORDなど、様々なデータ型をサポートしています。regeditやレジストリにすぐに表示されない場合は、念のため更新が必要になる場合があります。
作成前にキーが存在するかどうかを確認したいですか?Test-Path次の手順に従ってください:
Test-Path 'HKCU:\Control Panel\Desktop\NewKey'
キーが存在しない場合にのみスクリプトでキーを作成する場合は、if ステートメントと組み合わせます。
$regkey='HKCU:\Control Panel\Desktop\NewKey' $regparam='testparameter' if (!(Test-Path $regkey)) { New-Item -Path $regkey } if (-not (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore)) { New-ItemProperty -Path $regkey -Name $regparam -Value 'woshub_test' -PropertyType 'String' }
ほとんどの場合、次の手順に従って、レジストリ キーをコピーまたはバックアップしておくと便利です。
$source='HKLM:\SOFTWARE\7-zip\' $dest='HKLM:\SOFTWARE\backup' Copy-Item -Path $source -Destination $dest -Recurse
レジストリキーまたはパラメータを削除する方法
不要になったパラメータを削除するには、Remove-ItemProperty次のようにします。
$HKCU_Desktop='HKCU:\Control Panel\Desktop' Remove-ItemProperty -Path "$HKCU_Desktop\NewKey" -Name 'SuperParamString'
キー全体とそのすべてのサブキーを削除する場合(この場合は非常に注意が必要です)は、次のようにします-Recurse。
Remove-Item -Path "$HKCU_Desktop\NewKey" -Recurse
繰り返しになりますが、特に実稼働環境では、このようなコマンドを実行する前に必ずパスを再確認してください。
レジストリパラメータまたはキーの名前を変更する方法
名前の変更はコマンドとして直接サポートされていませんが、コピーしてから削除することで可能です。パラメータの場合は、以下の手順で変更できます。
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 を使用して特定のパラメーターまたはキーを検索できます。
$props = Get-ItemProperty 'HKCU:\Control Panel\Desktop' $props. PSObject. Properties | ForEach-Object { if ($_. Name -like '*dpi*') { Write-Host "$($_. Name) = $($_. Value)" } }
または、ハイブ全体で特定の名前を持つキーを検索するには、次のようにします。
Get-ChildItem -Path HKLM:\ -Recurse -ErrorAction SilentlyContinue | Where-Object { $_. Name -like "*woshub*" }
はい、レジストリ全体の検索は時間がかかり、面倒ですが、隠された設定や忘れられた設定が見つかることもあります。
PowerShell でレジストリ キーのアクセス許可を設定する
権限の変更はリスクを伴いますが、変更が必要なキーにアクセスできなくなってしまった場合など、必要な場合もあります。現在の権限を確認するには、以下の手順に従ってください。
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
BuiltIn\Usersグループに書き込みアクセス権を付与するには、次のようなルールを設定します。
$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 $acType = [System. Security. AccessControl. AccessControlType]::Allow $rule = New-Object System. Security. AccessControl. RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType) $rights. AddAccessRule($rule) $rights | Set-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
ご注意ください!ACL をいじりすぎると、権限設定を間違えると逆効果になる可能性があります。必ず変更内容を確認してください。
リモートコンピュータのレジストリ値にアクセスする
リモートレジストリアクセスは、時に命綱となることがあります。PowerShellを使えば、RemoteRegistryサービスが有効になっている限り、別のマシンでコマンドを実行できます。例えば:
Invoke-Command -ComputerName srv-fs1 -ScriptBlock {Get-ItemProperty -Path 'HKLM:\System\Setup' -Name WorkingDirectory}
物理またはリモート PowerShell アクセスだけでは不十分な場合は、リモート レジストリに直接接続することもできますが、サービスが実行されている必要があります。
$Server='lon-fs1' $reg = [Microsoft. Win32. RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server) $regKey = $reg. OpenSubKey('System\Setup') $regValue = $regKey. GetValue('WorkingDirectory')
このアプローチはより複雑ですが、手動で調べる必要がなく、ドメイン マシン間でスクリプトを作成するのに便利です。
全体的に見て、PowerShell を使うとレジストリ管理がはるかに容易になります。最初は少し戸惑うかもしれませんが。ただし、入力ミス一つで大変なことになる可能性があるので、まずはバックアップを取るか、重要でないマシンでテストすることを忘れないでください。しかし、一度慣れてしまえば、レジストリ調整の自動化はあっという間にできるようになります。