レジストリを操作するスクリプト作成初心者のためのコラム、"Sesame Script" へようこそ。このコラムの目的は、システム管理自動化に使用する Windows スクリプトの基礎を紹介することです。ここでは、スクリプトを読んで理解し、必要に応じてスクリプトを変更するために必要な情報を提供しています。スクリプト作成について何かよくわからない点がありましたら、 ご連絡ください(英語のみ)。多くの方が同じ疑問を抱えているはずです。 過去の記事については、 Sesame Script アーカイブを参照してください。 | 新着情報を入手する |
過去 5 ~ 10 年の間に家を売却したことがある方は、おそらく "ステージング" の概念をご存じだと思います。ステージングとは、多くの購買者の関心を引くように、家の見栄えをよくするという考え方です。理論上は、ステージングによって、より速くそして高額に家を売却できます ("理論上は" と言ったのは、必ずしも全員がステージングの効果を信じているわけではないからです。信じていない人は、わざわざ家を掃除したくない人でしょう。まあ、私たちが口を出すことではありませんが)。
家のステージングにはさまざまな方法があり、ペンキで色を塗ることが、簡単な方法の 1 つです。適切な色のペンキを塗れば、部屋が明るくなったり、大きく見えたり、付加的なメリットがあります。見た目が汚い家に引っ越したいと思う人はいないので、カーペットや床を掃除したり張り替えたりするのも良いでしょう。また、整理整頓をするという方法もあります。これは、一番難しいと考えられがちな方法です。これまでに訪れたすべての空港で購入したスノーグローブや、まぶしく輝くまで愛情を持って磨き上げたハブキャップのコレクション、称賛してもらうために得意げに飾った 250 枚もの子供の写真など、何年もかけて集めた、大切にしているがらくたが失われます。ですが、永遠にではなく、家を売却するまでの間です。その後は、新居で、またがらくたを飾り立てることができます。
最終的に、ほぼすべての人が引っ越したいと思うような、清潔で、輝いている、開放的な家になります。
とにかく、これは 1 つの考え方です。
これが今月の Sesame Script と一体何の関係があるのか、ですって。今はわかっていませんが、いずれわかります。
前置きはこのくらいにして、少し退屈な部分に入る必要があります。
(もう退屈している、ですって。家のステージングについて知りたくなかったというのですか。申し訳ありません。家のステージングに興味をそそられない人がいることには考えが及びませんでした。言うまでもなく、そういう人が、この記事を読むとは思っていませんでした)。
今月の記事では、信じていただけないかもしれませんが、Windows システム レジストリの操作について説明します。レジストリを取り上げているドキュメントのほとんど (特にマイクロソフトが提供しているドキュメント) には、レジストリは操作しないことが推奨されており、操作する場合は、コンピューターが動作しなくなるおそれがあるので、細心の注意を払う必要があるという警告が至る所に掲示されています。ですが、スクリプト センターは、典型的なマイクロソフトのドキュメントほど多くの警告を掲示していないという事実を踏まえ、このことについては言及しません。
えっ、何ですか。Windows システム レジストリによって、コンピューターが動作しなくなるという起こり得る危険についてここでも注意する必要がある、ですって。そうですか、わかりました。仕方がありません。これを読んでいる方は、警告されていると思ってください (家のステージングについて知りたくなかった方は、特にです)。
それでは、レジストリを直接操作しなくてはならないときもあるという現実と向き合いましょう。
おそらくご存じのように、レジストリは Windows の中核を担っている部分で、オペレーティング システムに関連する情報や、オペレーティング システムで実行されているアプリケーションに関連する情報が格納されています。レジストリは Windows について、さまざまなステージングを行っていると考えることができます (ほら、いずれわかると言ったでしょう)。たとえば、アプリケーションを実行してウィンドウのサイズを変更した後、アプリケーションを終了して、もう一度起動してみましょう。アプリケーションを終了したときとウィンドウのサイズが同じだったとしたら、それはおそらくサイズの情報がレジストリに格納されたからです。現在設定しているデスクトップの壁紙の設定も、レジストリに格納されています。スクリーン セーバーも同様に、レジストリに設定が格納されています。
ですが、レジストリには見かけよりも多くのものが保持されていて、実行しているハードウェアの種類、ロケール設定、アプリケーションの情報 (たとえば、バージョン番号やインストールの日付) などについての情報も格納されています。これらすべてが、レジストリ エディター (regedit.exe) で操作できる、適切かつ便利な階層に格納されています。レジストリ エディターを次に示します。
ただし、レジストリ エディターから情報を取得するのは必ずしも便利であるとは限りません。たとえば、ロンドンにいるときに、東京にあるコンピューターのレジストリ情報を取得する必要があるとします。飛行機で東京に行くことも可能で、この旅行はきっとすてきなものになるでしょう。ですが、だれもが年がら年中世界を飛び回れるわけではありません。皆さんは自分のオフィスから情報を取得する必要があると思いますので、もっと実用的な解決策を紹介します。コンピューターがネットワークに接続していて、皆さんがそのコンピューターの管理者であれば、スクリプトを使用できます。
リモート コンピューターのレジストリを操作できるとお伝えしましたが、説明しなかったことにして、ローカル コンピューターでレジストリを操作する方法について説明します (心配しないでください。この後すぐにリモート コンピューターの説明もしますから)。
Windows Script Host (WSH) は、WshShell というクラスを 1 つ提供します。このクラスを使用すると、レジストリへのローカル アクセスが可能になります (このクラスは、Wscript.Shell オブジェクトで CreateObject メソッドを呼び出して作成します)。WshShell クラスには、レジストリを操作する RegRead、RegWrite、および RegDelete という 3 つのメソッドがあります。この 3 つのメソッドで行う処理は推測できないと思うので、とにかく、説明しましょう。これらのメソッドで行う処理は、レジストリの読み取り、レジストリへの書き込み、およびレジストリからの削除です。どのメソッドがどの処理を行うかは、皆さんが当ててください。
各メソッドの例も紹介するつもりなので、説明は、これで全部ではありません。まず、レジストリから値を読み取る方法を見てみましょう。
Set objShell = WScript.CreateObject("WScript.Shell")
iWordWrap = objShell.RegRead _
("HKCU\Software\Microsoft\Notepad\fWrap")
Wscript.Echo iWordWrap
このスクリプトでは、まず、既に説明した WScript.Shell オブジェクトを作成しています。
Set objShell = WScript.CreateObject("WScript.Shell")
続いて、そのオブジェクトで RegRead メソッドを呼び出し、参照する値の完全レジストリ パスを渡します。
iWordWrap = objShell.RegRead _
("HKCU\Software\Microsoft\Notepad\fWrap")
このパスは詳しく見た方が良さそうですね。レジストリ エディターを起動すると、次の 5 つのルート キーが表示されます。
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT _CONFIG
ですが、RegRead メソッドに渡した次のパスには、どのルート キーも使用しませんでした。
HKCU\Software\Microsoft\Notepad\fWrap
パスは "HKCU" で始まっています。実は、HKCU は HKEY_CURRENT_USER の略です。正式名称を入力してもかまいませんが、WSH では次のようにルート キーの省略形を使用できます。
| ルート キー | 省略形 |
|---|---|
| HKEY_CLASSES_ROOT | HKCR |
| HKEY_CURRENT_USER | HKCU |
| HKEY_LOCAL_MACHINE | HKLM |
| HKEY_USERS | HKEY_USERS |
| HKEY_CURRENT _CONFIG | HKEY_CURRENT_CONFIG |
実際、省略形があるのは、5 つのルート キーのうち 3 つだけです。ですが、その 3 つがおそらく最も頻繁に使用するルート キーなので、特に問題はありません。
レジストリ値を読み取ったら、次のようにその値をエコーしてスクリプトを終了します。
Wscript.Echo iWordWrap
調べた値は、メモ帳の [右端で折り返す] コマンドに対応しています。
0 という値が設定されている場合は、右端で折り返す機能がオフになっていて、1 の場合はオンになっていることを示します。次のように、スクリプトに少しロジックを追加して、もっとわかりやすくできます。
Set objShell = WScript.CreateObject("WScript.Shell")
iWordWrap = objShell.RegRead _
("HKCU\Software\Microsoft\Notepad\fWrap")
If iWordWrap = 0 Then
Wscript.Echo "Word wrap is turned off"
Else
Wscript.Echo "Word wrap is turned on"
End If
このスクリプトでは、先ほどのスクリプトと同じように、まず WshShell オブジェクトを作成し、値を読み取るために RegRead メソッドを呼び出します。ただし、今回は、レジストリから返された数値をエコーする代わりに、数値を特定する If ステートメントを追加します。値が 0 の場合、"Word wrap is turned off" (右端で折り返す機能がオフになっています) というメッセージをエコーします。それ以外の値 (右端で折り返す機能はオフかオンしかないので、1 しかありません) の場合は 、"Word wrap is turned on" (右端で折り返す機能がオンになっています) というメッセージをエコーします。
今度はその値を変更して、右端で折り返す機能を常にオンにするとします。レジストリに値を書き込むスクリプトは次のとおりです。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.RegWrite "HKCU\Software\Microsoft\Notepad\fWrap", 1, "REG_DWORD"
ここでも WshShell オブジェクトを作成します。今回はレジストリ値を変更するので、次のように RegWrite メソッドを呼び出します。
objShell.RegWrite "HKCU\Software\Microsoft\Notepad\fWrap", 1, "REG_DWORD"
RegWrite メソッドには次の 3 つのパラメーターを渡します。
"HKCU\Software\Microsoft\Notepad\fWrap": 変更するレジストリ値のパスです (ここでもルート キーの省略形、HKCU を使用している点に注目してください)。
1: キー値に書き込む新しい値です。
"REG_DWORD": 変更する値のデータ型です。
とてもわかりやすいですね。えっ、データ型ですか。ええ、そうですね。スクリプトの作成となると、ちょっとなじみがないかもしれませんね。 データ型は、多くの場合 (特に VBScript を操作するときは) 無視してかまいません。ですが、レジストリを操作する場合は異なります。確かに、データ型について気にしなくても値を読み取ることはできました。先ほど値を読み取る際、WSH ではレジストリに値を要求でき、それから値は VBScript の Variant 型で格納されました。ですが、レジストリは Variant 型では操作できません。レジストリには、特定のデータ型を使用する必要があります。つまり、レジストリに書き込む際には、レジストリに追加するデータ型を明示的に指定する必要があります。今回は、レジストリで DWord というデータ型として認識される整数を追加しています。
レジストリで使用されるデータ型はいくつかあります。次に、最も頻繁に操作するデータ型を示します。
| レジストリのデータ型 | VBScript のデータ型 |
|---|---|
| REG_SZ | 文字列 |
| REG_DWORD | 整数 |
| REG_BINARY | 整数の配列 (2 進数) |
| >REG_EXPAND_SZ | 文字列 (展開可能な文字列) |
| REG_MULTI_SZ | 文字列の配列 |
よりおもしろくするために、メモ帳の [右端で折り返す] コマンドの値を変更する別のスクリプトを紹介しましょう。ただし、今回は値を切り替えます。
strPath = "HKCU\Software\Microsoft\Notepad\fWrap"
Set objShell = WScript.CreateObject("WScript.Shell")
iWordWrap = objShell.RegRead(strPath)
If iWordWrap = 0 Then
objShell.RegWrite strPath, 1, "REG_DWORD"
Else
objShell.RegWrite strPath, 0, "REG_DWORD"
End If
少し簡単にするために、今回はパスを次のように変数 strPath に格納しました。
strPath = "HKCU\Software\Microsoft\Notepad\fWrap"
続いて、次のように WshShell オブジェクトを作成して、変数 strPath を RegRead メソッドに渡し、レジストリから値を読み取ります。
Set objShell = WScript.CreateObject("WScript.Shell")
iWordWrap = objShell.RegRead(strPath)
RegRead メソッドを呼び出したのは、今回は値を切り替えるので、現在の値を知る必要があるからです。変数 iWordWrap に現在の値が格納されているので、その値を確認し、RegWrite メソッドを使用して適切な値に変更します。
If iWordWrap = 0 Then
objShell.RegWrite strPath, 1, "REG_DWORD"
Else
objShell.RegWrite strPath, 0, "REG_DWORD"
End If
まず、変数 iWordWrap の値が 0 かどうか確認します。0 の場合は、レジストリ キーのパス、1 という値、およびデータ型 (REG_DWORD) を RegWrite メソッドに渡して、値を 1 に変更します。
objShell.RegWrite strPath, 1, "REG_DWORD"
変数 iWordWrap の値が 0 でない場合は、値を 0 に変更します。
objShell.RegWrite strPath, 0, "REG_DWORD"
これで、既存の値を変更できることがわかりました。ですが、新しい値を作成するにはどうすればよいのかと言うと、信じていただけないかもしれませんが、これはかなり簡単です。実は、RegWrite メソッドに存在しないパスを渡すと、RegWrite メソッドでは、そのパスに必要なキーを作成します。たとえば、次のように Notepad 下に NewKey という値を追加してみましょう。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.RegWrite "HKCU\Software\Microsoft\Notepad\NewKey", 1, "REG_DWORD"
先ほど fWrap 値に新しい値を書き込んだときには、次のパスを渡しました。
HKCU\Software\Microsoft\Notepad\fWrap
今回は、NewKey 値に新しい値を書き込みますが、NewKey 値は存在しません。WSH では、これを認識して、値を作成します。上記のスクリプトを実行すると、次のようにレジストリの Notepad 下に新しい値が作成されます。
これは、パス全体を渡した場合は機能しますが、値のみでは機能しません。たとえば、Notepad 下に NewKey というキーを追加して、そのキーの下に NewValue という値を追加する場合に必要な処理は、次のパスを RegWrite メソッドに渡すだけです。
HKCU\Software\Microsoft\Notepad\NewKey\NewValue
NewValue に DWord 値 1 を書き込むと、レジストリは次のようになります。
これはルート キーまでさかのぼって機能しますが、新しいルート キーをこのように作成することはできません。つまり、HKCU\Key1\Key2\Value のような完全パスは作成できますが、Key1\Key2\Value というパスを渡すことはできません。いずれかの既存のルート キー (HKCU、HKLM など) を指定する必要があります。
最後にローカル コンピューターの WSH で行うのは、キーの削除です (この部分は注意深く行う必要があります。キーや値を誤って削除すると、望まない問題が発生するおそれがあります)。
先ほど作成した新しいキー値を削除するスクリプトは次のとおりです。
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.RegDelete "HKCU\Software\Microsoft\Notepad\NewKey"
ここでも WshShell オブジェクトを作成して、それから RegDelete メソッドを呼び出します。RegDelete メソッドにはパラメーターを 1 つ (削除するキーのパス) だけ渡す必要があります。
ええ、どれもたいへん興味深いものでした。ですが、このすべての処理をリモート コンピューターで実行するスクリプトはどこにあるのか、ですって。
まあまあ、もう少しお待ちください。結局、私たちは、皆さんがレジストリ設定を変更するために世界中を飛び回らなくてもいいようにしているのですから、大きなダンボール箱に大切ながらくたをしまう間、少しだけ待ってもらえませんか。
さて、お待たせしました。
WSH を使用して、ローカル レジストリを操作できました。ご覧いただいたように、かなり簡単でしたね。リモートから操作するには、Windows Management Instrumentation (WMI) を使用する必要があります。ローカル アクセスとリモート アクセスには別のスクリプトを用意する必要はありません。どちらにも WMI を使用できます。WMI はもう少し複雑ですが、そこまで複雑ではありません。レジストリから値を読み取るスクリプトを次に示します。私たちの言わんとすることがおわかりいただけると思います。
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "fWrap"
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.GetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
Wscript.Echo strValue
このスクリプトでは、まず HKEY_CURRENT_USER という定数を定義しています。
Const HKEY_CURRENT_USER = &H80000001
WSH とは異なり、レジストリを操作するために WMI でメソッドを呼び出す場合は、ルート キーの名前の省略形も、ルート キーの完全名さえも渡すことはできません。その代わりに、ルート キーを表す 16 進数値を指定する必要があります。次に、ルート キーと対応する 16 進数値を示します。
| ルート キー | 16 進数値 |
|---|---|
| HKEY_CLASSES_ROOT | &H80000000 |
| HKEY_CURRENT_USER | &H80000001 |
| HKEY_LOCAL_COMPUTER | &H80000002 |
| HKEY_USERS | &H80000003 |
| HKEY_CURRENT_CONFIG | &H80000005 |
この後すぐ、実際にレジストリから値を読み取る際には HKEY_CURRENT_USER 定数を使用します。ですが、まずはいくつかの変数を次のように設定する必要があります。
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "fWrap"
ここでは、変数 strComputer の値にドット (.) を設定しました。ドットは、ローカル コンピューターを表します。このスクリプトをリモート コンピューターに対して実行するのに必要な作業は、ドットをコンピューター名に置き換えるだけです。たとえば、atl-fs-01 という名前のコンピューターのレジストリを操作する場合は、変数 strComputer を次のように設定します。
strComputer = "atl-fs-01"
それから、別の変数 (strKeyPath) の値に、操作するキーのパスを設定し、もう 1 つ別の変数 (strEntryName) の値には、取得するキー値を設定します。ご覧のとおり、それぞれに別の変数が必要です。次のように完全パスを指定することはできません。
strKeyPath = "Software\Microsoft\Notepad\fWrap"
この理由は、もうすぐわかります。ですが、理由を気にする前に、次のように WMI サービスに接続する必要があります。
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
この記事では、WMI の操作の詳細については触れません。WMI の機能の詳細については、「 WMI スクリプト入門: 第 1 部」を参照してください。差し当たり、次の部分にのみ注目してください。
"\root\default:StdRegProv"
WMI でスクリプトを数多く記述したことがある方は、おそらく通常は \root\cimv2 名前空間で WMI サービスに接続しているのではないでしょうか。ですが、レジストリを操作するのに必要なクラスは、その名前空間にはありません。レジストリ情報は、\root\default 名前空間の StdRegProv クラスで使用できます。
これで、WMI サービスの適切な箇所に接続しました。続いて、レジストリから値を読み取る GetDWordValue メソッドを呼び出します。
objReg.GetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
WSH とは異なり、WMI には、レジストリから値を読み取るメソッドがいくつかあります。先ほど WSH について説明したとき、レジストリに書き込む際にはデータ型を指定する必要があると説明したことを思い出してください。WMI では、レジストリから値を読み取る際に、データ型を明示的に指定する必要があります。今回は、数値 (DWord) を含む値を読み取っているので、GetDWordValue メソッドを呼び出す必要があります。次に、レジストリからデータを読み取る際に使用できるメソッドをすべて示します。
GetBinaryValue
GetDWordValue
GetExpandedStringValue
GetMultiStringValue
GetStringValue
それでは、メソッド呼び出しの説明に戻りましょう。
objReg.GetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
GetDWordValue メソッドに渡した 4 つのパラメーターを次に示します。
HKEY_CURRENT_USER: パスのルート キーを現す、先ほど指定した定数です。
strKeyPath: 読み取る値のパスです。
strEntryName: 読み取る値の名前です。パスと値に別々の変数を使用する必要があったのはこのためです。GetDWordValue メソッドには、これらの変数を個別のパラメーターとして渡す必要があります。
strValue: これは out パラメーターと呼ばれるものです。GetDWordValue メソッドによって代入されるので、変数 strValue には何も代入しませんでした。GetDWordValue メソッドでは、読み取った値を変数 strValue に代入します。
後は、次のように値をエコーするだけです。
Wscript.Echo strValue
それほど複雑ではなかったでしょう。実際、一度理解してしまえば、後はかなり簡単です。そのことを証明するために、レジストリに値を書き込んでみましょう。
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "fWrap"
strValue = 1
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.SetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
これを、レジストリから値を読み取るスクリプトと比較すると、両者の間にそれほど違いは見られないことに気付くと思います。ここでも、これから使用するルート キーの定数を宣言します。
Const HKEY_CURRENT_USER = &H80000001
続いて、コンピューター名、パス、および値の名前を指定する変数を宣言します。
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "fWrap"
ここまでは同じです。ですが、今度は値を読み取るのではなく書き込むので、新しい値を変数に代入する必要があります。
strValue = 1
それから WMI サービス (および root\default 名前空間) に接続しますが、今回は GetDWordValue メソッドではなく、次のように SetDWordValue メソッドを呼び出します。
objReg.SetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
SetDWordValue メソッドには、GetDWordValue メソッドに渡したのと同じ 4 つのパラメーターを渡します。今回に限って、関数は "私たちに" 値を渡す必要はなく、代わりに、私たちが "関数に" 値を渡します。その値は、つい先ほど変数 strValue に格納した値です。
既存の値を変更する方法については説明しましたが、新しい値は作成できるのか、ですって。WSH では、新しい値を作成することが可能で、実際、非常に簡単でした。実は、WMI でも同じくらい簡単です。
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "NewKey"
strValue = 10
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.SetDWordValue HKEY_CURRENT_USER, strKeyPath, strEntryName, strValue
先ほどのスクリプトとすべて同じ変数を設定し、WMI サービスに接続して、SetDWordValue メソッド (または、作成する値のデータ型に適切ないずれかのメソッド) を呼び出します。新しいキー、複数のキー、または値を作成するのに必要なことは、次のように、これらの項目を (この場合は変数 strEntryName に格納した) パスで指定することだけです。
strEntryName = "NewKey"
RegWrite メソッドと同じように、パスの存在しない部分が作成されます。
そして最後に、新しい値をわざわざレジストリに追加したので、この値を削除してしまいましょう。
Const HKEY_CURRENT_USER = &H80000001
strComputer = "."
strKeyPath = "Software\Microsoft\Notepad"
strEntryName = "NewKey"
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\default:StdRegProv")
objReg.DeleteValue HKEY_CURRENT_USER, strKeyPath, strEntryName
削除する際には、その値のデータ型を把握している必要はありません。削除するメソッドは、DeleteValue しかないので、データ型は関係ありません。DeleteValue メソッドには 3 つのパラメーターを渡します。まずは、HKEY_CURRENT_USER 定数に格納されているルート キーの 16 進数値です。次に、この場合では、変数 strKeyPath です。最後に、削除するキー値 (strEntryName) を渡して、終了です。
最後に、レジストリへの変更にはコンピューターを再起動するまで適用されないものがあるという注意事項をお伝えしておきましょう。たとえば、HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper というレジストリ値を変更すると、コンピューターの壁紙を変更できます (例については、 この Hey, Scripting Guy! コラムを参照してください)。ただし、スクリプトを実行するだけでは、壁紙は自動的には変更されません。新しい壁紙が表示されるようにするには、コンピューターを再起動する必要があります。
レジストリの操作をほんの少しだけかじりました。Sesame Script で、いずれもう少し詳しく扱いますが、ひとまず、詳細については次のリソースをいくつか参照してください。
Reading From and Writing to the Local Registry (英語) - Windows 2000 Scripting Guide
Registry (英語)- Windows 2000 Scripting Guide
Modifying the System Registry (英語) - WMI SDK
Accredited Staging Professionals (英語) - www.stagedhomes.com
Setting the Stage (英語) - The Washington Post
これで、ステージングはすべて終了です。最初は難しく思えましたが、小学 1 年生のときに息子がアイスクリームを食べているところを撮った写真は箱に入れました。彼がアイスクリームを直に食べていた欠けたボウルは、炉棚から取り除きました。妹が彼にそのボウルを投げつけたとき (これがボウルが欠けた原因です) に抜けた歯も安全に保管しました。この家は、潜在的な購買者に見せる準備ができました。
そして、願わくば、皆さんがレジストリを操作する準備もできていると良いのですが ("家のステージング" と "レジストリの操作" を頑張って結び付けようとしましたが、あきらめました。どうやらあまり関連性はないようですね)。