Еще раз о запуске процесса от имени другого юзера
От: Stas Украина  
Дата: 27.11.01 13:45
Оценка:
Добрый день.
Столкнулся с проблемой запуска процесса от другого пользователя на Windows 2000.
Использую LogonUser и CreateProcessAsUser (не очень удачно пока что...:-))
Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается. Чудо функция CreateProcessWithLogonW работает хорошо, но чертовски медленно (секунд 5-10 приходится ждать пока процесс запуститься). Почитав форум узнал — что не я один такой. На форуме проблема обсуждалась, но решения я не нашёл. Хотелось бы узнать: Как эта проблема в конечном итоге решилась теми, кто с ней столкнулся?
Заранее спасибо.
Re: Еще раз о запуске процесса от имени другого юзера
От: _DEBUG Беларусь  
Дата: 27.11.01 14:26
Оценка: 3 (1)
Здравствуйте 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]: Еще раз о запуске процесса от имени другого юзера
От: Stas Украина  
Дата: 27.11.01 14:37
Оценка:
Здравствуйте _DEBUG, Вы писали:

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


S>>Добрый день.

S>>Столкнулся с проблемой запуска процесса от другого пользователя на Windows 2000.
S>>Использую LogonUser и CreateProcessAsUser (не очень удачно пока что...
S>>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается. Чудо функция CreateProcessWithLogonW работает хорошо, но чертовски медленно (секунд 5-10 приходится ждать пока процесс запуститься). Почитав форум узнал — что не я один такой. На форуме проблема обсуждалась, но решения я не нашёл. Хотелось бы узнать: Как эта проблема в конечном итоге решилась теми, кто с ней столкнулся?
S>>Заранее спасибо.
S>>

D>Устанавливаешь свой сервис функции которого делают то, что тебе нужно. И через него уже делаешь все что нужно.


Спасибо за ответ. Пока я ожидал его, начал работать над созданием упомянутого тобой сервиса .
Re: Еще раз о AdjustTokenPrivileges
От: Alex Fedotov США  
Дата: 28.11.01 04:35
Оценка: 10 (3)
Здравствуйте Stas, Вы писали:

S>Проблема в получении привилегии SE_TCB_NAME. Если её руками поставить — всё работает. попытки установить её во время выполнения успехом не увенчались. Хотя смутные сомнения — что это возможно меня не покидают. Вот, например, привилегию на выключение компа можно в runtime выставить...а SE_TCB_NAME не получается.


Пусть твои сомнения покинут тебя навсегда. Существует довольно распространенное убеждение, что функция AdjustTokenPrivileges добавляет привилегии. Это не так.

Список привилений формируется в процессе входа в систему и заносится в токен. Часть привилегий включены по умолчанию, а часть нет, от греха подальше. Смысл выключения привилегий такой же как у оружейного предохранителя — себе в ногу не выстрелить.

Функция AdjustTokenPrivileges позволяет лишь включить (enable) или выключить (disable) привилегию, которая уже есть в токене. Она не может добавить туда новых привилегий. Kак ты возможно уже догадываешьcя, SeShutdownPrivilege есть в токене администраторов, но выключена по умолчанию, а SeTcbPrivilege в нем просто отсутствует (и правильно).
-- Alex Fedotov
Re[2]: Еще раз о AdjustTokenPrivileges
От: Stas Украина  
Дата: 28.11.01 13:22
Оценка:
Здравствуйте 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() — работает значительно медленнее, но привилегий не требует.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.