C# で Registry 操作
◆ フォルダ = key
◆ エントリ = value
◆ value の読み書きだけなら単純に key, name, value の指定でできる
◆ key の作成や key, value の削除・一覧取得になると RegistryKey の操作が必要になる
◆ エントリ = value
◆ value の読み書きだけなら単純に key, name, value の指定でできる
◆ key の作成や key, value の削除・一覧取得になると RegistryKey の操作が必要になる
key と value
レジストリの key と value はちょっと変わってますJSON みたいに key に対してひとつ value があるものとは違います
レジストリエディタのそれぞれのフォルダのパスのことが key と呼ばれます
フォルダを指定したときに右側に出てくるファイル一覧のような部分のそれぞれが value と呼ばれます
ファイル名のことは name (value name) になります
「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName」
なら
key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
name:
ProductName
value:
Windows 10 Pro
という感じです
value の読み書き
key と name の 2 つにわけて指定することになります一見フォルダとファイルなのにちょっとわかりづらいです
なのでファイルの読み書き風にできるようにしてみました
private static string getRegistryValue(string path)
{
var key = Path.GetDirectoryName(path);
var valuename = Path.GetFileName(path);
return Registry.GetValue(key, valuename, null)?.ToString();
}
public static void setRegistryValue(string path, object value)
{
var key = Path.GetDirectoryName(path);
var valuename = Path.GetFileName(path);
Registry.SetValue(key, valuename, value);
}
Console.WriteLine(getRegistryValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName"));
// Windows 10 Pro
setRegistryValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont\932.1", "meiryoke_console");
読み取りなら問題ないですが 書き込みでは管理者でないと「アクセスが拒否されました」と例外が発生します
もっと複雑な操作
value の読み書きは簡単にできたのですが key を追加したり 削除したりするには RegistryKey を操作しないといけませんRegistry.LocalMachine や Registry.CurrentUser が RegistryKey のインスタンスです
それらを元に OpenSubKey メソッドで目的のキーを開いて キーに対して CreateSubKey や DeleteSubKey などを行います
試しに適当にやってみます
> using Microsoft.Win32;
> var key = Registry.ClassesRoot.CreateSubKey("TEST", true);
> key
[HKEY_CLASSES_ROOT\TEST]
> var key2 = key.CreateSubKey("SUBTEST", true);
> key2.CreateSubKey("TEST01");
> key2.CreateSubKey("TEST02");
> key2.CreateSubKey("TEST03");
> key2.SetValue("NAME01", "VALUE01");
> key2.SetValue("NAME02", "VALUE02");
> key2.ValueCount
2
> key2.SubKeyCount
3
> key2.DeleteValue("NAME01");
> key2.DeleteSubKey("TEST01");
HKEY_CLASSES_ROOT に TEST という key を作って その中に SUBTEST というキーを作りました
そこに TEST01 ~ TEST03 の key と NAME01 と NAME02 の value を作りました
ValueCount と SubKeyCount でちゃんとカウントが取れてます
その後 NAME01 と TEST01 を削除しました
この状態をレジストリエディタで見るとこうなってました
直接ルートの HKEY_CLASSES_ROOT から subkey を作り始めたので OpenSubKey を使ってなかったので使ってみます
> var key22 = Registry.ClassesRoot.OpenSubKey(@"TEST\SUBTEST");
> key22.GetValueNames()
string[1] { "NAME02" }
> key22.GetSubKeyNames()
string[2] { "TEST02", "TEST03" }
> Registry.ClassesRoot.DeleteSubKeyTree("TEST");
OpenSubKey では一階層ずつ開く必要はなくパス形式の指定で一気に深い階層を開けます
ValueNames と SubKeyNames を確認してもちゃんと開けてることがわかります
最後に TEST 以下のツリー全体を消してテスト用に作ったものを全部消しています
レジストリエディタからも完全に消えました