1. トップ
  2. 新着ニュース
  3. IT
  4. IT総合

レジストリエディタ以外、reg.exeコマンドやPowerShellからレジストリを操作する

ASCII.jp / 2022年11月20日 10時0分

 Windowsにおけるレジストリは、設定を記憶する「データベース」。Windowsの利用歴が長いユーザーなら、1回くらいはなんらか触ったことがあるだろう。

 そのレジストリの操作では、「レジストリエディタ」が有名で、インターネットでの関連記事のほとんどがこれを使っている。しかし、レジストリにアクセスする方法は、レジストリエディタだけではない。

レジストリエディタの左側に表示されるのが「キー」で、右側の領域に表示されるのが「値」。値は複数定義可能で、「名前」、「種類」(データ形式)、「データ」から構成されている

そもそもWindowsにおけるレジストリとは?

 レジストリはWindows固有の機能だが、一般的には「キー、バリューストア」からなる。ただし、レジストリの場合、1つのキーに複数の「値」(バリュー)が存在できるため、値には名前がある。「値」だと理解しにくいこともあるのか、マイクロソフトのドキュメントなどでは「レジストリエントリ」と表記することもあるようだ。

 レジストリエディタの左側のペインに表示されるのがキーであり、右側に表示されるのが「値」だ。「値」は、「名前」「種類」「データ」がある。「データ」と言わずに「値」とするのが素直なのだが、全体が「値」なので、これを「値」と呼ぶのも混乱の元。そこで「データ」になっているのだと思われる。

 各キーには1つだけ名前のない値がある。ドキュメントなどでは「既定値」などと表記されるが、レジストリエディタでは「(既定)」などと表示される。これは名前のない文字列値で、標準ではデータは中身のないヌルストリングになっている。これを使うことで、キーと値で一組となる、従来のキーバリューストアと同じことが可能になる。

 レジストリキーは、複数のルートキーから構成されている。ルートキーには、以下の表のようなものがあり、それぞれ役目がある。

レジストリにアクセスする方法はさまざま

 レジストリにアクセスする方法は複数ある。1つはレジストリエディタだが、そのほかに「reg.exe」コマンドとPowerShellのコマンド、Windows Scripting Hostも使える。また、Visual BASICなどのプログラミング言語からもアクセスは可能だ。Windowsの.NET、.NET Frameworkにはレジストリを扱うオブジェクトが用意されているため、.NET/.NET Frameworkを扱える言語は、基本的にレジストリも扱えるようになっている。

 とはいえ、ユーザーレベルで簡単にアクセスする方法としては、レジストリエディタを除けば、コマンドラインのreg.exeコマンドかPowerShellくらいだ。ウィンドウを開く手間を考えれば、どれも同じだが、コマンドラインで作業しているとき、ちょっとレジストリを確認したいといった場合には、reg.exeコマンドを使うのが簡単だろう。なお、レジストリキーには、アクセス制御が適用できるため、レジストリの書き換えには管理者権限が必要になる。

では、まずコマンドラインのreg.exeコマンド

 キーや名前が判明しているレジストリエントリを表示するには、reg.exeコマンドが適している。reg.exeコマンドは、レジストリエディタで可能なことの大半が実行できる。また、キーをコピーしたり、特定のキーとそのサブキー、そして「値」をファイルに保存し、あとから書き戻せるほか、他のキーの下に読み込むといったことも可能だ。

 ただ、reg.exeコマンドは、表示や検索することに比べると、キーや値の編集操作は面倒ではある。コマンドラインゆえに、タイプミスといったエラーが入り込む余地もある。筆者も、レジストリを書き換える場合には、他の方法を使うことが多い。レジストリエディタならキーをたどっていくため、タイプミスなどをしにくく、大きな勘違いをしない限り、間違ったキーで操作してしまうことはない。

 reg.exeには、サブコマンドとオプション、パラメーターでレジストリにアクセスする。サブコマンドには、以下の表のようなものがある。まずは、「QUERY」サブコマンドだけ、使いこなせるようにしておけばいいだろう。

 QUERYサブコマンドは、簡単に言えば、ルートキーから始まる完全キーを指定して、そこにある値を表示させるものだ。オプション「/s」で再帰的にサブキーの持つ値を表示できる。なお、Windows 10/11に付属しているreg.exeでは、オプション指定文字に「/」だけでなく、「-」を指定しても動く。最近のWindowsのコマンドは、Unixと同じくハイフンを使うものが増えてきた。このため、どっちでもいいようになっている。実際、両者を区別するのはかなり面倒だ。

 キーを指定して値を調べるには、

reg.exe query HKCR\.shiodatest

などのようにQUERYサブコマンドでキーを指定する。

reg.exeコマンドのQUERYサブコマンドで、レジストリの表示や検索ができる

 これで、キーに含まれる値(名前、種類、データ)とサブキー(直下のものだけ)を表示する。多数の値があり、特定の値だけがほしい場合には、「/v 名前」を指定する。また、キーの既定値を表示させたい場合には「/ve」を指定する。

 ほとんどの場合、これだけでレジストリの確認ができる。また、「/s」オプションを付けることで、指定したキーのサブキー以下すべてを出力する。

 キー、名前、データの検索には、「/f」オプションを使う。機能的には、レジストリエディタの検索機能とほとんど同じだ。

reg.exe HKCR\.shiodatest /f shell

とすると、指定したキー(HKCR\.shiodatest)以下で、「shell」が、サブキー、名前、データの中から検索される。

レジストリの検索をするとき、「/f」で検索パターンを指定し、オプションで検索対象を限定できる

 対象を限定したときには、「/k」(キー)、「/v」(名前)、「/d」(データ)を指定する。

 reg.exeコマンドで、キーや値を変更する場合、ADDサブコマンドを使う。可能なのは、キー、値の新規追加か、既存のキー、値の上書き変更である。reg.exeでは名前の変更などは直接はできない。

PowerShellからのレジストリアクセス

 PowerShellではレジストリ専用のコマンドが存在しない。PSドライブという機能を使い、レジストリをファイルのように扱う。このとき、ファイルと同じ「Item」系コマンドを使う。

 キーがパス、値がファイルである。PSドライブとは、さまざまなデータをファイルシステムのように扱うための仕組み。ファイルシステムでは、「C」や「D」などのドライブ文字がPSドライブになっているが、レジストリではルートキーがPSドライブである。PSドライブは、パスの頭に付け、コロンを介して以下にパスを記述する。

 たとえば「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft」は、「HKLM:\SOFTWARE\Microsoft」と表記できる。

Get-Item HKLM:\SOFTWARE\Microsoft

のように使う。

 PSドライブが定義されていないルートキーは、レジストリプロバイダー(Microsoft.PowerShell.Core\Registry::だが、Registry::と表記できる)を使って「Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft」と記述する。

 標準では「HKCU」と「HKLM」の2つが定義されている。また、New-PSDriveコマンドを使えば、他のルートキーをPSドライブとして定義することもできる。たとえば、

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

で、「HKEY_CLASSES_ROOT」を「HKCR」というPSドライブに定義できる。

 こうした仕組みになっているため、PowerShellでレジストリを扱うときには、ちょっと頭を切り替える必要がある。

 たとえば、キーにある値を列挙するには、Get-Itemを使う。 レジストリの場合、「Get-ItemProperty」でも値を列挙できる。ただし、この場合、PowerShellのプロパティ(PSで始まる)が付加される。サブキーを含めて表示させたい場合には、Get-ChildItemを使う。

PowerShellでは、PSドライブを使ってレジストリをファイルと同じコマンドで扱える

 少し面倒な感じもあるが、PowerShellでは、タブによる補完が可能で、レジストリキーにも有効なため、reg.exeコマンドよりも、入力効率がいいというメリットがある。また、結果を変数に保存してコマンドの繰り返しを避けたり、さまざまなコマンドで対象を絞る、データを抽出するといったことが可能である。

 ただ、意外と検索が面倒だ。PowerShellでは、一般にコマンドを使って対象を含むデータを列挙して、その中から目的のものを選択するという考えになる。レジストリキーや名前での検索は難しくないが、データでの検索はかなり面倒なコマンドになり、reg.exeを使ったほうが手っ取り早い。

 その代わりといってはなんだが、キーや名前の変更、データの追記といった処理は比較的簡単だ。reg.exeでは、データは書き換えしかできないため、元のデータを表示させて、これをADDサブコマンドの引数に含めて上書き用のデータを指定する必要がある。

 レジストリエディタは、基本的な機能を網羅しているため、たいていはこれで十分なのだが、ウィンドウを開いたり、キーを探すのが面倒に感じることがある。コマンドラインを使っているなら、レジストリを確認したい場合には、reg.exeコマンドを使えばいいだろう。

この記事に関連するニュース

トピックスRSS

ランキング

記事ミッション中・・・

10秒滞在

記事にリアクションする

記事ミッション中・・・

10秒滞在

記事にリアクションする

デイリー: 参加する
ウィークリー: 参加する
マンスリー: 参加する
10秒滞在

記事にリアクションする

次の記事を探す

エラーが発生しました

ページを再読み込みして
ください