Может кто-нибудь знает более менее стандартный способ получить имя пользователя, который в текущий момент залогинин на машине локально (процесс не обязательно в контексте этого пользователя) ? Причём желательно чтобы работало как в NT/2000/XP так и в Win9x/ME.
К слову: "Я решил эту задачу, но очень нетривиальным способом и с использованием имён, которые регистрирует Messenger Service, так что если его, к примеру, остановить, то работать не будет".
Здравствуйте GYB, Вы писали:
GYB>Может кто-нибудь знает более менее стандартный способ получить имя пользователя, который в текущий момент залогинин на машине локально (процесс не обязательно в контексте этого пользователя) ? Причём желательно чтобы работало как в NT/2000/XP так и в Win9x/ME.
GYB>К слову: "Я решил эту задачу, но очень нетривиальным способом и с использованием имён, которые регистрирует Messenger Service, так что если его, к примеру, остановить, то работать не будет".
Здравствуйте Max_Akimov, Вы писали:
MA>GetUserName подойдет?
Нет
GetUserName возвращает имя пользователя текущего трида и если этот трид будет работать от имени системы, то он и вернёт имя системы "SYSTEM", а нужно имя пользователя локальной сессии.
А>Называется "Думали думали, но так ничего и не придумали ".
Так дело в том, что, как правило, если возникает задача получить имя "локального" пользователя из службы, значит, что-то не так спроектировано. Не должно волновать службу, кто сейчас сидит за кнопками, ее должно волновать, кто к ней обращается, а локальный это пользователь или удаленный — не важно.
Здравствуйте Alex Fedotov, Вы писали:
AF>Так дело в том, что, как правило, если возникает задача получить имя "локального" пользователя из службы, значит, что-то не так спроектировано. Не должно волновать службу, кто сейчас сидит за кнопками, ее должно волновать, кто к ней обращается, а локальный это пользователь или удаленный — не важно.
Нет. Это совсем не так. Просто как всегда Microsoft не предоставляет интерфейсы ( или точнее сказать не документирует ) к некоторой, часто необходимой системной информации. Ведь очевидно, что информация эта в системе есть, но нет механизма просто получить к ней доступ.
И что значит не так спроектировано ? Знасит не по шаблону ? То есть захотелось чего-то большего, отличающегося от того, что приведено в примерах ?
Так это завсит от задачи в первую очередь, а не от того, что считать важным или не важным.
А задача стояла примерно такая: необходимо ограничить доступ пользователям в соответствии с расписанием. И в определённый момент нужно проверить не входит ли имя пользователя, работающего за компьютером, в список тех для кого истекло время доступа. И если истекло, то сделать для него logoff.
Здравствуйте GYB, Вы писали:
GYB>А задача стояла примерно такая: необходимо ограничить доступ пользователям в соответствии с расписанием. И в определённый момент нужно проверить не входит ли имя пользователя, работающего за компьютером, в список тех для кого истекло время доступа. И если истекло, то сделать для него logoff.
GYB>Вот и всё. И что здесь не так спроектировано ?
То что пользователей может быть несколько, например, работающих через terminal services.
Здравствуйте Alex Fedotov, Вы писали:
GYB>>А задача стояла примерно такая: необходимо ограничить доступ пользователям в соответствии с расписанием. И в определённый момент нужно проверить не входит ли имя пользователя, работающего за компьютером, в список тех для кого истекло время доступа. И если истекло, то сделать для него logoff.
GYB>>Вот и всё. И что здесь не так спроектировано ?
AF>То что пользователей может быть несколько, например, работающих через terminal services.
). И тем и другим способом ты получишь извещения о моментах входа и выхода пользователей из системы. Определить, кто из них засиделся дольше времени — дело техники.
Кроме того, прослойка к MSGINA позволит сделать принудительный Logoff нужному пользователю. Фактически, отдельная служба здесь и не нужна, достаточно небольшой надстройки к MSGINA.
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Alex Fedotov, Вы писали:
AF>>То что пользователей может быть несколько, например, работающих через terminal services.
В моём случае это не важно. Нужно отлавливать только локальные сессии. Тем более, что нужно, чтобы это работало и под Win9x/ME. Terminal services на компьютере могут и не быть.
). И тем и другим способом ты получишь извещения о моментах входа и выхода пользователей из системы. Определить, кто из них засиделся дольше времени — дело техники.
Это вариант, но далеко не простой. Моё решение позволяет не держать процесс в памяти, а запускать его через sheduler. Да, как-то я не заострял внимание, что это не служба, а обычный процесс.
AF>Кроме того, прослойка к MSGINA позволит сделать принудительный Logoff нужному пользователю. Фактически, отдельная служба здесь и не нужна, достаточно небольшой надстройки к MSGINA.
Принудительный logoff тоже не проблемма.
Собственно основная проблемма была получить имя пользователя, и не по событию его входа, а именно в произвольный момент времени.
Я конечно искренне благодарен за такое внимание к моему скромному вопросу. Но похоже что стандартного и простого способа здесь нет.
Спасибо за советы. Будет над чем подумать, но уже наверно для других задач.
На сайте www.sysinternals.com есть исходник проги "PsLoggedOn" там имя пользователя находится через реестр в подключе HKEY_USERS\\... затем это имя преобразуется в SID и далее в простое имя — это самое простое
Еще можно открыть десктоп Winsta0\\default и по дескриптору защиты посмотреть какой пользователь зарегистрирован — это чуть посложнее