レジストリ値を取得するPowerShell:チュートリアルウォークスルー

この記事では、PowerShellを使用してレジストリ値を取得し、さまざまな方法でレジストリのエントリをクエリする方法について学びます。

さあ始めましょう!

前提条件

この記事のすべての例は、この記事が公開された時点で最新バージョンであるPowerShell 7.1を使用してデモンストレーションされます。また、Windows PowerShell 5.1を選択して使用することもできます。また、PowerShellドライブの基本的な理解を持っている必要があります。

管理者特権なしでは一部の例が動作しない場合があります。

Get-ChildItemを使用してレジストリキーと値を取得する

レジストリキーや値を検索する最も簡単な方法の1つは、Get-ChildItemコマンドレットを使用することです。これにより、PowerShellドライブの項目を列挙することで、PowerShellを使用してレジストリ値などを取得することができます。この場合、そのPowerShellドライブはGet-PSDriveを実行して見つかるHKLMドライブです。

次のコマンドをPowerShellコンソールで実行します。

Get-ChildItem -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\'

以下のスクリーンショットでは、次のことがわかります:

  1. WindowsUpdateレジストリキーの完全なキーパス
  2. AUキー
  3. AUキー内のレジストリエントリのリストとそれに対応する値
Getting registry values for Windows Update

上記のスクリーンショットに関して、1つのポイントがあります。出力が少し誤解を招くかもしれないことに注意してください。通常、PowerShellコンソールの出力はオブジェクトのプロパティを表します。しかし、この場合はGet-ChildItemは異なる動作をします。なぜなら、このオブジェクトには厳密にはプロパティが存在しないからです。表示形式を生成するために、裏で追加のコマンドが実行されています。

関連記事: Windowsレジストリでの保留中の再起動の確認方法

Get-ItemPropertyを使用してレジストリの値を取得する

前と同じレジストリキーを使用して、今度はGet-ItemPropertyコマンドレットを使用して出力をより読みやすくします。

Get-ItemPropertyを使用すると、レジストリ内のキーとその値を取得するために最適です。以下のコマンドを実行します:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'

以下のスクリーンショットでは、キーと値のリストが表示されます:

  1. レジストリコンテナAUには、
  2. PSで始まるPowerShell関連のプロパティがあります。
Using Get-ItemProperty in PowerShell to get registry values

代わりに、.NETを使用してレジストリアイテムのパスを指定して同じ出力をわずかに高速化することもできます。以下のコマンドは、.NET Registryクラスを使用してレジストリの値を取得するためにPowerShellで使用されます:

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

Get-ItemPropertyValueを使用してレジストリの値を取得する

今、キーの値を見てみましょう。前と同じレジストリコンテナを使用して、キーNoAutoUpdateの値を見てみましょう。次のPowerShellコマンドを実行してください:

Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\' -Name NoAutoUpdate

Get-ItemPropertyValueを使用すると、以前に表示された他の情報ではなく、値のみを表示するより簡潔な出力が得られます。

NoAutoUpdate key and the corresponding value

PSドライブを使用せずにレジストリをクエリする

このチュートリアルでは、レジストリを操作するためにPowerShellドライブを使用してきました。しかし、これが唯一の方法ではありません。.NETを活用して.NETクラスを使用してレジストリ情報を取得することもできます。

たとえば、リモートコンピュータ上のHKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\ : AutoUpateのレジストリ値をPowerShellで取得する必要があるかもしれません。

これは.NETを使用して次のように行うことができます:

  1. リモートコンピュータでレジストリ接続を開く。
$Registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computername)

2. 探している特定のレジストリキーを開く。

$RegistryKey = $Registry.OpenSubKey("SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU", $true)

3. レジストリキー内のレジストリ値の値をクエリするためにGetValue()メソッドを使用する。

$RegistryKey.GetValue('AU')

PowerShellドライブではなく.NETを使用すると、レジストリキーと値をリモートコンピュータ上でクエリするための簡単な方法であり、速度も少し速くなります。

Test-Pathを使用してレジストリ値をテストする

時には、単にレジストリ値の存在を確認する必要がある場合もあります。その場合は、Test-Pathコマンドレットを使用します。

WindowsUpdate コンテナーの続きですが、次のPowerShellコマンドを実行してAUコンテナーが存在するかどうかをテストしてください。

Test-Path -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'

結果がTrueの場合、キーまたはコンテナーが存在します。しかし、値またはエントリが存在するかどうかをテストする必要がある場合はどうすればよいでしょうか?このテストのためのカスタム関数を作成しましょう。

Function Test-RegistryValue ($regkey, $name) {
     if (Get-ItemProperty -Path $regkey -Name $name -ErrorAction Ignore) {
         $true
     } else {
         $false
     }
 }

カスタム関数を使用すると、キーまたはコンテナーのパスと名前、および探している値を入力すると、カスタム関数は下のスクリーンショットに示すようにTrueまたはFalse(3)を返します。

Enter a key and value to test and return True or False

次の手順

Get-ChildItemGet-ItemProperty、およびGet-ItemPropertyValueをPowerShellで使用してレジストリの値とキーを取得できることを知っていますが、他に何ができますか?

PowerShellでレジストリを操作する方法について詳しく学びたい場合は、Microsoft Docsの記事「レジストリキーの操作」をご覧ください。また、ATAブログの記事「Active Setupの使用:すべてのユーザーハイブにレジストリ値を設定する方法」では、レジストリ値の設定の素晴らしいデモンストレーションも紹介されています。

Source:
https://adamtheautomator.com/powershell-to-get-a-registry-value/