如何从我的交互式 GUI 进程中判断其user token
与运行该进程的logon session
的用户令牌相同?
附言。我不能假设我的进程正在提升运行。
切入煽动,我想我明白了。
这有点像黑客,因为我似乎找不到一种方法来从会话ID中检索登录用户令牌,以将其SID
与我的进程中SID
的用户令牌进行比较。我所知道的唯一可以做到这一点的API(WTSQueryUserToken)需要SE_TCB_NAME
特权,而我的"小进程"肯定不会有。
因此,假设没有两个用户帐户可以在同一域(或工作组)上具有相同的名称,到目前为止,这似乎可以解决问题:
#define SIZEOF(f) (sizeof(f) / sizeof(f[0]))
int IsRunningInOwnLogonUserSession()
{
//Checks if our process is running in its own logon user session
//RETURN:
// = 1 if yes
// = 0 if no
// = -1 if error determining -- check GetLastError() for info
int nOSError = NO_ERROR;
int res = -1;
DWORD dwProcSessID = -1;
if(::ProcessIdToSessionId(::GetCurrentProcessId(), &dwProcSessID))
{
TCHAR buffProcUsrName[UNLEN + 1];
buffProcUsrName[0] = 0;
DWORD dwcbSz = 0;
LPTSTR pStrUsrName = NULL;
if(WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, dwProcSessID, WTSUserName, &pStrUsrName, &dwcbSz) &&
pStrUsrName &&
pStrUsrName[0])
{
LPTSTR pStrDomName = NULL;
if(WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, dwProcSessID, WTSDomainName, &pStrDomName, &dwcbSz) &&
pStrDomName &&
pStrDomName[0])
{
dwcbSz = SIZEOF(buffProcUsrName);
::GetUserName(buffProcUsrName, &dwcbSz);
buffProcUsrName[SIZEOF(buffProcUsrName) - 1] = 0;
if(buffProcUsrName[0])
{
//The domain name is somewhat tricky as I don't know
//what format 'WTSDomainName' supplied it in...
//I'm assuming old, generic NetBIOS...
TCHAR buffProcDomName[MAX_PATH];
buffProcDomName[0] = 0;
GetEnvironmentVariable(_T("USERDOMAIN"), buffProcDomName, SIZEOF(buffProcDomName));
buffProcDomName[SIZEOF(buffProcDomName) - 1] = 0;
if(buffProcDomName[0])
{
//Compare the two
if(lstrcmpi(pStrUsrName, buffProcUsrName) == 0 &&
lstrcmpi(pStrDomName, buffProcDomName) == 0)
{
//Same
res = 1;
}
else
{
//Different
res = 0;
}
}
else
nOSError = ::GetLastError();
}
else
nOSError = ::GetLastError();
}
else
nOSError = ::GetLastError();
if(pStrDomName)
{
WTSFreeMemory(pStrDomName);
pStrDomName = NULL;
}
}
else
nOSError = ::GetLastError();
if(pStrUsrName)
{
WTSFreeMemory(pStrUsrName);
pStrUsrName = NULL;
}
}
else
nOSError = ::GetLastError();
::SetLastError(nOSError);
return res;
}
如果有人找到更好的解决方案,请告诉我...