从x64程序中搜索x32注册表项

时间:2012-02-09 21:29:49

标签: c# .net windows registry 64-bit

我正在编写一个适用于x64的C#应用​​程序,我的问题是我在注册表中搜索包含某些关键字的某些键,并且我只能搜索注册表中的x64应用程序,因为注册表重定向。
我想在网上找到一些代码,但我真的不知道如何处理它,因为据我所知,只有当我在搜索模式或关键字时才知道确切的密钥名称才有效。         [DllImport(“advapi32.dll”,EntryPoint =“RegOpenKeyEx”)]         public static extern int RegOpenKeyEx_DllImport(             UIntPtr hKey,             string subKey,             uint选项,             int sam,             IntPtr phkResult);

    [DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
    static extern int RegQueryValueEx_DllImport(
        IntPtr hKey,
        string lpValueName,
        int lpReserved,
        out uint lpType,
        System.Text.StringBuilder lpData,
        ref uint lpcbData);

public string GetKeyValue(string strSubKey, string strKey)
    {

        UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
        const int KEY_WOW64_32KEY = 0x0200;
        const int KEY_QUERY_VALUE = 0x1;

        IntPtr hKeyVal;
        uint lpType;
        uint lpcbData = 0;
        System.Text.StringBuilder pvData = new System.Text.StringBuilder(1024);
        int valueRet;



        string returnPath = String.Empty;
        unchecked
        {
            try
            {   //Open the required key path
                valueRet = RegOpenKeyEx_DllImport(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, out hKeyVal);

                //Retreive the key value
                valueRet = RegQueryValueEx_DllImport(hKeyVal, strKey, 0, out lpType, pvData, ref lpcbData);

                valueRet = RegQueryValueEx_DllImport(hKeyVal, strKey, 0, out lpType, pvData, ref lpcbData);

                returnPath = pvData.ToString();
            }
            catch (Exception e)
            {
                throw (e);
            }
        }
        return returnPath;
    }

2 个答案:

答案 0 :(得分:2)

如果您的目标是.net 4,则有一个新增功能允许您在托管代码中指定32位注册表。您使用OpenBaseKey指定适当的RegistryView。

答案 1 :(得分:0)

您是否尝试过使用LogParser?以下是如何使用它来查询注册表的示例。

https://stackoverflow.com/a/295265/977292