同樣的問題,在普通用戶下訪問註冊表會出現無權限問題。此時的想法是在自己的軟件註冊鍵提升其權限,以方便用戶修改,包括密碼等一些信息。
代碼如下:(PS:按照預計的想法是提升其權限後,軟件運行結束後主恢復用戶本身權限,但結果只提升了,沒能恢復到原來的權限。知道的牛牛請多指點下,WIN7權限問題感覺好深奧)。
BOOL SetRegPrivilege(HKEY hKey, LPSTR SamName)
{
DWORD dwRet;
PACL pNewDacl = NULL, pOldDacl = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
// 獲取SAM主鍵的DACL
dwRet = GetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDacl, NULL, &pSD);
if (dwRet != ERROR_SUCCESS)
{
return FALSE;
}
// 創建一個ACE,允許Everyone完全控制對象,並允許子對象繼承此權限
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
BuildExplicitAccessWithName(&ea, "Administrators", KEY_ALL_ACCESS, SET_ACCESS,
SUB_CONTAINERS_AND_OBJECTS_INHERIT);
// 將新的ACE加入DACL
dwRet = SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl);
if (dwRet != ERROR_SUCCESS)
{
return FALSE;
}
// 更新SAM主鍵的DACL
dwRet = SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDacl, NULL);
if (dwRet != ERROR_SUCCESS)
{
return FALSE;
}
//釋放資源
if (pNewDacl)
LocalFree(pNewDacl);
// 還原SAM主鍵的DACL
// if (pOldDacl)
// SetNamedSecurityInfo(SamName, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
// NULL, NULL, pOldDacl, NULL);
if (pOldDacl)
LocalFree(pOldDacl);
if (pSD)
LocalFree(pSD);
return TRUE;
}