获取流程所有者(Citrix / Provisioning)

时间:2014-12-04 07:23:44

标签: c++ winapi mfc

我使用OpenProcessToken,GetTokenInformation和LookupAccountSid来确定某个进程的所有者。

在本地计算机(Win 7和Win 8.1)上,在RD服务会话(Server 2012)上,它可以正常工作。我确实得到了正确的用户名。用户名显示在流程旁边的任务管理器中。

当我在Provisioning(ex Citrix)环境中执行相同的代码时,我只获得用户名" Administrator"虽然任务管理器中显示了不同的名称。

有没有人知道如何在配置环境中征服它?

非常感谢您的帮助 马丁

这是我使用的C ++代码:

BOOL DDEWinWord::processStartedFromLocalUser(DWORD procId)
{
    #define MAX_NAME 256
    DWORD dwSize = 0, dwResult = 0;
    HANDLE hToken;
    SID_NAME_USE SidType;
    char lpName[MAX_NAME];
    char lpDomain[MAX_NAME];
    PTOKEN_OWNER tp;

    // Open a handle to the access token for the calling process.
    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);
    if (!OpenProcessToken(processHandle, TOKEN_QUERY, &hToken)) {
        AfxMessageBox("processStartedFromLocalUser - OpenProcessToken fehlschlag.");
        return FALSE;
    }

    // Call GetTokenInformation to get the buffer size.
    if(!GetTokenInformation(hToken, TokenOwner, NULL, dwSize, &dwSize)) 
    {
        dwResult = GetLastError();
        if (dwResult != ERROR_INSUFFICIENT_BUFFER)
        {
            AfxMessageBox("processStartedFromLocalUser - GetTokenInformation fehlschlag.");
            return FALSE;
        }
    }

    // Allocate the buffer.
    tp = (PTOKEN_OWNER)GlobalAlloc(GPTR, dwSize);

    // Call GetTokenInformation again to get the group information.
    if (!GetTokenInformation(hToken, TokenOwner, tp, dwSize, &dwSize))
    {
        AfxMessageBox("processStartedFromLocalUser - GetTokenInformation mit tp fehlschlag.");
        return FALSE;
    }

    if (!LookupAccountSid(NULL, tp->Owner, lpName, &dwSize, lpDomain, &dwSize, &SidType))
    {
        AfxMessageBox("processStartedFromLocalUser - LookupAccountSid fehlschlag."); 
        return FALSE;
    }
    else
    {
        AfxMessageBox(lpName);
    }

    return (m_stUserId.CompareNoCase(lpName) == 0);
}

1 个答案:

答案 0 :(得分:0)

您应该使用TokenUser而不是TokenOwner

相关问题