如何在我的交互式GUI流程中告知其user token
与运行该流程的logon session
的用户令牌相同?
PS。我不能假设我的流程正在升级。
答案 0 :(得分:0)
切入demagoguery我想我明白了。
这有点像黑客攻击,因为我似乎找不到从会话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;
}
如果有人找到更好的解决方案,请告诉我......