Как получить имя пользователя в системной службе
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 06.05.04 18:26
Оценка:
У меня такая проблема:
Я создал службу в Win2000, которая запускается с правами SYSTEM. Этой службе нужно знать, какой пользователь работает за консолью, то бишь локально (не из под терминала) зашел (или не зашел) в систему.
Я обыскал множество сайтов с возможными вариантами ответов, и не один из этих вариантов мне не подходит:
1. Функция GetUserName — она возвращает имя пользователя для текущего процесса, а я и так знаю, что оно == SYSTEM.
2. Функция WNetGetUser — в принципе то же самое, если первым параметром указывать NULL, Иначе я почучаю доступ к сетевым ресурсам, а мне этого не нужно.
3. Реестр Windows — из системной службы нет доступа к ключу HKEY_CURRENT_USER. Некоторая информация есть в ключе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultUserName, но когда пользователь не занимает консоль, это значение не изменяется, то есть остается равным имени пользователя, который в последний раз занимал консоль. А это, в свою очередь, есть неверной информацией о текущем пользователе.
4. Функции семейства работы из терминалом типа WTSEnumerateSessions и WTSQuerySessionInformation. Они работают и дают нужную мне информацию. Но когда я создаю системную службу и пробую их вызвать, получаю в ответ, что запускающая программа не есть приложением Windows или MS-DOS, то есть эти функции я не могу использовать в службе.
5. Перебирать все процессы, и если хотя один из них запущен не с правами системы, то это и есть имя пользователя — в принципе можно, но это некрасиво и будет работать медленно, особенно если запущено много процессов.

Вопрос: Возможно ли в системной службе получить имя пользователя, который работает локально. Если да, то как? Эсли я ошибаюсь в пунктах 1-5, будьте добры, скажите. Буду благодарен за любую подсказку или рабочий пример. Если нетрудно, пишите ответы на burda_r@mail.ru
Любая задача имеет решение, даже когда решения не существует
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.