DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

レジストリへの書き込み、読み込み、削除を行う

ここでは、レジストリから値を読み込む、レジストリに値を書き込む、レジストリの値やキーを削除する方法を紹介します。レジストリの操作全般は、RegistryKeyクラスを使って行うことができます。

レジストリに書き込む

まずはじめにレジストリに書き込む例を示します。RegistryKey.CreateSubKeyメソッドでキーを開き、RegistryKey.SetValueメソッドで書き込みます。

次の例では、レジストリのキー"HKEY_CURRENT_USER\Software\test\sub"にデータを書き込んでいます。

VB.NET
コードを隠すコードを選択
'キー(HKEY_CURRENT_USER\Software\test\sub)を開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\test\sub")
'上のコードでは、指定したキーが存在しないときは新しく作成される。
'作成されないようにするには、次のようにする。
'Dim regkey As Microsoft.Win32.RegistryKey = _
'   Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", True)

'レジストリに書き込み
'文字列を書き込む(REG_SZで書き込まれる)
regkey.SetValue("string", "StringValue")
'整数(Int32)を書き込む(REG_DWORDで書き込まれる)
regkey.SetValue("int", 100)
'文字列配列を書き込む(REG_MULTI_SZで書き込まれる)
Dim s As String() = New String() {"1", "2", "3"}
regkey.SetValue("StringArray", s)
'バイト配列を書き込む(REG_BINARYで書き込まれる)
Dim bs As Byte() = New Byte() {0, 1, 2}
regkey.SetValue("Bytes", bs)

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//キー(HKEY_CURRENT_USER\Software\test\sub)を開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");
//上のコードでは、指定したキーが存在しないときは新しく作成される。
//作成されないようにするには、次のようにする。
//Microsoft.Win32.RegistryKey regkey =
//    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true);

//レジストリに書き込み
//文字列を書き込む(REG_SZで書き込まれる)
regkey.SetValue("string", "StringValue");
//整数(Int32)を書き込む(REG_DWORDで書き込まれる)
regkey.SetValue("int", 100);
//文字列配列を書き込む(REG_MULTI_SZで書き込まれる)
string[] s = new string[] { "1", "2", "3" };
regkey.SetValue("StringArray", s);
//バイト配列を書き込む(REG_BINARYで書き込まれる)
byte[] bs = new byte[] { 0, 1, 2 };
regkey.SetValue("Bytes", bs);

//閉じる
regkey.Close();

レジストリエディタで見ると、"HKEY_CURRENT_USER\Software\test\sub"に次のように書き込まれます。
レジストリエディタ

なお、「(既定)」「(標準)」に書き込むには、SetValueメソッドで値の名前に空白文字列""、または、Nothing(C#では、null)を指定します。

補足:Int32型以外の整数は、REG_SZで書き込まれます。REG_DWORDで書き込まれるようにするには、Int32型に変換するか、「データ型を指定して書き込む」の方法を使ってください。

例えば、UInt32型の整数をREG_DWORDで書き込むためにInt32型に変換するには、「BitConverter.ToInt32(BitConverter.GetBytes(uintValue), 0)」としたり、C#であれば、「unchecked((int)uintValue)」とする方法があります。

負のInt32型整数は、REG_DWORDで書き込まれます。例えば -1 は、REG_DWORD で 0xffffffff と書き込まれます。ただしこのようにして書き込まれた値は、「レジストリから読み込む」のようにGetValueメソッドでInt32型として読み込めば元のまま負の整数として取得できますので、通常は特に気にする必要はありません。
補足:レジストリのキーを開くためにCreateSubKeyを使うか、OpenSubKeyを使うか迷うかもしれませんが、OpenSubKeyは指定のない限り読み取り専用で開くため、レジストリに書き込むときはCreateSubKeyで開き、読み取るときはOpenSubKeyで開くというのが基本となるでしょう。

データ型を指定して書き込む

.NET Framework 2.0からは、SetValueメソッドの3番目のパラメータにより、レジストリデータ型を指定して書き込むことができます。書き込もうとしている値が指定されたデータ型と一致しない場合は、エラーが発生します。

下にREG_EXPAND_SZとREG_QWORDで書き込む例を示します。

VB.NET
コードを隠すコードを選択
'キー(HKEY_CURRENT_USER\Software\test\sub)を開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\test\sub")

'REG_EXPAND_SZで書き込む
regkey.SetValue("ExpandString", "%windir%", _
    Microsoft.Win32.RegistryValueKind.ExpandString)
'REG_QWORDで書き込む
regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord)

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//キー(HKEY_CURRENT_USER\Software\test\sub)を開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");

//REG_EXPAND_SZで書き込む
regkey.SetValue("ExpandString", "%windir%",
    Microsoft.Win32.RegistryValueKind.ExpandString);
//REG_QWORDで書き込む
regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord);

//閉じる
regkey.Close();

SetValueメソッドの3番目のパラメータに指定できるRegistryValueKind列挙体のメンバとその意味は、次のようなものです(MSDNからの抜粋)。

RegistryValueKind列挙体のメンバ名 説明
Binary バイナリデータ。Win32 APIのREG_BINARYに相当。
DWord 32ビットのバイナリ数値。0x00000000〜0xFFFFFFFF(0〜4294967295)の値。Win32 APIのREG_DWORDに相当。
ExpandString 値を取得するときに展開される環境変数(%PATH%など)を含む文字列。Win32 APIのREG_EXPAND_SZに相当。
MultiString 文字列の配列。Win32 APIのREG_MULTI_SZに相当。
QWord 64ビットのバイナリ数値。0x0000000000000000〜0xFFFFFFFFFFFFFFFF(0〜18446744073709551615)の値。Win32 APIのREG_QWORDに相当。
String 文字列。Win32 APIのREG_SZに相当。
Unknown Win32 APIのREG_RESOURCE_LISTのような、サポートされていないレジストリ データ型。既定値。

静的メソッドを利用する

.NET Framework 2.0からは、静的メソッドのRegistry.SetValueを使ってレジストリに書き込むことができます。このメソッドは内部で、RegistryKey.CreateSubKeyでキーを開き、SetValueで書き込み、Closeで閉じています。

VB.NETでは、My.Computer.Registry.SetValueメソッドでレジストリに書き込むこともできます。このメソッドは、Registry.SetValueメソッドを呼び出しているだけです。

VB.NET
コードを隠すコードを選択
Microsoft.Win32.Registry.SetValue(
    "HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue")

My.Computer.Registry.SetValue(
    "HKEY_CURRENT_USER\Software\test\sub", "int", 100)
C#
コードを隠すコードを選択
Microsoft.Win32.Registry.SetValue(
    @"HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue");

レジストリから読み込む

次にレジストリから値を読み込む方法を紹介します。RegistryKey.OpenSubKeyメソッドでキーを開き、RegistryKey.GetValueメソッドで読み込みます。

次の例では、「レジストリに書き込む」で書き込んだ値を取得しています。

VB.NET
コードを隠すコードを選択
'キー(HKEY_CURRENT_USER\Software\test\sub)を読み取り専用で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)
'キーが存在しないときは null が返される
If regkey Is Nothing Then
    Return
End If

'文字列を読み込む
'指定した名前の値が存在しないときは null が返される
Dim stringValue As String = DirectCast(regkey.GetValue("string"), String)
'キーに値が存在しないときに指定した値を返すようにするには、次のようにする
'(ここでは"default"を返す)
'Dim stringValue As String = DirectCast(regkey.GetValue("string", "default"), String)

'整数(REG_DWORD)を読み込む
Dim intValue As Integer = CInt(regkey.GetValue("int"))
'整数(REG_QWORD)を読み込む
Dim longVal As Long = CLng(regkey.GetValue("QWord"))
'文字列配列を読み込む
Dim strings As String() = DirectCast(regkey.GetValue("StringArray"), String())
'バイト配列を読み込む
Dim bytes As Byte() = DirectCast(regkey.GetValue("Bytes"), Byte())

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//キー(HKEY_CURRENT_USER\Software\test\sub)を読み取り専用で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
//キーが存在しないときは null が返される
if (regkey == null) return;

//文字列を読み込む
//指定した名前の値が存在しないときは null が返される
string stringValue = (string)regkey.GetValue("string");
//キーに値が存在しないときに指定した値を返すようにするには、次のようにする
//(ここでは"default"を返す)
//string stringValue = (string) regkey.GetValue("string", "default");

//整数(REG_DWORD)を読み込む
int intValue = (int)regkey.GetValue("int");
//整数(REG_QWORD)を読み込む
long longVal = (long)regkey.GetValue("QWord");
//文字列配列を読み込む
string[] strings = (string[])regkey.GetValue("StringArray");
//バイト配列を読み込む
byte[] bytes = (byte[])regkey.GetValue("Bytes");

//閉じる
regkey.Close();

なお、「(既定)」「(標準)」から読み取るには、GetValueメソッドで値の名前に空白文字列""、または、Nothing(C#では、null)を指定します。

補足:REG_DWORDの値がInt32.MaxValue(0x7FFFFFFF)より大きい場合は、負の整数として取得されます。例えば、0xFFFFFFFF は -1 となります。

例えば、REG_DWORDの値をInt32型として取得した後、UInt32型に変換するには、「BitConverter.ToUInt32(BitConverter.GetBytes(intValue), 0)」としたり、C#であれば、「unchecked((uint)intValue)」とする方法があります。

静的メソッドを利用する

.NET Framework 2.0からは、静的メソッドのRegistry.GetValueを使ってレジストリから値を読み込むことができます。このメソッドは内部で、RegistryKey.OpenSubKeyでキーを開き、GetValueで読み取り、Closeで閉じています。

値が見つからなかった場合は、3番目のパラメータに指定した既定値が返されます。キーが見つからなかった場合は、null(VB.NETでは、Nothing)が返されます。

VB.NETでは、My.Computer.Registry.GetValueメソッドでレジストリから値を読み込むこともできます。このメソッドは、Registry.GetValueメソッドを呼び出しているだけです。

VB.NET
コードを隠すコードを選択
Dim stringValue As String = DirectCast( _
    Microsoft.Win32.Registry.GetValue( _
        "HKEY_CURRENT_USER\Software\test\sub", "string", "default"), String)

Dim intValue As Integer = CInt( _
    Microsoft.Win32.Registry.GetValue( _
        "HKEY_CURRENT_USER\Software\test\sub", "int", 0))
C#
コードを隠すコードを選択
string stringValue = (string)Microsoft.Win32.Registry.GetValue(
    @"HKEY_CURRENT_USER\Software\test\sub", "string", "default");

指定したキーにあるすべてのキーと値の名前を取得する

指定したキーにあるすべてのキーを取得するには、RegistryKey.GetSubKeyNamesメソッドを使います。また、指定したキーにあるすべての値の名前を取得するには、RegistryKey.GetValueNamesメソッドを使います。

VB.NET
コードを隠すコードを選択
'キーを読み取り専用で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)

'subキーにあるキーの数を表示
Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount)
'subキーにあるすべてのキー名を取得
Dim keyNames() As String = regkey.GetSubKeyNames() 
'表示する
Dim k As String
For Each k In keyNames
    Console.WriteLine(k)
Next

'subキーにある値の数を表示
Console.WriteLine("値の数:{0}", regkey.ValueCount)
'subキーにあるすべての値の名前を取得
Dim valueNames() As String = regkey.GetValueNames() 
'表示する
Dim v As String
For Each v In valueNames
    Console.WriteLine(v)
Next

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//キーを読み取り専用で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);

//subキーにあるキーの数を表示
Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount);
//subキーにあるすべてのキー名を取得
string[] keyNames = regkey.GetSubKeyNames();
//表示する
foreach (string k in keyNames)
{
    Console.WriteLine(k);
}

//subキーにある値の数を表示
Console.WriteLine("キーの値の数:{0}", regkey.ValueCount);
//subキーにあるすべての値の名前を取得
string[] valueNames = regkey.GetValueNames();
//表示する
foreach (string v in valueNames)
{
    Console.WriteLine(v);
}

//閉じる
regkey.Close();

値の種類を調べる

.NET Framework 2.0からは、REG_SZやREG_DWORDなどの値の種類を、GetValueKindメソッドを使ってRegistryValueKind列挙体として取得することができます。なおRegistryValueKind列挙体については、「データ型を指定して書き込む」をご覧ください。

VB.NET
コードを隠すコードを選択
'キーを読み取り専用で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)

'"string"の値がREG_SZか調べる
If regkey.GetValueKind("string") = Microsoft.Win32.RegistryValueKind.String Then
    'REG_SZだった時は、String型として取得する
    Dim stringValue As String = DirectCast(regkey.GetValue("string"), String)
End If

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//キーを読み取り専用で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);

//"string"の値がREG_SZか調べる
if (regkey.GetValueKind("string") == Microsoft.Win32.RegistryValueKind.String)
{
    //REG_SZだった時は、String型として取得する
    string stringValue = (string)regkey.GetValue("string");
}

//閉じる
regkey.Close();

REG_EXPAND_SZ型のデータを展開せずに取得する

.NET Framework 2.0からは、GetValueメソッドの3番目のパラメータにRegistryValueOptions.DoNotExpandEnvironmentNamesを指定することにより、環境変数を展開せずに値を取得できます。

VB.NET
コードを隠すコードを選択
'レジストリからの読み取り
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)
If regkey Is Nothing Then
    Return
End If

'REG_EXPAND_SZデータ型の値を取得する
Dim stringValue As String
'展開して取得する
stringValue = CStr(regkey.GetValue("ExpandString"))
Console.WriteLine(stringValue)
'展開せずに取得する
stringValue = CStr(regkey.GetValue("ExpandString", "", _
    Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames))
Console.WriteLine(stringValue)

'閉じる
regkey.Close()
C#
コードを隠すコードを選択
//レジストリからの読み取り
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
if (regkey == null) return;

//REG_EXPAND_SZデータ型の値を取得する
string stringValue;
//展開して取得する
stringValue = (string)regkey.GetValue("ExpandString");
Console.WriteLine(stringValue);
//展開せずに取得する
stringValue = (string)regkey.GetValue("ExpandString", "",
    Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames);
Console.WriteLine(stringValue);

//閉じる
regkey.Close();

レジストリを削除する

最後にレジストリのキーまたは値を削除する方法を紹介します。キーにある値を削除するには、RegistryKey.DeleteValueメソッドを使用します。キーの削除は、DeleteSubKeyまたはDeleteSubKeyTreeメソッドで行います。DeleteSubKeyは削除しようとするキーにサブキーが存在すると削除に失敗しますが、DeleteSubKeyTreeはサブキーもろとも削除します。

VB.NET
コードを隠すコードを選択
'レジストリの削除
'キーを書き込み許可で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test", True)

'キーにある値の削除
'"HKEY_CURRENT_USER\Software\test"にある"string"という値を削除する
regkey.DeleteValue("string")
'次のようにすると指定した値が見つからなくてもエラーが出ない
'regkey.DeleteValue("string", False)

'キーを削除(子のサブキーがあるとエラーになる)
'"HKEY_CURRENT_USER\Software\test\sub"を削除する
regkey.DeleteSubKey("sub")
'次のようにすると指定したキーが見つからなくてもエラーが出ない
'regkey.DeleteSubKey("sub", False)

'閉じる
regkey.Close()

'キーとそのツリーを根こそぎ削除
'"HKEY_CURRENT_USER\Software\test"を削除する
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree("Software\test")
C#
コードを隠すコードを選択
//レジストリの削除
//キーを書き込み許可で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test", true);

//キーにある値の削除
//"HKEY_CURRENT_USER\Software\test"にある"string"という値を削除する
regkey.DeleteValue("string");
//次のようにすると指定した値が見つからなくてもエラーが出ない
//regkey.DeleteValue("string", false);

//キーを削除(子のサブキーがあるとエラーになる)
//"HKEY_CURRENT_USER\Software\test\sub"を削除する
regkey.DeleteSubKey("sub");
//次のようにすると指定したキーが見つからなくてもエラーが出ない
//regkey.DeleteSubKey("sub", false);

//閉じる
regkey.Close();

//キーとそのツリーを根こそぎ削除
//"HKEY_CURRENT_USER\Software\test"を削除する
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree(@"Software\test");
  • 履歴:
  • 2007/2/24 「データ型を指定して書き込む」、「REG_EXPAND_SZ型のデータを展開せずに取得する」を追加。
  • 2010/6/27 「値の種類を調べる」を追加。UInt32とInt32の変換など、説明を書き足した。
  • 2011/11/27 静的メソッドを利用した方法を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、レジストリへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。