.net column

.NET開発者のためのブログメディア

C#でレジストリを操作する方法をわかりやすく解説!

2020年08月24日
SE
C#でレジストリの操作ができると聞いたのですが、難しそうな感じがします。
PM
C#でアプリを作るには必要な知識です。入門編からみていきましょう。

レジストリとは

レジストリとは、Windowsの様々な設定値が登録されているデータベースです。このレジストリに対してC#で読み取り・書き込み・削除をすることができます。

レジストリには、アプリケーションの設定値を登録することができるので、C#でWindowsアプリを作る場合は、レジストリへのアクセスは必須の知識と言えるでしょう。

ただし、レジストリはWindowsの動作にかかわる重要な設定が登録されているため、レジストリにアクセスする時は細心の注意を払ってください。もし、誤るとWindowsが誤動作してしまいます。

Windows10のレジストリ操作方法

C#でレジストリを操作する方法を説明する前に、Window10の機能で手動で操作する方法を確認しておきましょう。まず、左下のスタートボタンを右クリックします。次に「ファイル名を指定して実行」を左クリックします。そして「regedit」と入力してください。

これでレジストリエディターが起動します。エクスプローラーのような見た目で、左側を見るとツリー構造になっているのがわかります。

左側にあるツリーのSOFTWAREなどの各項目を「キー(Key)」と言います。右側は名前・種類・データとなっていますが、これは「値(Value)」です。このような構成でWindowsに必要な情報がレジストリに格納されているのです。

レジストリの中身を取得する

C#でレジストリの値を取得する方法は以下の通りです。これを実行する場合、ソースの先頭に「using Microsoft.Win32;」を記述してください。それでもエラーが出る場合は、エラー箇所を右クリックして、Microsoft.Win32.Registryのパッケージをインストールしてください。

RegistryKey key = Registry.LocalMachine.OpenSubKey(“”SOFTWARE\\Microsoft\\Windows\\Notepad\\Capabilities””);
Console.WriteLine(key.GetValue(“”ApplicationName””));
key.Close();

レジストリの値の取得は簡単

上のC#サンプルを実行すると、以下のように表示されます。

@C:\WINDOWS\system32\NOTEPAD.EXE,-9

Windowsでテキストファイルの編集によく使われるメモ帳の場所が表示されます。このようにレジストリの値の参照は簡単にできます。値を読むだけなら、Windowsの動作がおかしくなることはないでしょう。

レジストリの値の名前を列挙する

上のC#サンプルは値の名前が分かっている場合のやり方ですが、レジストリのあるキーの場所に、どんな名前の値があるかを知りたい場合はどうすればいいのでしょうか。その時は以下のようにします。

RegistryKey key = Registry.LocalMachine.OpenSubKey(“”SOFTWARE\\Microsoft\\Windows\\Notepad\\Capabilities””);
string[] names = key.GetValueNames();
key.Close();
foreach (string n in names)
{
Console.WriteLine(n);
}

下位層のキー名も取得できる

上のC#サンプルを実行すると以下のように表示されます。

ApplicationDescription
ApplicationName

メモ帳はこの2つの名前の値を持っているということですね。これで名前を指定してGetValueで値を取得できます。

またkey.GetValueNames()を以下のように変えると、下位にあるキー名を取得できます。

string[] names = key.GetSubKeyNames();

これを実行するとCapabilitiesの下にあるキーのFileAssociationsが表示されます。

レジストリの値を更新する

レジストリに新たにキーと値を追加するには、どのようにすればいいのでしょうか。以下がそのC#サンプルです。なおレジストリは間違った個所を更新すると危険なので、自信が無い人はこれ以後はサンプルを読むだけにしましょう。

RegistryKey key = Registry.LocalMachine.CreateSubKey(“”SOFTWARE\\TestWork\\Test””);
key.SetValue(“”TestName””, “”TestValue””);
key.Close();

レジストリ更新は管理者権限が必要

通常の設定でVisualStudioで上のC#サンプルを実行すると、UnauthorizedAccessExceptionが発生します。対処方法は、まずソリューションエクスプローラーを右クリックして、追加→新しい項目を左クリックします。

そしてアプリケーション マニフェストファイルを選択します。するとXMLファイルが開かれます。その中の
<requestedExecutionLevel level=””asInvoker”” uiAccess=””false”” />
を、
<requestedExecutionLevel level=””requireAdministrator”” uiAccess=””false”” />
に書き換えます。

レジストリの更新は十分に注意する

上記を行なった後にプログラムを実行すると、VisualStudioを再起動する必要があると表示されるのでその通りにします。はい・いいえの確認ではいを選び、そのまましばらく待つと、管理者権限でVisualStudioが再起動します。これでようやくレジストリを更新できるようになります。

管理者権限で実行してレジストリエディタで確認すると、SOFTWAREにTestWork/Testというキーができて、その中にTestNameとTestValueがあるのが分かります。

レジストリはWindowsの重要なデータベースのため、このようなセキュリティがかかっているのです。

レジストリの値の更新

レジストリにすでにある値を更新するにはどうしたらよいのでしょうか。以下のC#サンプルのようにします。

RegistryKey key = Registry.LocalMachine.OpenSubKey(“”SOFTWARE\\TestWork\\Test””,true);
key.SetValue(“”TestName””, “”TestValue2″”);
key.Close();

書き込み可モードで更新する

上のサンプルではキーを新しく作る時に使ったCreateSubKeyではなく、OpenSubKeyを使っています。2つ目の引数にtrueを指定していますが、これは書き込み可で開くという意味です。

実行してレジストリエディタで確認すると、TestNameの値がTestValue2になっているのがわかります。

では最後に、レジストリの値を削除したい場合はどうすればよいのでしょうか。次のC#サンプルを実行してください。

RegistryKey key = Registry.LocalMachine.OpenSubKey(“”SOFTWARE\\TestWork\\Test\\””,true);
key.DeleteValue(“”TestName””);
key.Close();

上のサンプルを実行すると、TestNameが消えます。さらに以下のようにすればキーを消すこともできます。

RegistryKey key = Registry.LocalMachine.OpenSubKey(“”SOFTWARE\\TestWork\\””, true);
key.DeleteSubKey(“”Test””);
key.Close();

なお今回作ったTestWorkやTestといったキーはレジストリエディタで消しておくと良いでしょう。ただしその時は間違えて別のキーを消さないように十分注意してください。

SE
間違えると誤作動の原因になるんですね。
PM
はい。レジストリとはデータベースですから、更新には細心の注意が必要です。

レジストリの更新は十分に注意して行おう

C#でレジストリを操作する方法について説明しましたがご理解いただけたでしょうか。レジストリを間違えて更新することが無いように、細心の注意を払いましょう。

 


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)