可以使用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\n", sidstring); return 0; }
另一種方法,使用WTSQueryUserToken ...
獲取會話ID指定的登錄用戶的主要訪問令牌。要成功調用此函數,調用應用程序必須在LocalSystem帳戶的上下文中運行並且具有SE_TCB_NAME特權。
首先使用WTSenumerateSessions進行枚舉,然后比較用戶名並獲取相應的SessionId,然后調用WTSQueryUserToken以獲取令牌,然后使用GetTokenInformation來獲取sid。
