Трусов Михаил — SuperProgrammist.Ru

Михаил Юрьевич Трусов

Более 25 лет опыта в программировании

"Sudo for Windows". Удобный запуск скриптов с правами администратора в командной строке

13.09.2023

Стандартным правилом компьютерной безопасности давно стало выполнение повседневной работы из-под учетной записи пользователя с ограниченными правами и только критические системные действия выполнять от имени суперюзера (администратора). Но это подразумевает, что есть средство для удобного запуска программ от имени администратора в нужный момент, в частности, во время работы в командной строке.

В Линукс для этого есть команда sudo, а в Windows, до появления Vista (UAC), такую задачу выполняла команда runas, которая позволяла запускать программы от имени администратора. Но с появлением UAC команда runas перестала работать, как раньше. Т.е. она, конечно, запускает программы от имени другого пользователя, но не дает ему прав администратора, даже если пользователь был наделен такими правами (Be aware that runas does not provide the ability to launch an application with an elevated access token, regardless of whether it is a standard user with privileges like a Backup Operator or an administrator). При этом, конечно, в оконном интерфейсе Windows всегда можно запустить программу с помощью пункта контекстного меню "Запуск от имени администратора".

Опытными пользователями Windows было придумано решение для поднятия прав определенного скрипта: вариант раз, вариант два и много аналогичных вариаций подобного рода. Идея сводится к тому, чтобы перед выполнение кода, попытаться выполнить действие, которое требует административных привилегий и, если получен отказ, то получить права администратора с помощью выполнения в скрипте vbs команды ShellExecute с параметром "runas", которая запустить скрипт с повышенными правами.

Несмотря на продуманность и всестороннюю проработанность этого решения интернет-сообществом, оно имеет "фатальный недостаток": подразумевается, что это код копируется во все скрипты, где нужны привилегии администратора. А это означает дублирование кода и конец правильного программирования :-).

Возникла идея переделать скрипт таким образом, чтобы он запускал с повышенными правами не сам себя, а переданною ему программу с ее параметрами. Сказано — сделано:

Если поместить данный скрипт в папку, указанную в переменной PATH, и назвать его sudo.cmd, то мы получим свой вариант "sudo for Windows". Его можно будет запускать из любой папки и он запустить переданную ему в первому параметру программу с повышенными правами в этой же папки. Например, так:

или так

или для запуска скриптов из предыдущей статьи:

Программу для запуска скрипту можно передавать с указанием полного пути или только имени файла. В последнем случае скрипт попытается найти ее либо в текущей папке, либо в папках, указанных в переменной PATH. Если программа будет найдена, то у вас будет запрошен пароль администратора, и программа будет запущена с повышенными полномочиями.