如何检查注册表中是否存在给定路径?

时间:2014-04-07 10:01:42

标签: winapi mfc

实际上我有Path = Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\RunSoftware\\Microsoft\\Windows\\CurrentVersion\\Run,我正在传递根密钥为HKEY_USESRS,我从中获得了子密钥。然后我就会失去子密钥+路径......在循环中我得到HKEY_USERS\S-1-5-19\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run实际上也没有在注册表中存在...是否有任何函数检查完整路径是否存在?

listData.RemoveAll();
        HKEY hrKey=HKEY_USERS,hKey; 
        if(hrKey==HKEY_USERS)
        {
            TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
            DWORD    cbName;                   // size of name string 
            TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
            DWORD    cchClassName = MAX_PATH;  // size of class string 
            DWORD    cSubKeys=0;               // number of subkeys 
            DWORD    cbMaxSubKey;              // longest subkey size 
            DWORD    cchMaxClass;              // longest class string 
            DWORD    cValues;              // number of values for key 
            DWORD    cchMaxValue;          // longest value name 
            DWORD    cbMaxValueData;       // longest value data 
            DWORD    cbSecurityDescriptor; // size of security descriptor 
            FILETIME ftLastWriteTime;      // last write time  
            DWORD i, retCode; 
            // Get the class name and the value count. 
        retCode = RegQueryInfoKey(hrKey,                    // key handle 
                             achClass,                // buffer for class name 
                            &cchClassName,           // size of class string 
                            NULL,                    // reserved 
                            &cSubKeys,               // number of subkeys 
                            &cbMaxSubKey,            // longest subkey size 
                            &cchMaxClass,            // longest class string 
                            &cValues,                // number of values for this key 
                            &cchMaxValue,            // longest value name 
                            &cbMaxValueData,         // longest value data 
                            &cbSecurityDescriptor,   // security descriptor 
                            &ftLastWriteTime);       // last write time 
            if (cSubKeys)
            {

                for (i=0; i<cSubKeys; i++) 
                { 
                    cbName = MAX_KEY_LENGTH;
                    retCode = RegEnumKeyEx(hrKey, i,achKey,&cbName,NULL,NULL,NULL,&ftLastWriteTime); 
                    if (retCode == ERROR_SUCCESS) 
                    {

                        CString subKey=achKey;
                        if(subKey!=_T(".DEFAULT")&&(subKey.Mid(subKey.ReverseFind('_')+1)!=_T("Classes")))
                        {                               
                            csRegistryPath=subKey+_T("\\")+csRegistryPath;
                            CLog::Log( csRegistryPath);
                        }
                    }
                }
            } 

csRegistryPath是调用函数中的数组然后一旦我将获得S-1-5-19\Software\Microsoft\Windows\CurrentVersion\RunS-1-5-19\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce基于此路径我正在执行进一步操作但实际上是HKEY_USERS \ S-1-5-19 \ Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ RunOnce在注册表中不存在如果获取此路径我需要检查这是否存在?要做到这一点是任何API

1 个答案:

答案 0 :(得分:0)

对于Win32 API解决方案,使用RegOpenKeyEx来测试是否存在密钥。

请注意,您不得硬编码Wow6432Node。使用KEY_WOW64_32KEY标志指定您要查看注册表的32位视图。

你想传递

STANDARD_RIGHTS_READ | KEY_WOW64_32KEY

samDesired的{​​{1}}参数。