Можно ли получить права пользователя Администратор на Windows 7 из кода?
Здравствуйте!
Мне необходимо выполнить некоторый код с правами пользователя Администратор. Для этого я действую по следующей схеме:
1). Выполняю логин пользователя который является администратором (первый пользователь который создаётся при установке Windows) с помощью WinApi функции Logon;
2). Создаю экземпляр класса WindowsIdentity на основе полученного после логина токена;
3). Олицетворяю пользователя представленного экземпляром WindowsIdentity и получаю контекст WindowsImpersonationContext.
После этого, и до тех пор пока не будет вызван метод Undo экземпляра класса WindowsImpersonationContext (или пока не будет вызван Dispose, вот тут не понял) я смогу выполнять код с повышенными правами. Но проблема в том, что этот пользователь хоть и имеет права администратора, но сам таковым не является, поэтому, например, я могу осуществить запись в его папку (чего с правами обычного пользователя я конечно же сделать не смог бы), но поднять или опустить сетевой интерфейс я не могу. Для этого уже надо запускать процесс изначально от имени Администратора, например, с помощью runas или из контекстного меню - "Запуск от имени администратора". Но хотелось бы всё это сделать из кода. Вопрос в том, возможно ли это? Ведь, насколько я понимаю, Windows не даёт полных административных прав даже тем пользователям, которые входят в группу "Администраторы". Такими правами обладает только пользователь Администратор, но он отключён, и включать его ради этого, думаю, не лучшая идея.
Спасибо за внимание!
Михаил: Можно и так конечно. Можно и процесс запустить изначально с правами уч. записи Администратор. Но не хотелось бы создавать отдельных компонентов (процессов или служб), если без них можно обойтись и сделать всё из своего кода. Если это возможно, конечно.
В windows невозможно изменить права у процесса во время исполнения. Можно только запустить с правами.
Кроме перезапуска или использовании отдельного приложения для нужной функциональности других вариантов нет.
У процесса может и нельзя, но вот внутри процесса в рантайме вполне можно исполнять участки кода под любыми учетными записями использую WindowsImpersonationContext
Ogoun Er: Я именно так и делаю, т.е использую WindowsImpersonationContext. Используя логин и пароль пользователя в рамках этого контекста я могу выполнять какие-то действия с правами этого пользователя. Но проблема в том, что если этим пользователем, например, является тот пользователь который был создан первым при установке Windows (он входит в группу "Администраторы") попытаться поднять или опустить сетевой интерфейс, то этого сделать не получиться, прав для этого у него не достаточно. Для этого нужен пользователь Администратор, который отключён по умолчанию. Тут прослеживается аналогия с тем, что даже если зайти в систему под учётной записью того первого пользователя, то всё равно, при действиях, которые требуют административных прав всё равно будет появляться запрос UAC. Т.о получается, что в рамках этого контекста права поднять можно, но их всё равно оказывается недостаточно для выполнения административных действий.