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

时间:2016-02-05 05:04:54

标签: c++ windows winapi process winlogon

如何在我的交互式GUI流程中告知其user token与运行该流程的logon session的用户令牌相同?

PS。我不能假设我的流程正在升级。

1 个答案:

答案 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;
}

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