获取当前用户的SID

方法一:

BOOL GetSID(CString& csSID)
{
    BOOL bRes = FALSE;
    csSID.Empty();

    char acUserName[UNLEN + 1];
    ::SecureZeroMemory(acUserName, sizeof(acUserName));
    DWORD dwLength = UNLEN;  

    bRes = ::GetUserNameA(acUserName, &dwLength);
    if (bRes)
    {
        BYTE sidBuffer[100];
        ::SecureZeroMemory(acUserName, sizeof(sidBuffer));
        PSID psid = (PSID)&sidBuffer;
        DWORD sidBufferSize = 100;
        char domainBuffer[80];
        ::SecureZeroMemory(acUserName, sizeof(domainBuffer));
        DWORD domainBufferSize = 80;
        SID_NAME_USE snu;

        //Get SID
        bRes = LookupAccountNameA(0, acUserName, psid, &sidBufferSize, domainBuffer, &domainBufferSize, &snu);
        if (bRes)
        {
            char* cSid = NULL;
            bRes = ConvertSidToStringSidA(psid, &cSid);
            if (bRes)
            {
                csSID = cSid;
            }
            if (cSid)
            {                
                LocalFree((HLOCAL)cSid); // Release sid space
            }
        }
    }

    return bRes;
}

 

 

方法二:

BOOL GetSID(CString& csSID)
{
    BOOL bRes = FALSE;
    csSID.Empty();

    HANDLE hToken = NULL;    
    HANDLE hCurProcess = GetCurrentProcess();
    bRes = OpenProcessToken(hCurProcess, TOKEN_QUERY, &hToken)
    if (bRes) 
    {        
        DWORD dwBufferSize = 0;
        bRes = GetTokenInformation(hToken, TokenUser, NULL, 0, &dwBufferSize);
        //ASSERT(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
        if (bRes)
        {
            LPBYTE buffer = new byte[dwBufferSize];
            if (NULL != buffer)
            {
                ::SecureZeroMemory(buffer, sizeof(buffer));
                PTOKEN_USER pTokenUser = reinterpret_cast<PTOKEN_USER>(buffer);
                bRes = GetTokenInformation( hToken, 
                                            TokenUser, 
                                            pTokenUser, 
                                            dwBufferSize,
                                            &dwBufferSize)

                if (bRes) 
                {
                    if (IsValidSid(pTokenUser->User.Sid)) 
                    {
                        PSID pSid = pTokenUser->User.Sid;
                        LPTSTR pszSID = NULL;
                        bRes = ConvertSidToStringSid(pSid, &pszSID);
                        if (bRes)
                        {
                            csSID = pszSID;
                        }
                        if (pszSID)
                        {
                            LocalFree( pszSID );
                            pszSID = NULL;
                        }                        
                    }
                }
                delete []buffer;
                buffer = NULL;
            }
        }        
    }

    if (hToken)
    {
        CloseHandle( hToken );
        hToken = NULL;
    }

    return bRes;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值