treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

レジストリキーをコマンド(CUI)で内容表示

レジストリキー内の値をコマンド一行で画面に表示させたい、これをやってみたのでご報告です。
regコマンドというレジストリ操作のコマンドを利用します。regコマンドなので利用には注意が必要ですね。

最初に注意点:
レジストリを操作するコマンドであるregコマンドは、操作を誤るとレジストリの情報を書き換えるため、利用には注意が必要です。
ただ、regコマンドに続けてサブコマンドである「query」というコマンドが続いていれば「参照する」という動作しかしないため、基本的には安心して実行することができます。
とはいえ、regコマンドだけ(queryサブコマンドを付け忘れ)で実行したり、別のサブコマンドを付けてしまうとレジストリ内の情報を書き換えてしまうことになるかもしれないので、実行には注意が必要になります。

動機

レジストリキーを確認するときには、レジストリエディタを開いて、ツリー構造で表示されるレジストリキーをルートキーからサブキーを選択していって、目当てのサブキー到達後に右ペインで探しているキーを目視して…、とやっていると、操作の手間が多く、何台もあるたくさんのWindowsOSを流れ作業で一台一台レジストリキーを確認するときには、やや手間が多い、ということがあります。

こういうときは、コマンド一つでペロッとレジストリキーの現在の内容を画面に表示できた方が便利です。コマンドでできないか、やってみました。

基礎知識として、レジストリエディタを開くと「コンピュータ」の直下にある、
「HKEY_CLASSES_ROOT」「HKEY_CURRENT_USER」「HKEY_LOCAL_MACHINE」「HKEY_USERS」「HKEY_CURRENT_CONFIG」の5つのキーをルートキーと呼び、
ルートキーの配下にある(フォルダアイコンで表示される)キーをサブキーと呼びます。

f:id:treedown:20190708130731p:plain
左ペインの一覧でサブキーを選択した後、右ペインに表示される名前欄(名前の列)は「値の名前」と呼び、データ欄(データの列)に表示される情報が「値のデータ」と呼びます。

レジストリキーの確認にはregコマンド

レジストリキーの操作にはregコマンドを利用しますが、この定番regコマンドは「現在のレジストリキーの内容確認」にも使える、ということは意外と知られてない話。
regコマンドで現在のレジストリキーの内容を確認するには、「reg query」コマンドを利用します。
※当然ですが、コマンドで指定するレジストリキーにアクセス可能なアクセス権を有するユーザで実行する必要があります。場合によっては「管理者権限で実行したコマンドプロンプト」で実行しなきゃいけないレジストリキーもあるかもしれません。

単純に
reg query "%参照したいレジストリキーのフルパス%"
とコマンド入力すると、そのサブキー配下のレジストリキーの値をすべて画面に表示してくれます。
例えば、以前に<続・ sambaサーバにアクセス出来ないんですが…を解消 - treedown’s Report>で、NTLMバージョン確認のためにLsaキー配下の状態を調べたのですが、このときの操作をコマンドで実行する場合には、

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa"

と実行することになります。これで「LmCompatibilityLevel」が画面に表示されるかどうかを判断して、「LmCompatibilityLevel」キーの存在有無を確認できることになります。
記録をテキストファイルに保存したい場合、

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" >>c:\temp\REG_%COMPUTERNAME%.txt

って具合にリダイレクタでテキストファイルを指定するとc:\tempにreg_コンピュータ名.txtってファイルが生成されるので、このファイルを収集すると、調査結果を集約することができるようになる、という具合。

レジストリキー内の特定の値だけ収集したい場合

レジストリキーだけを指定しただけだと、そのレジストリキー内の値全部が一覧で画面に表示されてしまいます。
お目当てのレジストリキー内の値が既に絞り込まれている場合、値を指定して、必要な値だけを収集するほうがスマート、ってことで、さらに画面に表示される情報を絞り込んでみます。
絞り込みには 「/v」オプションを付けたあと、「値の名前」を付加します。
--------------------------------------------------------------
>reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v "LsaPid"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
LsaPid REG_DWORD 0x3a0
--------------------------------------------------------------
以前の<続・ sambaサーバにアクセス出来ないんですが…を解消 - treedown’s Report>でNTLMバージョン確認のキー「LmCompatibilityLevel」を探すには、

reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v "LmCompatibilityLevel"

と実行することになります。

f:id:treedown:20190708130858p:plain
--------------------------------------------------------------
>reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v "LmCompatibilityLevel"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
LmCompatibilityLevel REG_DWORD 0x3
--------------------------------------------------------------
「LmCompatibilityLevel」は値「3」で設定されている、ということが分かります。

このキーは存在しない場合もあり、存在しないキーが指定された場合には、
--------------------------------------------------------------
>reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa" /v "LmCompatibilityLevel"

エラー: 指定されたレジストリ キーまたは値が見つかりませんでした
--------------------------------------------------------------
こういう具合に「エラー: 指定されたレジストリ キーまたは値が見つかりませんでした」が表示されます。
エラーになるか、値が表示されるかでキーの存在有無も判断できる、ということになります。

元々は

これは、もとはというと、イントラネット内のWSUSの参照先としてどのサーバを見ているのか、というレジストリキーを参照したくて始めたことでした。
「HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate」
にキーが存在していて、値の名前は「WUServer」ないし「WUStatusServer」なので、これを指定して、Windows Updateが実行される際に参照されるWSUSサーバを調べたかった、という。

この場合、

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v /f "WUS"

で欲しい情報が取れました。
※ヘルプを見ると、「/f」オプションは検索するデータまたはパターンを指定する、と記載があります。このため、/fオプションを付けると指定のレジストリキー内の値(値の名前)からWUSが含まれている値とデータを表示することができます。
つまり、WSUS環境でこのレジストリキー内に格納されている値の名前から、「WUServer」と「WUStatusServer」の二つが「WUS」という文字列を含んでいるので、/fオプションによって抽出されて実行結果として表示されることになります。