Здравствуйте, Jolly Roger, Вы писали:
JR>Если SeCreateTokenPriviledge осталась в висте доступна через политики, то в принципе можно при инсталляции создать специальную учётку с нужными настройками, в том числе и SeCreateToken, и назначить запуск службы от неё. Другой вопрос, поможет ли это топикстартеру. Я вот как-то никогда не интересовался возможностью подмены Logon Sid, а сейчас попробовал поискать в сети — что-то глухо
Да, SeCreateTokenPriviledge осталась доступна. Так что можно создать собственного юзера с привелегией SeCreateToken. В принципе, это может помочь.
Но есть один важный нюанс (о нем ниже).
Я нашел в сети исходники программы на тему "RunAs" от некого Zhefu Zhang (
http://www.codeproject.com/KB/system/RunUser.aspx). Исходники основаны на коде Jeffrey Richter, примеров от Gary Nebbett с собственной доработкой автором.
Одним из вариантов запуска этой программой дочернего процесса — путем запуска ZwCreateToken с дальнейшим использованием CreateProcessAsUser. Так вот, в Windows XP подобный вариант запуска проходит на ура (в полиси пользователя установлены все необходимые привелегии). А в Windows Vista при попытке выполнить аналогичную операцию — программа вылетает с ексцепшеном (привелегия у пользователя есть). Пока еще не разбирался, но предполагаю, что ексцепшен вызван тем, что изменился список параметров/способ использования некоторых функций Native API. Так что это палка в двух концах, как говориться )).
Кстати, пробовал запускать SetTokenInformation с классом TokenOrigin. Этот класс читает/устанавливает logon session, который означает: "Logon session процесса, создавшего данный токен", что-то в этом роде. Кстати, параметр этот документирован только для Windows 2003 /2008. На практике работает и в Win Vista.
Использование SetTokenInformation совместно с классом TokenLogonSid вызывает возврат ошибки, что соответствует поведению согласно документации.