Re[2]: Нотификация о логинящемся юзере
От: Cavaler  
Дата: 11.07.05 17:12
Оценка:
Здравствуйте, Conr, Вы писали:

Ca>>1a. Как, собственно, сервис может отловить этот момент? В том числе и для случая Terminal Services или нескольких пользователей для WinXP?

Cr>Самый корректный способ, имхо использовать Winlogon Notification Package — в соответствующей процедуре просто бросать event, а в сервисе его ждать.
Ага, да, нашел такое. Слегка смущает Win2000+ — ну да я давно уже NT4 не видел.
Единственная неприятность — кроме собственно факта чьего-то логина, хочется еще и User Token передать. А что-то до способа просто и изящно передать маленький блок данных от одного процесса другому я так и не придумал (плюс чтобы еще можно было его ждать так же, как евент или там семафор какой-нибудь), хотя наверняка он есть.


Ca>>1b. Соответственно, если сервис запускается уже при залогиненном пользователе, надо как-то его (их) идентифицировать.

Cr>GetUserName()
Не в этом смысле идентифицировать. А, например, получить User Token для всех залогиненных (see below).


Ca>>2. Как запустить процесс от имени залогиневшегося юзера? Если у того уже запущены какие-то процессы, то последовательность OpenProcess(какой-нибудьтам) + OpenProcessToken() + CreateProcessAsUser() решает проблему, но при приходе какой-нибудь там нотификации может еще ни шелл, ничего другого не быть запущенным...

Cr>хм, вот тут не очень понял. Если нотификация о лигоне пришла, то пользователь уже залогинен. При чем тут шелл неясно...

При том, что чтобы запустить процесс от имени юзера, надо иметь User Token. А способ получить, не зная пароля (для LogonUser()) — я нашел только через вышеупомянутую связку OpenProcess()+OpenProcessToken(), натравливая ее на какой-то процесс явно от имени этого юзера — например, шелл.
Собственно, для варианта, предложенного тобой, это не нужно — там этот token получается от winlogon. Но остается вопрос сервиса, запускающегося уже при имеющихся пользователях.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.