gpt4 book ai didi

c++ - 当 ReferencedDomainName 为 NULL 时出现 LookupAccountName 错误

转载 作者:可可西里 更新时间:2023-11-01 09:47:10 24 4
gpt4 key购买 nike

如果我不将可选的 ReferencedDomainName 保存在变量中,该函数将返回 false,并且我无法检索使用过的 Sid。如果文档说它是可选的,为什么我还需要包括它?这是我的代码:

这有效并返回一个 SID:

    DWORD size;
TCHAR lpAccountName[USERNAME_SIZE];
PSID Sid = (PSID)LocalAlloc(LPTR, SECURITY_MAX_SID_SIZE);
LPSTR DomainName = (LPSTR)LocalAlloc(LPTR, sizeof(TCHAR) * 1024);
DWORD cbSid = SECURITY_MAX_SID_SIZE;
LPSTR userSIDBuffer = (LPSTR)LocalAlloc(LPTR, sizeof(TCHAR) * cbSid);
SID_NAME_USE peUse;

size = USERNAME_SIZE;
if (!GetUserName(lpAccountName, &size))
{
_error("Could not retrieve username.");
}

printf("Username found: %s\n", lpAccountName);

size = 1024;
if (!LookupAccountName(NULL, lpAccountName, Sid, &cbSid, DomainName, &size, &peUse))
{
_error("Could not look up account.");
}

return Sid;

但是如果我根据 MSDN 文档删除 DomainName 并更改 size=0,我会收到 122 错误并且没有 Sid返回;

        size = 0;
if (!LookupAccountName(NULL, lpAccountName, Sid, &cbSid, NULL, &size, &peUse))
{
_error("Could not look up account.");
}

最佳答案

我无法告诉您为什么当您只需要 Sid 时他们会强制您检索域,但 API 就是这样设计的,您对此无能为力。 domain 参数是可选的,因为 API 被设计为被调用两次,一次是检索所需的缓冲区大小,一次是实际填充缓冲区。

如果您不喜欢这种设计,您可以使用辅助函数将其抽象掉:

BOOL GetAccountSidFromName(LPCTSTR Account, PSID Sid, const DWORD SidSize)
{
SID_NAME_USE snu;
DWORD cbSid = SidSize, cchRD = 0;
LPTSTR rd = NULL;
BOOL succ = LookupAccountName(NULL, Account, Sid, &cbSid, rd, &cchRD, &snu);
if (!succ)
{
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return FALSE;
rd = (LPTSTR) LocalAlloc(LPTR, cchRD * sizeof(*rd));
if (!rd)
{
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
cbSid = SidSize;
succ = LookupAccountName(NULL, Account, Sid, &cbSid, rd, &cchRD, &snu);
LocalFree(rd);
}
return succ;
}

...

TCHAR lpAccountName[USERNAME_SIZE];
DWORD size = USERNAME_SIZE;
if (!GetUserName(lpAccountName, &size))
{
_error("Could not retrieve username.");
}
BYTE sidbuf[SECURITY_MAX_SID_SIZE];
PSID sid = (PSID) sidbuf;
BOOL success = GetAccountSidFromName(lpAccountName, sid, sizeof(sidbuf));
if (!success)
{
_error("Could not retrieve sid.");
}

关于c++ - 当 ReferencedDomainName 为 NULL 时出现 LookupAccountName 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48103823/

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