Получить аккаунт процесса, исполняемого на удаленной системе
От: Бабуин  
Дата: 29.07.09 16:30
Оценка:
Мое почтение!

Коллеги, возникла необходимость решить такую задачу —
получить аккаунт, под которым выполняется процесс с известным PID
на удаленной win-системе. Использую .NET, C#.
Задача в принципе решается через интерфейс WMI(Process.GetProcesses), но с
неприятными оговорками — должны быть запущены некоторые службы на удаленном
хосте.
Использование API WTS* позволяет обходиться без этого ограничения,
но есть проблема с получением имени доменного пользователя-владельца процесса.
использован вызов WTSEnumerateProcesses, получен SID — но LookupAccountSid
не идентифицирует аккаунт, сообщая об ошибке 1332.
Попытки вытащить данные из сессии через WTSQuerySessionInformation — безуспешны,
соответствующие позиции(домен, логин) возвращаемой структуры данных пусты.
Отображаются только имена локальных аккаунтов(SYSTEM, WETWORK SERVICE)
Приложение выполняется с полномочиями сисадмина, вызов tasklist /S <host>
с этими полномочиями отрабатывает успешно, отображая аккаунты процессов.
О каких нюансах я не ведаю? Есть какие-то особенности? или вообще — иные
способы получить такие данные?
Re: Получить аккаунт процесса, исполняемого на удаленной сис
От: Аноним  
Дата: 30.07.09 10:29
Оценка:
Здравствуйте, Бабуин, Вы писали:

Б>использован вызов WTSEnumerateProcesses, получен SID — но LookupAccountSid

Б>не идентифицирует аккаунт, сообщая об ошибке 1332.
Б>Попытки вытащить данные из сессии через WTSQuerySessionInformation — безуспешны,
Б>соответствующие позиции(домен, логин) возвращаемой структуры данных пусты.
Б>Отображаются только имена локальных аккаунтов(SYSTEM, WETWORK SERVICE)
Б>Приложение выполняется с полномочиями сисадмина, вызов tasklist /S <host>
Б>с этими полномочиями отрабатывает успешно, отображая аккаунты процессов.
Б>О каких нюансах я не ведаю? Есть какие-то особенности? или вообще — иные
Б>способы получить такие данные?

Хм, ошибка 1332 вроде как однозначно говорит, что в доступных Вашему провайдеру безопасности базах такой сид не числится. А SYSTEM, WETWORK SERVICE, они на любой системе одинаковы, потому как well-known. В связи с чем несколько глупых вопросов, если не возражаете
Имя системы при вызове LookupAccountSid указано верно? Сам полученный SID на вид как, нормальный? Можете его сравнить с реальным SID того пользователя, от которого работает целевое приложение? Может это вообще не доменный пользователь, может её под локальным запустили? Сисадмин, от которого запускаете своё приложение, он доменный?

Ещё можно ApiMon'ом посмотреть, что tasklist дёргает. По крайней мере, wbemXXX либы она загружает.
Re[2]: Получить аккаунт процесса, исполняемого на удаленной
От: Бабуин  
Дата: 30.07.09 14:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хм, ошибка 1332 вроде как однозначно говорит, что в доступных Вашему провайдеру безопасности базах такой сид не числится. А SYSTEM, WETWORK SERVICE, они на любой системе одинаковы, потому как well-known. В связи с чем несколько глупых вопросов, если не возражаете

А>Имя системы при вызове LookupAccountSid указано верно? Сам полученный SID на вид как, нормальный? Можете его сравнить с реальным SID того пользователя, от которого работает целевое приложение? Может это вообще не доменный пользователь, может её под локальным запустили? Сисадмин, от которого запускаете своё приложение, он доменный?

А>Ещё можно ApiMon'ом посмотреть, что tasklist дёргает. По крайней мере, wbemXXX либы она загружает.


Возражаю?! Уважаемый, я торжествую, что получил хотя бы малость Вашего великодушного внимания!!

После дня мучений получил такие достижения и результаты:
Получаемый SID корректный. Нечего лучше, чем извлечь информацию через
const string SidSearchFormat = "LDAP://<SID={0}>";
DirectoryEntry(string.Format(SidSearchFormat, SIO.ToString()));
я не нашел. Это даже корректно работает, и извлекает кучу атрибутов элемента AD.
Даже для удаленных систем...но! Проверка показала, что работает — да не всегда.
Если я опрашиваю, скажем, сервер — всё отлично. Но применительно к рабочим станциям
я ещё на вызове hserver = WTSOpenServer(args[0]) получаю ошибку с кодом 5(Access Denied).
Типа, недостаточно прав — хотя вызов проходит с полномочиями сисадмина, а например
интерактивно удаленный рабочий стол на системе я получаю без проблем.
Удаленные операционки РС — от WinXP и выше...

С другой стороны, используя WMI-интерфейс, я без проблем получаю процессы и владельцев
с рабочих станций, но не могу получить доступ к серверам.
При вызове

ManagementScope oMs = new ManagementScope("\\\\" + args[0] +"\\root\\cimv2", connectoptions);
Console.WriteLine("*");
oMs.Connect();

возникает ошибка
Необработанное исключение: System.Runtime.InteropServices.COMException (0x800706
BA): Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 er
rorCode, IntPtr errorInfo)

Есть один нюанс — сервера обитают в одной подсети, РС — в другой. Вероятно, проблема именно в этом.
и вот сижу в депрессии есть вариант WMI, который работает только в моей подсетке.
И есть вариант WST* API, который работает только между моей РС и серверами...
черт знает что. Вот такие гниловате плоды собраны за день
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.