#windows #c_sharp #процесс
На терминальном сервере человек 10 запускают приложение, пусть это будет CALC.exe, и естетсвенно, в процессах 10 ОДИНАКОВЫХ процессов. Здесь мне подсказали, как узнать путь к файлу нужного процесса. А как сделать тоже самое, только если пользователя зовут ВАСЯ, то процесс запущенный ВАСЕЙ и находился?
Ответы
Ответ 1
Самый простой вариант с помощью WMI: string processName = "calc.exe"; string currentUser = WindowsIdentity.GetCurrent().Name.Split('\\')[1]; string query = "Select * from Win32_Process Where Name = \"" + processName + "\""; ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection processes = searcher.Get(); foreach (ManagementObject proc in processes) { string owner; string[] argList = new string[] { string.Empty }; int returnVal = Convert.ToInt32(proc.InvokeMethod("GetOwner", argList)); if (returnVal == 0) owner = argList[0]; else continue; if (owner != currentUser) continue; // Вот тут-то и остался только нужный процесс! string path = proc["ExecutablePath"].ToString(); }Ответ 2
На WinApi проблема решалась еще в первом вопросе) Поиск по msdn выдал сразу: Получаем токен процесса по хендлу: OpenProcessToken(...) SID пользователя - в информации о токене: GetTokenInformation(...) @kirelagin: Оригинал с мсдн: BOOL WINAPI OpenProcessToken( __in HANDLE ProcessHandle, __in DWORD DesiredAccess, __out PHANDLE TokenHandle ); В c#: [DllImport("Advapi32.dll", EntryPoint = "OpenProcessToken")] private static extern bool OpenProcessToken(int ProcessHandle, int DesiredAccess, int* TokenHandle);
Комментариев нет:
Отправить комментарий