Здравствуйте, 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. Но остается вопрос сервиса, запускающегося уже при имеющихся пользователях.