win32

可以使用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。

相关:如何在C ++中利用我的服务获取用户的SID和用户名