.NET Framework 4.xを使用している64ビットWindowsでは、レジストリへのアクセスがネイティブでサポートされています。次のコードは、 Windows 7,64ビット および Windows 10,64ビットでテストされています。 64ビットレジストリにアクセスするには、使用することができます:
string value64 = string.Empty;
RegistryKey localKey =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null)
{
value64 = localKey.GetValue("RegisteredOrganization").ToString();
}
Console.WriteLine(String.Format("RegisteredOrganization [value64]: {0}",value64));
をあなたは32ビットのレジストリにアクセスする場合は、使用:
string value32 = string.Empty;
RegistryKey localKey32 =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry32);
localKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey32 != null)
{
value32 = localKey32.GetValue("RegisteredOrganization").ToString();
}
Console.WriteLine(String.Format("RegisteredOrganization [value32]: {0}",value32));
を混同しないでください、両方のバージョンがあります最初のパラメータとしてMicrosoft.Win32.RegistryHive.LocalMachine
を使用する場合は、の64ビットまたはの32ビットのをの2番目のパラメータ(RegistryView.Registry64
対RegistryView.Registry32
)。
注 64ビットWindowsの
すなわち、HKEY_LOCAL_MACHINE\Software\Wow6432Node
は、64ビットシステム上で実行されている32ビットのアプリケーションによって使用される値を含みます。真の64ビットアプリケーションだけがHKEY_LOCAL_MACHINE\Software
に値を直接格納します。サブツリーWow6432Node
は32ビットアプリケーションでは完全にトランスペアレントですが、32ビットアプリケーションでは期待通りにHKEY_LOCAL_MACHINE\Software
と表示されます(これはリダイレクトの一種です)。古いバージョンのWindowsおよび32ビットのWindows 7(およびVista 32ビット)では、サブツリーWow6432Node
は明らかにではなく、が存在します。
Windows 7(64ビット)のバグのため、32ビットのソースコードバージョンは、64ビットのソースコードバージョンが正しい組織を返す一方、登録した組織に関係なく常に「Microsoft」を返します。
バックあなたが提供してきた例に来
、それを64ビットの枝にアクセスするには、以下の方法の操作を行います。
RegistryKey localKey =
RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,
RegistryView.Registry64);
RegistryKey sqlServerKey = localKey.OpenSubKey(
@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL");
string sqlExpressKeyName = (string) sqlServerKey.GetValue("SQLEXPRESS");
更新:
私は思います興味深いアプローチを追加したいのですが、私は彼のアプローチを使っていくつかの便利な機能を開発するために取り上げたコメントに示唆しています。状況によっては、 32ビットか64ビットかにかかわらずすべてのキーを元に戻すことができます。 SQLインスタンス名はそのような例です。次のように(C#6以上)その場合のユニオンクエリを使用することができます。
public static IEnumerable<string> GetRegValueNames(RegistryView view, string regPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
return RegistryKey.OpenBaseKey(hive, view)
?.OpenSubKey(regPath)?.GetValueNames();
}
public static IEnumerable<string> GetAllRegValueNames(string RegPath,
RegistryHive hive = RegistryHive.LocalMachine)
{
var reg64 = GetRegValueNames(RegistryView.Registry64, RegPath, hive);
var reg32 = GetRegValueNames(RegistryView.Registry32, RegPath, hive);
var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32);
return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x);
}
public static object GetRegValue(RegistryView view, string regPath, string ValueName,
RegistryHive hive = RegistryHive.LocalMachine)
{
return RegistryKey.OpenBaseKey(hive, view)
?.OpenSubKey(regPath)?.GetValue(ValueName);
}
public static object GetRegValue(string RegPath, string ValueName,
RegistryHive hive = RegistryHive.LocalMachine)
{
return GetRegValue(RegistryView.Registry64, RegPath, ValueName, hive)
?? GetRegValue(RegistryView.Registry32, RegPath, ValueName, hive);
}
今、あなたは、単に次のように上記の機能を使用することができます。
var sqlRegPa[email protected]"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL";
foreach (var valueName in GetAllRegValueNames(sqlRegPath))
{
var value=GetRegValue(sqlRegPath, valueName);
Console.WriteLine($"{valueName}={value}");
}
あなたのリストを与えるであろうsqlRegPathの値の名前と値の
SQLサーバーは32ビットまたは64ビットとしてインストールできるため、関数にはNULLの処理が必要であることに注意してください。関数はオーバーロードされているため、必要に応じて32ビットまたは64ビットのパラメータを渡すことができます。ただし、省略した場合は64ビットを読み取ろうとしますが、失敗した場合(null値)、32ビットの値を読み取ります。 GetAllRegValueNames
は通常(上記の例を参照)、ループコンテキストで使用されるため、それはforeach
ループを簡単にするために、空の列挙というnull
よりを戻す:
ここで1軒あり、それはそのように処理されない場合には、ループは接頭辞としてnull
のif
ステートメントをチェックする必要があります。これは処理が面倒です。そのため、関数内で一度処理されます。
nullについてどうして迷惑ですか?気にしない場合は、なぜあなたのコードにnull参照例外がスローされたのかを見つけ出すことが、より多くの頭を悩ますことになります。そして、それが実際に生産された場合は、ログファイルやイベントログを勉強することが非常に忙しいでしょう(私はあなたがログを実装していることを願っています)。演算子?.
,?[
... ]
および??
は、多くのお手伝いをいたします(上記のコードを参照してください)。
ヒント:あなたはWindowsですべての例をテストするためにLinqpadの無料版を使用することができます。それはインストールを必要としません。F4を押して、名前空間のインポートタブにMicrosoft.Win32
と入力することを忘れないでください。 Visual Studioでは、コードの先頭にusing Microsoft.Win32;
が必要です。
ヒント:は試してみる(およびデバッグ)、新しいヌル取扱事業者に慣れるためにLinqPadに次のコード:
string[] test { get { return null;} } // property used to return null
void Main()
{
test.Dump(); // output: null
// "elvis" operator:
test?.Dump(); // output:
// "elvis" operator for arrays
test?[0].Dump(); // output:
(test?[0]).Dump(); // output: null
// combined with null coalescing operator (brackets required):
(test?[0]??"<null>").Dump(); // output: "<null>"
}
あなたが興味を持っている場合、hereはいくつかありますあなたがツールで何ができるのかをまとめた例を示します。
感謝を。メモリから、私が質問を投稿したときに.NET 3.5を使用していたと思うが、.NET 4が状況を改善していることを知ってよかった。 –
よろしくお願いします。最近私が解決した64ビットレジストリにも同様の問題があったので、解決策を共有する価値があると思いました。 – Matt
これはまさに私が探していたものです。私はWindows 9.1でこれをやっているし、それは素晴らしい作品です。 –