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

- システム
エンジニア - C#でレジストリの操作ができると聞いたのですが、難しそうな感じがします。
- プロジェクト
マネージャー - 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といったキーはレジストリエディタで消しておくと良いでしょう。ただしその時は間違えて別のキーを消さないように十分注意してください。
- システム
エンジニア - 間違えると誤作動の原因になるんですね。
- プロジェクト
マネージャー - はい。レジストリとはデータベースですから、更新には細心の注意が必要です。
レジストリの更新は十分に注意して行おう
C#でレジストリを操作する方法について説明しましたがご理解いただけたでしょうか。レジストリを間違えて更新することが無いように、細心の注意を払いましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)