レジストリに直接アクセスすることで、通常のユーザーインターフェイスからでは参照/設定できないような情報も取得/操作できる。レジストリをエンドユーザーが直接操作するのは何かと危険が伴うが、PowerShellスクリプトを介することで安全なレジストリ設定をコマンド1つで行うことが可能になる。
対象OS:Windows PowerShell
いまさら言うまでもなく、レジストリとはWindowsそのもの、あるいは各種アプリケーションの構成情報を格納するための、Windows OS内部のデータベースである。通常のユーザーインタフェースからでは設定/変更できないような操作も、レジストリを直接操作すれば可能なことも少なくない。
もっとも、レジストリはシステムの基本的な動作設定を多く含んでいるため、不用意な操作はシステム自体の不具合を招き、最悪の場合、システムが起動できなくなる可能性もある。このため、システム管理者であってもレジストリを直接に操作するのは避けるべきであるし、ましてや、エンドユーザーにレジストリを触らせるような状況は、よほどの例外でない限りは避けるべきだろう。
そこで本稿では、PowerShellスクリプトからレジストリの値を取得/更新するための方法を紹介する。システム管理者が十分にテストを実施したスクリプトを介することで、危険なレジストリ操作も安全に、かつ、コマンド1つで実施することが可能になる。
本稿ではInternet Explorerのホームページ(起動時にデフォルトで表示されるページ)を、PowerShellスクリプトから設定するサンプルを紹介する。
[注意]
PowerShellを利用するには、あらかじめシステムにユーザー自身がインストールしておく必要があります。具体的なインストール方法については「PowerShellをインストールする」を参照してください。
まずはテキストエディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお「#」で始まる行は、コードの意味を解説するためのコメント部分なので、省略してもよい。コメントには、スクリプトの簡単な説明を入れておいた。
# 操作対象となるレジストリのパス
$path = "HKCU:\Software\Microsoft\Internet Explorer\Main"
# レジストリ・エントリのプロパティを取得し、そのStart Pageキーにアクセスする
$item = Get-ItemProperty $path
"元のホームページ -> " + $item."Start Page"
# 指定されたキーの値を変更する
Set-ItemProperty $path -name "Start Page" -value "http://www.wings.msn.to"
# 変更後のキー値を確認する
"変更後のホームページ -> " + (Get-ItemProperty $path)."Start Page"
PowerShellスクリプトの実行ファイルは拡張子を「.ps1」とする必要がある。ファイル名自体は何でも構わないが、ここでは「Registry.ps1」という名前で保存しておこう。
コード全体の流れについてはリスト内のコメントをご覧いただくとして、ここで注目してほしいのは次の2点だ。
レジストリエントリを取得するには、まず「Get-ItemProperty」コマンドレットでプロパティ情報を取得する。ここでは、まずレジストリキー「HKCU:\Software\Microsoft\Internet Explorer\Main」が持つプロパティ(エントリ)群を「Get-ItemProperty」コマンドレットで取得し、「$item."Start Page"」で個別のエントリ値にアクセスしている。プロパティ名に空白が含まれる場合には、名前はダブルクオーテーションでくくる必要がある*1。
また「HKCU:\」というパス表記にも注目してほしい。PowerShellではレジストリもドライブの1つとして管理されており、ファイルシステムに対するのと同じ要領でアクセスできるのが特徴だ。「HKCU:\」はレジストリのHKEY_CURRENT_USERを表す。ドライブに関する詳細は「Windows PowerShellコマンド&スクリプティング入門(前編)」でも紹介しているので、併せて参照いただきたい。
*1 最初の例ではいったん変数$itemに「Get-ItemProperty」コマンドレットの結果を格納しているが、後の例のように「(Get-ItemProperty $path)."Start Page"」と1文で書いても意味は同様である。
レジストリエントリの値を設定するには、「Set-ItemProperty」コマンドレットを使用する。「Set-ItemProperty」コマンドレットの一般的な構文は、以下のとおりである。
Set-ItemProperty <パス名> -name <エントリ名> -value <エントリ値>
このように、ごく単純なコードでレジストリを編集できるが、前述したように、レジストリの変更は大きな危険を伴う操作だ。システム管理者といえども、軽々しく実行するべきではない。そこでPowerShellでは、(実際の操作は行わず)操作内容を確認するだけの-whatIfというオプションも用意されている。「-whatIf」オプションについては、以下で実行の手順と併せてあらためて後述する。
Registry.ps1を実行するには、PowerShellのプロンプトを開いたうえで、以下のようにコマンドを実行すればよい(カレントフォルダにスクリプトが保存されているものとする*2)。
PS > ./Registry.ps1
元のホームページ -> http://jp.msn.com/
変更後のホームページ -> http://www.wings.msn.to
*2 PowerShellでスクリプトファイルを実行する場合には、あらかじめいくつかの設定を行っておく必要がある。詳細については、「Windows PowerShellコマンド&スクリプティング入門(後編)」を参照していただきたい。
上のように表示されれば、スクリプトは正しく動作している。また、レジストリエディタから確かに該当のキー値が指定されたURLに変更されていることを確認しておこう。
さて、最後に、先ほど保留しておいた「-whatIf」オプションについても補足しておこう。まずは、最初のリストの内容を次のように変更してほしい(行末に「-whatIf」を追加する)。
Set-ItemProperty $path -name "Start Page" -value "http://www.wings.msn.to"
Set-ItemProperty $path -name "Start Page" -value "http://www.wings.msn.to" -whatIf
この状態でRegistry.ps1を実行してみると、次のように、レジストリ値は変更されないことが分かる(「変更後のホームページ」が変更前と同じで、変更されていない)。
PS > ./Registry.ps1
元のホームページ -> http://jp.msn.com/
WhatIf: 対象 "項目: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main プロパティ: Start Page" に対して操作 "プロパティの設定" を実行しています。
変更後のホームページ -> http://jp.msn.com/
「-whatIf」オプションを指定した場合、このように操作の内容が表示されるのみで、実際の操作(ここではレジストリの変更)は行われない。
レジストリの変更やファイルの削除など、元に戻せない(戻しにくい)操作を行う場合には、いきなり実行するのではなく、まず「-whatIf」オプションを付けてスクリプトを実行することで、処理内容を事前に確認することを強くお勧めする。「-wharIf」オプションは、「Set-ItemProperty」コマンドレットだけではなく、変更を伴うコマンドレットの多くで共通して利用できる。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.