從 32 位元應用程式存取 64 位元註冊表
挑戰:32 位元應用程式通常需要存取 64 位元登錄項,例如,擷取 SQL Server 執行個體詳細資訊。 但是,他們通常只訪問 Wow6432Node
分支。
解決方案:Windows 7 及更高版本提供透過 .NET Framework 4.x 或更高版本存取 64 位元登錄項目的內建支援。 關鍵是使用 RegistryView
列舉:
RegistryView.Registry64
:存取 64 位元註冊表。 RegistryView.Registry32
:存取 32 位元註冊表。 程式碼範例(直接 64 位元存取):
此程式碼片段示範了對 64 位元註冊表的直接存取:
<code class="language-csharp">using Microsoft.Win32; RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); RegistryKey sqlServerKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"); string sqlExpressKeyName = (string)sqlServerKey.GetValue("SQLEXPRESS"); </code>
更穩健的方法(輔助函數):
為了獲得更大的靈活性,這些輔助函數查詢 32 位元和 64 位元註冊表,合併結果:
<code class="language-csharp">using Microsoft.Win32; using System.Collections.Generic; using System.Linq; 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(string RegPath, string ValueName = "", RegistryHive hive = RegistryHive.LocalMachine) { return GetRegValue(RegistryView.Registry64, RegPath, ValueName, hive) ?? GetRegValue(RegistryView.Registry32, RegPath, ValueName, hive); } private static IEnumerable<string> GetRegValueNames(RegistryView view, string regPath, RegistryHive hive) { try { using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath)) { return key?.GetValueNames(); } } catch (Exception) { return null; } } private static object GetRegValue(RegistryView view, string regPath, string valueName, RegistryHive hive) { try { using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath)) { return key?.GetValue(valueName); } } catch (Exception) { return null; } }</code>
使用輔助函數:
此範例使用輔助函數:
<code class="language-csharp">var sqlRegPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"; foreach (var valueName in GetAllRegValueNames(sqlRegPath)) { var value = GetRegValue(sqlRegPath, valueName); Console.WriteLine($"{valueName}={value}"); }</code>
這種改進的方法可以處理潛在的異常,並提供更強大的解決方案來訪問註冊表信息,無論應用程式或註冊表項的體系結構如何。
以上是32位元應用程式如何存取64位元Windows註冊表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!