Как сказать из моего интерактивного графического процесса, что его user token
такой же, как токен пользователя для logon session
что процесс работает под?
PS. Я не могу предположить, что мой процесс запущен с повышенными правами.
Прорезать демагогия Я думаю, что понял.
Это что-то вроде хака, так как я не могу найти способ извлечь токен пользователя из идентификатора сеанса, чтобы сравнить его 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;
}
Если кто-то найдет лучшее решение, дайте мне знать …
Других решений пока нет …