Когда работаешь от учеток с ограниченными правами, иногда необходимо выполнять программы с административными привилегиями. Особенно это касается инсталляций.
Делается это, как известно, с помощью использования режима запуска Runas.
Теперь интересное. Встречался с таким, что для некоторых программ, в случае запуска от неадминской учетки, автоматически открывается диалог runas. Это очень удобно.
Вопрос: как сделать так, чтобы моя программа тоже стала такой умной?
(имеется ввиду модификация собственно программы (exe), а не решения с ярлыками и пр.)
Здравствуйте, Contact, Вы писали:
C>Теперь интересное. Встречался с таким, что для некоторых программ, в случае запуска от неадминской учетки, автоматически открывается диалог runas. Это очень удобно.
C>Вопрос: как сделать так, чтобы моя программа тоже стала такой умной? C>(имеется ввиду модификация собственно программы (exe), а не решения с ярлыками и пр.)
CheckTokenMembership, там есть пример функции IsUserAdmin.
Если я не ошибаюсь, данный подход предполагает программное определение
вхождения пользователя в группу администраторы с последующим... чем?
1) поменять владельца процесса нельзя (можно???)
=> необходимо как-то показать диалог ранэс (как?) и получить результаты ввода
2) если идти не по варианту (1), то в голову приходит только идея вызова
ранэс-диалога на самом себе
=> опять таки, как вызвать ран-эс на программу? (в первом случае нам
надо вызвать этот диалог и получить результаты ввода, а в этом случае
просто вызвать ранэс-режим на exe)
Здравствуйте, Contact, Вы писали:
C>Если я не ошибаюсь, данный подход предполагает программное определение C>вхождения пользователя в группу администраторы с последующим...
принятием решения, можно ли просто делать CreateProcess или же необходимо запросить логин/пароль и вызвать CreateProcessAsUser
C>=> опять таки, как вызвать ран-эс на программу?
Не знаю, но сам диалог смоделировать не проблема. А вот выбор юзера как в него включить — ИМХО здесь что-то пробегало, поищи.
C>>Если я не ошибаюсь, данный подход предполагает программное определение C>>вхождения пользователя в группу администраторы с последующим...
PD>принятием решения, можно ли просто делать CreateProcess или же необходимо запросить логин/пароль и вызвать CreateProcessAsUser
Не покатит.
In Windows 2000, the process calling LogonUser requires the SE_TCB_NAME
Поэтому и есть RunAs, который выполнен в виде сервиса. Насколько я понимаю, вопрошающего интересует именно апи к нему. Я этого не копал Но советую поискать в группо-гугле, наверняка там что то есть...
PS
Да, учтите, что более-менее адекватные пользователи нафиг вырубают этот сервис во избежание.
Здравствуйте, Contact, Вы писали:
C>Когда работаешь от учеток с ограниченными правами, иногда необходимо выполнять программы с административными привилегиями. Особенно это касается инсталляций. C>Делается это, как известно, с помощью использования режима запуска Runas.
Механизм называется — имперсонализация, имитация прав) Runas — это программа, а не режим
C>Теперь интересное. Встречался с таким, что для некоторых программ, в случае запуска от неадминской учетки, автоматически открывается диалог runas. Это очень удобно.
ImpersonateLoggedOnUser, окно не открывает. но "runas" реализована через эту функцию
C>Вопрос: как сделать так, чтобы моя программа тоже стала такой умной? C>(имеется ввиду модификация собственно программы (exe), а не решения с ярлыками и пр.)
Права админа? такой умной не станет. но поумничать может
DSK>ImpersonateLoggedOnUser, окно не открывает. но "runas" реализована через эту функцию
Повторюсь — в обычном приложении не пойдет, только начиная с XP и выше. Под win2k вы просто не сможете получить токен для имерсонации, не хватит привелегий. Даже у админа. Только у сервиса.
Здравствуйте, Andrew S, Вы писали:
C>>>Если я не ошибаюсь, данный подход предполагает программное определение C>>>вхождения пользователя в группу администраторы с последующим...
PD>>принятием решения, можно ли просто делать CreateProcess или же необходимо запросить логин/пароль и вызвать CreateProcessAsUser
AS>Не покатит.
AS>
AS>In Windows 2000, the process calling LogonUser requires the SE_TCB_NAME
AS>Поэтому и есть RunAs, который выполнен в виде сервиса. Насколько я понимаю, вопрошающего интересует именно апи к нему. Я этого не копал Но советую поискать в группо-гугле, наверняка там что то есть...
API называется CreateProcessWithLogonW
AS>PS AS>Да, учтите, что более-менее адекватные пользователи нафиг вырубают этот сервис во избежание.
Я бы скорее назвал этих пользователей неадекватными. Вместо того, чтобы пользоваться runas, они с утра до вечера сидят администраторами на своих машинах.
Здравствуйте, Contact, Вы писали:
C>Если я не ошибаюсь, данный подход предполагает программное определение C>вхождения пользователя в группу администраторы с последующим... чем? C>1) поменять владельца процесса нельзя (можно???) C>=> необходимо как-то показать диалог ранэс (как?) и получить результаты ввода C>2) если идти не по варианту (1), то в голову приходит только идея вызова C>ранэс-диалога на самом себе
Что касается стандартного диалога Run As, то в XP в реестре есть такой ключик
HKEY_CLASSES_ROOT\exefile\shell\runas\command
Это мне подсказывает, что возможно нужного эффекта удастся добиться вот таким вот вызовом:
Здравствуйте, Contact, Вы писали:
C>Кстати, да, это еще один интересный вопрос -- как работает runas, C>через имперсонацию или через чистый запуск от имени другого пользователя?
RunAs работает по схеме LogonUser -> CreateProcessAsUser.
Если вы попытаетесь сделать LogonUser -> ImpersonateLoggedOnUser -> CreateProcess, то процесс запустится от имени пользователя, который создал ваш процесс, а не от имени того, которого вы имперсонируете. Дело в том, что CreateProcess наследует primary (process-level) token, в то время как ImpersonateLoggedOnUser устанавливает impersonation token.