我需要获取已登录用户的字符串格式SID。我已经有了用户名,并尝试使用LookupAccountName来获取SID。这部分可以工作-我确实得到了一个SID,但它只是用户实际SID的部分匹配。
我不想要进程所有者的SID,因为该进程可能会被提升(模拟),而是我想要在运行该进程的地方登录的用户的SID。
代码需要使用非提升权限运行。
这是我目前的代码:
LPCTSTR wszAccName = TEXT("hardcoded username for testing");
LPTSTR wszDomainName = (LPTSTR)GlobalAlloc(GPTR, sizeof(TCHAR) * 1024);
DWORD cchDomainName = 1024;
SID_NAME_USE eSidType;
SID sid;
DWORD cbSid = 1024;
if (!LookupAccountName(NULL, wszAccName, &sid, &cbSid, wszDomainName, &cchDomainName, &eSidType)) {
return GetLastError();
}
if (!ConvertSidToStringSid(&sid, &pszSidBuffer)) {
return GetLastError();
}
这会产生一个类似于"S-1-5-21-1-1234567890-9-1000"的SID。但是用户的实际SID类似于"S-1-5-21-3214321539-1234567890-2233445522-1000"(根据进程所有者和HKEY_USERS下的注册表键)。 请注意,这些SID除了第5个和第7个组件不同之外,其他都相同,这两个组件只有1位数字,但应该更长。
我如何获取用户的实际/完整SID?
此外,我是一个完全的C/C++新手(上面的代码根本不适合生产)。我正在使用/NODEFAULTLIB以避免链接VC运行时库。对此很抱歉。