簡體   English   中英

C ++ REG_SZ到char *和讀取HKLM沒有提升權限

[英]C++ REG_SZ to char* and Reading HKLM without Elevated Permissions

所以我一直試圖從注冊表中獲取REG_SZ值並將其存儲為char *。 環顧互聯網后,這就是我想到的。 問題是我獲得的值不是存儲在注冊表中的值,我得到了一堆隨機垃圾。 我怎樣才能正確獲得價值?

HKEY hKey;
char value[256];
// Open the key
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\\", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
{
    return "";
}

// Read the value
DWORD dwType = REG_SZ;
DWORD dwCount = sizeof(value);
if(RegQueryValueEx(hKey, "ProcessorNameString", NULL, &dwType, (LPBYTE)&value, &dwCount) != ERROR_SUCCESS)
{
    RegCloseKey(hKey);
    return "";
}
// Cleanup and return
RegCloseKey(hKey);
return value;

另一個快速問題。 我記得如果我的程序運行作為Vista / 7的管理員然后它不能編輯HKLM但它仍然可以讀取它嗎?

更新 ,因為以前的答案是錯誤的。)

問題可能在於您正在回收value ,這是一個堆棧分配的緩沖區。 只有在你聲明你的函數返回一個char[256]才會起作用 - 如果你試圖返回一個char* ,那么調用者會得到value中第一個字節的地址,現在指向無效的堆棧數據。 您應該在堆上將value分配為char* ,這將允許您返回指針而不受懲罰。

是否允許您讀取或編輯注冊表項取決於您正在閱讀的密鑰應用了哪些ACL。 可以設置密鑰的權限,使得未經高速度的用戶甚至無法讀取密鑰,但也可以設置權限,以便所有用戶都可以讀取和寫入。 您上面閱讀的密鑰應該是所有用戶都可讀的,但除了管理員之外,它不會被修改。

如果您的申請沒有明顯,則可能會或可能不會閱讀真正的HKLM。 如果它曾試圖寫入HKLM注冊表,虛擬化將啟動並轉移寫入並讀取虛擬化的每用戶存儲。 當您不是管理員時,您可以閱讀HKLM,因此請務必添加帶有asInvoker的清單以防止虛擬化。

主要問題已經回答,但與您的訪問問題有關。 如果要對注冊表進行寫訪問,則必須添加清單文件以將進程提升為管理員。

  1. 您不應該返回非靜態本地聲明的變量; 嘗試將變量聲明為static char value[256]; ,這仍然是一個不好的做法,但可以解決你的問題;

  2. 如果你仍然得到垃圾,也許你正在編譯UNICODE定義。 如果是這樣,你調用RegQueryValueExW並且你得到一個寬字符串(沒有編譯時錯誤,因為參數被轉換為(LPBYTE) )。 嘗試禁用UNICODE或將字符串定義為TCHAR

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM