Информация об изменениях

Сообщение Re[10]: CreateProcessAsUser из сервиса от 30.09.2019 8:12

Изменено 30.09.2019 8:13 Somescout

Re[10]: CreateProcessAsUser из сервиса
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Somescout, Вы писали:


S>>Дело в том, что мне вообще не нужен доступ к UI — я пытаюсь запустить консольное приложение (без создния окна)...


O>Дело не только в UI. Если в сессии пользователя создать приложение "не с тем" Logon SID, то оно не только UI не

O>сможет показывать, но и создавать/открывать объекты в пространстве имен сессии. Например:

O>
O>HANDLE token;

O>if (LogonUserW(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token))
O>{
O>    if (ImpersonateLoggedOnUser(token))
O>    {
O>        //
O>        // Здесь получаем ошибку, GetLastError() возвращает 5 - ERROR_ACCESS_DENIED.
O>        //
O>        HANDLE event = CreateEventW(NULL, TRUE, FALSE, L"TestEvent-123456"); 
O>


Нашёл вот такое решение (фактически упакованная в C# классическая статья про запуск интерактивных процессов): https://stackoverflow.com/questions/677874/starting-a-process-with-credentials-from-a-windows-service/30687230#30687230

То есть делает то же самое — пользователю, от которого делается запуск, даёт доступ к WinStation текущего приложения. Проверил — работает, и из сервиса, и из консоли.
Re[10]: CreateProcessAsUser из сервиса
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Somescout, Вы писали:


S>>Дело в том, что мне вообще не нужен доступ к UI — я пытаюсь запустить консольное приложение (без создния окна)...


O>Дело не только в UI. Если в сессии пользователя создать приложение "не с тем" Logon SID, то оно не только UI не

O>сможет показывать, но и создавать/открывать объекты в пространстве имен сессии. Например:

O>
O>HANDLE token;

O>if (LogonUserW(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &token))
O>{
O>    if (ImpersonateLoggedOnUser(token))
O>    {
O>        //
O>        // Здесь получаем ошибку, GetLastError() возвращает 5 - ERROR_ACCESS_DENIED.
O>        //
O>        HANDLE event = CreateEventW(NULL, TRUE, FALSE, L"TestEvent-123456"); 
O>


Нашёл вот такое решение (фактически упакованная в C# классическая статья про запуск интерактивных процессов): https://stackoverflow.com/questions/677874/starting-a-process-with-credentials-from-a-windows-service/30687230#30687230

То есть делает то же самое — пользователю, от которого делается запуск, даёт доступ к WinStation текущего приложения. Проверил — работает, и из сервиса, и из консоли.

ЗЫ. Огромное спасибо за помощь!