如何判断进程的用户令牌是否与运行进程的登录会话令牌相同?



如何从我的交互式 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;
}

如果有人找到更好的解决方案,请告诉我...

最新更新