Я использую OpenProcessToken, GetTokenInformation, а затем LookupAccountSid, чтобы определить владельца определенного процесса.Получить владельца процесса (Citrix/Provisioning)
На локальном компьютере (Win 7 и Win 8.1) на сеансе служб RD (Server 2012) он работает нормально. Я получаю правильное имя пользователя. Имя пользователя отображается в диспетчере задач рядом с процессом.
Когда я выполняю тот же код в среде Provisioning (ex Citrix), я получаю только имя пользователя «Администратор», хотя в диспетчере задач отображается другое имя.
Есть ли у кого-нибудь идеи, как победить это в среде Provisioning?
Большое спасибо за любую помощь Martin
Вот код 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);
}
Большое спасибо за помощь. Это решение. –
В чем разница между этими двумя? Когда они разные? – maja
@maja: для учетных записей администратора TokenOwner (который определяет право собственности на вновь созданные объекты по умолчанию) по умолчанию установлен на «Администраторы», а не на определенную учетную запись пользователя. –