Как определить, совпадает ли токен пользователя моего процесса с токеном сеанса входа, под которым он выполняется?

Как сказать из моего интерактивного графического процесса, что его user token такой же, как токен пользователя для logon session что процесс работает под?

PS. Я не могу предположить, что мой процесс запущен с повышенными правами.

0

Решение

Прорезать демагогия Я думаю, что понял.

Это что-то вроде хака, так как я не могу найти способ извлечь токен пользователя из идентификатора сеанса, чтобы сравнить его 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;
}

Если кто-то найдет лучшее решение, дайте мне знать …

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]