gpt4 book ai didi

c++ - GetTokenInformation 基础知识

转载 作者:行者123 更新时间:2023-11-28 07:08:58 29 4
gpt4 key购买 nike

我一直试图让这个电话合作,但没有成功。

我正在尝试获取当前用户的 SID 值以获得用户的帐户权限(使用 LsaEnumerateAccountRights)。虽然我不知道为什么我对 GetTokenInformation 的调用返回 false。检索进程 token 没有错误。

到目前为止,这是我在该主题上的工作:

    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;
}

与此同时,我不妨问一个我还没有遇到的后续问题,如何从形成的 TOKEN_USER 结构中检索 SID?

对于这样一个简单的问题,我提前表示歉意,我只是被难住了,希望得到一些帮助才能继续。与这个问题相关的所有问题都复杂得多,对我当前的问题几乎没有任何见解。

提前致谢, 乔恩

最佳答案

根据documentation For GetTokenInformation ,如果函数失败,您可以通过调用 GetLastError 检索更多信息.

Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

所以你需要对扩展错误进行一些检查:

if (!GetTokenInformation(h_Token, TokenUser, &tp, cb, &dw_TokenLength))
{
int lastError = GetLastError();

// Should be a switch, of course. Omitted for brevity
if (lastError == ERROR_INSUFFICIENT_BUFFER)
{
//
}
}

作为一般经验法则,在使用具有不同缓冲区要求的 WinAPI 函数时,您通常

  • 使用 NULL 缓冲区调用函数以确定所需的缓冲区大小(在本例中,在 ReturnLength 参数中返回)
  • 分配指定大小的缓冲区
  • 再次调用该函数,传递分配的缓冲区,以获取信息

关于c++ - GetTokenInformation 基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21322307/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com