方法一:
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;
}