可以使用LookupAccountNameA获取sid。
LookupAccountName函数接受系统名称和帐户作为输入。它检索该帐户的安全标识符(SID)以及在其上找到该帐户的域的名称。
使用此api无需在LocalSystem帐户的上下文中运行。
代码示例:(C ++)
#include <Windows.h> #include <Sddl.h> #include <stdio.h> int main(int argc, char** argv) { LPCTSTR wszAccName = TEXT("domainname\username"); LPTSTR wszDomainName = (LPTSTR)GlobalAlloc(GPTR, sizeof(TCHAR) * 1024); DWORD cchDomainName = 1024; SID_NAME_USE eSidType; LPTSTR sidstring; char sid_buffer[1024]; DWORD cbSid = 1024; SID* sid = (SID*)sid_buffer; if (!LookupAccountName(NULL, wszAccName, sid_buffer, &cbSid, wszDomainName, &cchDomainName, &eSidType)) { return GetLastError(); } if (!ConvertSidToStringSid(sid, &sidstring)) { return GetLastError(); } printf("%ws ", sidstring); return 0; }
另一种方法,使用WTSQueryUserToken ...
获取会话ID指定的登录用户的主要访问令牌。要成功调用此函数,调用应用程序必须在LocalSystem帐户的上下文中运行并且具有SE_TCB_NAME特权。
首先使用WTSenumerateSessions进行枚举,然后比较用户名并获取相应的SessionId
,然后调用WTSQueryUserToken以获取令牌,然后使用GetTokenInformation来获取sid。