Добрый день.
Столкнулся с проблемой запуска процесса от другого пользователя на Windows 2000.
Использую LogonUser и CreateProcessAsUser (не очень удачно пока что...:-))
Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается. Чудо функция CreateProcessWithLogonW работает хорошо, но чертовски медленно (секунд 5-10 приходится ждать пока процесс запуститься). Почитав форум узнал — что не я один такой. На форуме проблема обсуждалась, но решения я не нашёл. Хотелось бы узнать: Как эта проблема в конечном итоге решилась теми, кто с ней столкнулся?
Заранее спасибо.
Re: Еще раз о запуске процесса от имени другого юзера
Здравствуйте Stas, Вы писали:
S>Добрый день. S>Столкнулся с проблемой запуска процесса от другого пользователя на Windows 2000. S>Использую LogonUser и CreateProcessAsUser (не очень удачно пока что... S>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается. Чудо функция CreateProcessWithLogonW работает хорошо, но чертовски медленно (секунд 5-10 приходится ждать пока процесс запуститься). Почитав форум узнал — что не я один такой. На форуме проблема обсуждалась, но решения я не нашёл. Хотелось бы узнать: Как эта проблема в конечном итоге решилась теми, кто с ней столкнулся? S>Заранее спасибо. S>
Устанавливаешь свой сервис функции которого делают то, что тебе нужно. И через него уже делаешь все что нужно.
\n Give me MSDN and I'll show you the world
Re[2]: Еще раз о запуске процесса от имени другого юзера
Здравствуйте _DEBUG, Вы писали:
D>Здравствуйте Stas, Вы писали:
S>>Добрый день. S>>Столкнулся с проблемой запуска процесса от другого пользователя на Windows 2000. S>>Использую LogonUser и CreateProcessAsUser (не очень удачно пока что... S>>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается. Чудо функция CreateProcessWithLogonW работает хорошо, но чертовски медленно (секунд 5-10 приходится ждать пока процесс запуститься). Почитав форум узнал — что не я один такой. На форуме проблема обсуждалась, но решения я не нашёл. Хотелось бы узнать: Как эта проблема в конечном итоге решилась теми, кто с ней столкнулся? S>>Заранее спасибо. S>>
D>Устанавливаешь свой сервис функции которого делают то, что тебе нужно. И через него уже делаешь все что нужно.
Спасибо за ответ. Пока я ожидал его, начал работать над созданием упомянутого тобой сервиса .
Здравствуйте Stas, Вы писали:
S>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается.
Пусть твои сомнения покинут тебя навсегда. Существует довольно распространенное убеждение, что функция AdjustTokenPrivileges добавляет привилегии. Это не так.
Список привилений формируется в процессе входа в систему и заносится в токен. Часть привилегий включены по умолчанию, а часть нет, от греха подальше. Смысл выключения привилегий такой же как у оружейного предохранителя — себе в ногу не выстрелить.
Функция AdjustTokenPrivileges позволяет лишь включить (enable) или выключить (disable) привилегию, которая уже есть в токене. Она не может добавить туда новых привилегий. Kак ты возможно уже догадываешьcя, SeShutdownPrivilege есть в токене администраторов, но выключена по умолчанию, а SeTcbPrivilege в нем просто отсутствует (и правильно).
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Stas, Вы писали:
S>>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается.
AF>Пусть твои сомнения покинут тебя навсегда. Существует довольно распространенное убеждение, что функция AdjustTokenPrivileges добавляет привилегии. Это не так.
AF>Список привилений формируется в процессе входа в систему и заносится в токен. Часть привилегий включены по умолчанию, а часть нет, от греха подальше. Смысл выключения привилегий такой же как у оружейного предохранителя — себе в ногу не выстрелить.
AF>Функция AdjustTokenPrivileges позволяет лишь включить (enable) или выключить (disable) привилегию, которая уже есть в токене. Она не может добавить туда новых привилегий. Kак ты возможно уже догадываешьcя, SeShutdownPrivilege есть в токене администраторов, но выключена по умолчанию, а SeTcbPrivilege в нем просто отсутствует (и правильно).
Спасибо за исчёрпывающий ответ. После экспериментов с привилегиями такие выводы сами собой напросились. Теперь буду знать наверняка.На данном этапе проблема решилась т.о.: в runtim'е проверяю являются ли привилегии (SE_TCB_NAME,SE_INCREASE_QUOTA_NAME, SE_ASSIGNPRIMARYTOKEN_NAME) enabled для данного процесса. Если да, то использую пару (LogonUser(), CreateProcessAsUser()) — работает хорошо и быстро, ежели нет привилегий, то использую ф-ю CreateProcessWithLogonW() — работает значительно медленнее, но привилегий не требует.