2014-12-04 37 views
2

我使用OpenProcessToken,GetTokenInformation,然后LookupAccountSid来确定某个进程的所有者。获取进程拥有者(Citrix/Provisioning)

在本地机器上(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); 
} 

回答

0

您应该使用TokenUser而非TokenOwner

+0

非常感谢您的帮助。这是解决方案。 – 2014-12-04 13:57:58

+0

这两者有什么区别?他们什么时候不同? – maja 2015-09-11 09:12:42

+0

@maja:对于管理员帐户,TokenOwner(决定新创建对象的默认所有权)默认情况下设置为管理员而不是特定用户帐户。 – 2015-09-12 01:57:38

相关问题