如果我没有将可选的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/