レジストリの読み取り、書き込みと削除
レジストリは Windows の基本情報やソフトウェアの拡張情報などが保存される場所です。
Autoit では、内部関数を使用してレジストリ値の読み取り、書き込み、削除ができます。
レジストリを変更するアプリケーションを開発する場合、読み取りは問題ありませんが、書き込み、削除には特に注意してください。
レジストリの操作を間違えるとシステムが起動できなくなるなど不具合が起きる可能性があります。
事前にシステムの復元などでバックアップを取り、自己責任で行うようお願いします。
※通常のアカウントでスクリプトを実行する場合、管理権限の必要なキーにアクセスする際に読み書きが失敗するので、スクリプトの最初に「#RequireAdmin」を追加する必要があります。
「#RequireAdmin」は、スクリプトの実行に管理者権限を必要とするように設定します。
レジストリ値の読み取り
レジストリ値の読み取りには RegRead 関数を使用します。
形式:RegRead ( “キーの名前”, “値の名前” )
次のサンプルは「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion」キーにある「ProgramFilesDir」という値のデータを読み取ります。
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion", "ProgramFilesDir")
MsgBox(0, "", "プログラムファイルは次の場所にあります:" & @CRLF & $var & " フォルダー")
レジストリの読み取りには RegRead 関数以外にも 2つの特別な関数があります。
RegEnumVal 関数と RegEnumKey 関数です。
RegEnumKey 関数:インスタンスに従ってレジストリのサブキー名を読み取ります。
形式:RegEnumKey( “キー名”, 序数(順序数))
RegEnumVal 関数:レジストリの値の名前を読み取る
形式:RegEnumVal( “キー名”, 序数(順序数))
RegEnumVal 関数と RegEnumKey 関数のサンプルコード
Dim $app
For $i = 1 To 10
$var = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", $i)
$app &= $var & @LF
If @error <> 0 Then ExitLoop
Next
MsgBox(4096, "スタートアップ項目", $app)
$app = ""
For $i = 1 To 10
$var = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE", $i)
$app &= $var & @LF
If @error <> 0 Then ExitLoop
Next
MsgBox(4096, "インストールされているアプリケーション", $app)
レジストリへの書き込み・削除
RegWrite 関数:レジストリにキー、値を作成します。
形式:RegWrite ( “キー名” [,”値の名前” [, “種類” [, 値のデータ]]] )
レジストリ値の種類
“REG_SZ” = 文字列値
“REG_MULTI_SZ” = 複数行文字列値
“REG_EXPAND_SZ” = 展開可能な文字列値
“REG_DWORD” = DWORD(32ビット)値
“REG_QWORD” = QWORD(64ビット)値
“REG_BINARY” = バイナリ値
※パラメータは4つありますが、角カッコで囲まれているパラメータは省略可能という意味です。
レジストリ値の書き込み
実行前に必ず注意をお読みください。
ここで紹介するサンプルでは、安全なキーを追加していますので問題ありませんが、キーや値を変更する場合は十分に注意してください。
次のコードはレジストリにキー、値の作成、値のデータの変更をするサンプルです。
; HKEY_CURRENT_USER\Software\aTest キー下に文字列値"TestKey"を作成し、値のデータに"Hello this is a test"を書き込みます。
RegWrite("HKEY_CURRENT_USER\Software\aTest", "TestKey", "REG_SZ", "Hello this is a test")
$read = RegRead("HKEY_CURRENT_USER\Software\aTest", "TestKey")
MsgBox(0, '', $read)
; 文字列値"TestKey"の値のデータを"こんにちは"に変更します。
RegWrite("HKEY_CURRENT_USER\Software\aTest", "TestKey", "REG_SZ", "こんにちは")
$read = RegRead("HKEY_CURRENT_USER\Software\aTest", "TestKey")
MsgBox(0, '', $read)
; HKEY_CURRENT_USER\Software\aTest キー下に複数行文字列値"TestKey1"を作成し、
; 値のデータに"Hello1" & @LF & "Hello2"を書き込みます。
RegWrite("HKEY_CURRENT_USER\Software\aTest", "TestKey1", "REG_MULTI_SZ", "Hello1" & @LF & "Hello2")
$read = RegRead("HKEY_CURRENT_USER\Software\aTest", "TestKey1")
MsgBox(0, '', $read)
; HKEY_CURRENT_USER\Software\aTest キー下にバイナリ値"TestKey2"を作成し、
; 値のデータに 0x01 を書き込みます。
RegWrite("HKEY_CURRENT_USER\Software\aTest", "TestKey2", "REG_BINARY", 0x01)
$read = RegRead("HKEY_CURRENT_USER\Software\aTest", "TestKey2")
MsgBox(0, '', $read)
; "HKEY_CURRENT_USER\Software\aTest1"キーのみを作成します。
RegWrite("HKEY_CURRENT_USER\Software\aTest1")
レジストリエディタを開き、メッセージボックスが表示されるたびにレジストリエディタをアクティブにし、F5キーで最新の情報に更新して追加されたキー、値を確認してみましょう。
レジストリ値の削除
それでは先ほど作成したキー、値を削除してみましょう。
; "HKEY_CURRENT_USER\Software\aTest"キー下の値"TestKey"を削除します。
RegDelete("HKEY_CURRENT_USER\Software\aTest", "TestKey")
MsgBox(0, '', '"aTestKey"値が削除されたか確認してみましょう。')
; "HKEY_CURRENT_USER\Software\aTest"キーを削除します。
RegDelete("HKEY_CURRENT_USER\Software\aTest")
MsgBox(0, '', '"aTest"キーが削除されたか確認してみましょう。')
; "HKEY_CURRENT_USER\Software\aTest1"キーを削除します。
RegDelete("HKEY_CURRENT_USER\Software\aTest1")
MsgBox(0, '', '"aTest1"キーが削除されたか確認してみましょう。')
値を削除する際に種類を指定する必要はありません。
名前を指定すれば、種類に関係なく削除されます。
コメント