我一直試圖讓這個電話合作,但沒有成功。GetTokenInformation的基礎
我想獲取當前用戶的SID值,以獲得用戶的帳戶權限(使用LsaEnumerateAccountRights)。雖然我迷失在爲什麼我的GetTokenInformation調用返回false。檢索流程標記時沒有錯誤。
這裏是我的工作至今關於這個問題:
HANDLE h_Process;
HANDLE h_Token;
HANDLE h_retToken;
TOKEN_USER tp;
DWORD cb = sizeof(TOKEN_USER);
PDWORD ret;
DWORD dw_TokenLength;
h_Process = GetCurrentProcess();
if (OpenProcessToken(h_Process, TOKEN_READ, &h_Token) == FALSE)
{
printf("Error: Couldn't open the process token\n");
return -1;
}
if (GetTokenInformation(h_Token, TokenUser, &tp, cb, &dw_TokenLength) == FALSE)
{
printf("Error: Could not retrieve Token User information");
return -1;
}
並與它一起,我還不如問我還沒有遇到一個跟進的問題,如何從形成檢索SID TOKEN_USER結構?
對於這樣一個簡單的問題,我提前道歉,我只是難住,希望能夠繼續幫助。所有與這個問題有關的問題都要複雜得多,並且對我目前的問題沒有多大的瞭解。
在此先感謝,喬恩
那麼,好的呼叫緩衝區不足。爲什麼會發生這種錯誤?我遇到了這個問題,並且注意到顯然需要對這個方法進行兩次調用([link](http://stackoverflow.com/questions/3670984/gettokeninformation-first-call-what-for)),不明白需要兩個電話。此外,爲什麼DWORD cb = sizeof(TOKEN_USER)沒有提供足夠的內存分配/緩衝區? – Jon
發生錯誤是因爲緩衝區不足。 :-)它的內容不夠大。我再次向您推薦文檔。如果函數失敗,則將'ReturnLength'參數設置爲所需緩衝區的大小,以便分配足夠的內存並再次調用該函數。許多具有可變緩衝區要求的API調用的一般規則是「使用NULL緩衝區調用函數一次,以確定所需的緩衝區大小,分配內存,然後再次調用它以實際檢索信息」。 –
我會盡量回答你的實際問題。 Windows經常這樣做的原因是「首先調用大小」是struct結構版本的變化。當你編譯時,編譯器知道它的結構是什麼時候(編譯器)被釋放。在編譯器之前或之後的操作系統上運行應用程序時,該結構可能已由MS更改並具有更多或更少的字段。這隻能在運行時才能知道,所以這就是爲什麼他們會返回該代碼並讓您再次嘗試。你不會知道多餘的字節是什麼,所以你通常會忽略它們。 – user2957811