- Вопрос или проблема
- Невозможно предоставить дополнительные привилегии уже запущенному процессу.
- Особенности
- Установка
- Ответ или решение
- Есть ли команда, которая может повысить права в командной строке Windows без открытия нового окна?
- Причины невозможности повышения прав в той же сессии
- Варианты решения задачи
- Заключение
Вопрос или проблема
На системах *nix вы можете получить root-шелл следующим образом:
$ su # или 'sudo -s'
#
Root-шелл запускается в том же терминале, на месте.
Я пытаюсь найти что-то похожее, что позволит в Windows Command Prompt поднять привилегии на месте. Другими словами, оно не должно открывать новое окно или показывать запрос UAC. Пока что мне удалось создать запланированную задачу, которая обходит UAC, но окно с повышенными привилегиями Command Prompt не запускается на месте.
Существует ли подобная команда для Windows, которая поднимет привилегии на месте без открытия нового окна?
Кратко: – Единственный вариант – это запустить другой процесс. (Новый cmd.exe
.) В случае с Command Prompt, запуск нового экземпляра с access token, имеющим более высокие привилегии, всегда приведет к созданию нового окна.
Невозможно предоставить дополнительные привилегии уже запущенному процессу.
Когда пользователь с административными правами входит в систему Windows с включенным User Account Control (UAC), создаются два отдельных access token:
- Один с полными правами администратора, и
- Второй “фильтрованный токен” с правами обычного пользователя
В момент создания процесса (например, CMD.EXE
) ему назначается один из этих двух access token. Если процесс запускается с повышенными правами администратора, используется нефильтрованный access token. Если процессу не предоставлены администраторские права, используется фильтрованный токен обычного пользователя.
После создания процесса невозможно заменить его access token.1 В этом обсуждении MSDN Application Security for Windows Desktop участник, представившийся как член команды Windows Kernel, утверждает:
Ядро NT никогда не предполагало возможность переключения токенов после начала работы процесса. Это связано с тем, что дескрипторы и другие сущности могут быть открыты в старом контексте безопасности, операции могут использовать несовместимые контексты безопасности и т.д. Поэтому обычно не имеет смысла переключать токен процесса после начала его выполнения. Однако это не было в полной мере запрещено до Vista. [выделение мое] (Источник спасибо @Ben N)
Примечание: User Account Control был введен с выходом Windows Vista.
Этот ответ на Super User ссылается на два дополнительных источника, подтверждающих то же самое:
-
Пост в блоге devzest.com Programming Elevated Privilege/UAC:
Код может быть повышен на уровне процессов при запуске, что означает, что уже запущенный процесс не может быть повышен. Чтобы повысить существующее приложение, необходимо создать новый экземпляр процесса приложения…
-
Статья на techtarget.com How to elevate programs’ privileges correctly using Vista’s UAC:
Программы не могут быть повышены после их запуска…
Поэтому просто невозможно повысить привилегии в командной строке или любом другом процессе на месте. Единственный вариант – запустить другой процесс с новым access token (это может быть другой экземпляр оригинального процесса, если это необходимо). В случае с Command Prompt, запуск нового экземпляра с access token, имеющим более высокие привилегии, всегда приведет к созданию нового окна, и если на системе включены запросы UAC, они также будут срабатывать.
1 Вы можете изменить привилегии в существующем access token с помощью функции AdjustTokenPrivileges, но согласно MSDN:
Функция AdjustTokenPrivileges не может добавлять новые привилегии в access token. Она может только включать или отключать существующие привилегии токена.
Хотя я являюсь увлеченным пользователем TCC-LE
, существует решение, которое не требует никаких новых программ:-
- Запустите
cmd
от имени администратора. - Это должно запустить вас в
%SystemRoot%\system32\
– если нет,cd
туда. copy cmd.exe cmdadmin.exe
(или любое имя, которое вы выберете, например,su.exe
).- Теперь откройте Explorer и найдите
cmdadmin.exe
. - Щелкните правой кнопкой мыши и выберите Свойства.
- На вкладке Совместимость выберите запуск от имени администратора (или установите для всех пользователей).
Теперь cmdadmin
– это ваш su
или sudo
: вы можете запустить его без параметров, чтобы получить оболочку с административными привилегиями, или вы можете запустить его с /c
для выполнения одной команды в этом режиме. В зависимости от ваших политик, вас могут попросить подтвердить действие.
Обратите внимание, что это всегда откроет новое окно (как и решение TCC start /elevated ...
): для GUI-приложения это ожидаемо, но для программы командной строки вы можете использовать /k
вместо /c
, чтобы иметь возможность увидеть вывод; или вы можете запустить через пакетный файл (возможно, sudo.cmd
?), который добавляет & pause
в конце вашей строки запуска.
В любом случае это не совсем то же самое, что su
или sudo
, но это самое близкое, что вы можете получить. Установив макет окон вручную, новое окно можно создать непосредственно ниже и вплотную к оригиналу.
Существует ли команда, которая может повысить привилегии в командной строке на месте?
Существует довольно неудобный способ:
powershell -Command "Start-Process 'cmd.exe' -Verb runAs"
Были лучшие способы, но Microsoft закрыла их. Конечно, вы всегда можете взять и написать собственный скрипт-эквивалент sudo
с тем исходным кодом, который я только что дал вам.
Другими словами, она не должна открывать новое окно или показывать запросы UAC.
Богохульство! Сожгите его на костре! 😉 Шутки в сторону, нет. Такого способа нет. Это была бы ошибка и уязвимость в безопасности. Microsoft прилагала все усилия, чтобы обеспечить как можно меньше общего между процессом с повышенными привилегиями и стандартным процессом.
Умные ребята, которые думают о двух бэкэндах (один стандартный и один с повышением), и об одном графическом интерфейсе для обоих, должны прочитать о изоляции сеанса 0.
Невозможно поднять привилегии, пропустив UAC, иначе это нарушит принцип безопасности Windows.
Но есть инструменты, которые это позволяют. Как, например, gsudo
, sudo для Windows, который позволяет поднимать привилегии командной строки на месте. Я являюсь автором.
Он показывает окно UAC для первого повышения. Если вы воспользуетесь gsudo
снова прежде чем истечет время повышенного gsudo, запрос UAC не появится снова.
Особенности
- Повышенные команды отображаются в консоли на уровне пользователя, как это делает
*nix sudo
, вместо того чтобы открывать команду в новом окне. - Кэширование учетных данных: Если
gsudo
вызывается несколько раз в течение нескольких минут, он показывает окно UAC только один раз. - Поддержка команд CMD:
gsudo md folder
(нет необходимости использовать более длинную формуgsudo cmd.exe /c md folder
) - Поддержка команд PowerShell, если вы вызываете из PS оболочки.
- Скрипты:
gsudo
можно использовать в скриптах, которые требуют повышения одной или нескольких команд. (всплывающее окно UAC появится один раз).- Выводы и коды выхода повышенных команд можно интерпретировать: Например, StdOutbound можно перенаправить или захватить (
gsudo dir | findstr /c:"bytes free" > FreeSpace.txt
) и коды выхода тоже (‘%errorlevel%’)). - Если
gsudo
вызывается (с параметрами) из уже повышенной консоли, он просто выполнит команды. Таким образом, если вы вызываете скрипт, использующийgsudo
из уже повышенной консоли, он также будет работать. Окно UAC не появится.
Установка
- Установка через Scoop:
scoop install gsudo
- Установка через Chocolatey:
choco install gsudo
- Или:
PowerShell -Command "Set-ExecutionPolicy RemoteSigned -scope Process; iwr -useb https://raw.githubusercontent.com/gerardog/gsudo/master/installgsudo.ps1 | iex"
Смотрите его в действии:
Проект на GitHub https://github.com/gerardog/gsudo
Существует ли подобная команда для Windows, которая поднимет привилегии на месте без открытия нового окна?
Такой встроенной команды нет. Хотя я этого не доказал, я в это верю, потому что видел множество способов использовать дополнительное ПО/код, чтобы обойти эту проблему.
- Например: решение Андерса
- Другой пример: скрипт Мэтта (см. также последующее действие Стивена)
Другими словами, она не должна открывать новое окно или показывать запросы UAC.
Забудьте об этом. Абсолютно забудьте. Это идет вразрез с дизайном UAC. Если вам удается это сделать, вы нарушаете фундаментальный процесс безопасности. Ожидайте, что ваше решение сломается патчем, после того, как Microsoft узнает о нем и исправит, какой бы процесс вы ни использовали, чтобы обойти это.
Решение, чтобы избежать запросов UAC, состоит в том, чтобы изначально получить высокий уровень повышения. UAC не должен вас беспокоить, если вы наделены достаточной авторизацией. Если вы начинаете с более низкого уровня повышения (что часто рекомендуется с точки зрения безопасности) и затем пытаетесь сделать что-то, требующее более высокого уровня повышения, то ожидайте взаимодействия с UAC.
То, что вы хотите, невозможно в Windows, поскольку это не поддерживается концепцией. Вам нужно запустить новый процесс с более высокими привилегиями.
Я использую nircmd, чтобы повышать процессы из командной строки. Ваша команда будет nircmdc elevate cmd
Я увидел этот вопрос и придумал простое решение. Это небольшая утилита под названием rsudo
, которая выполняет повышенные команды из обычного окна CMD.
Примечание: Запрос UAC появится. Скрыть его невозможно, так как именно так был спроектирован UAC.
Использование:
rsudo.exe "[команда]"
Скачать [Скачивание не работает, будет обновлено вскоре]
Примечание:
Команды выполняются в новом окне. Если вы хотите увидеть вывод, выполните rsudo.exe "pause && [команда]"
Это немного странно.
Вы могли бы попробовать сделать ssh на свой собственный компьютер, что использовало бы тот же существующий терминал, но на самом деле это был бы совершенно другой.
Это сработает, но, возможно, это не то, что вам нужно.
Однако другим это может быть полезно.
Почему бы не закончить команду, указанную выше? Хотел скопировать что-то в IIS
powershell -Command "Start-Process 'cmd.exe' -Verb runAs
-ArgumentList '/K xcopy %cd%\... \inetpub\wwwroot\... /s %1'"
Этот пример после подтверждения повышения копирует из текущей директории в IIS, и увеличенное cmd остается открытым + я могу добавить 1 параметр (например, /Y для пропуска подтверждений перезаписи).
Попробуйте JPSOFT Take Command командную строку TCC/LE. Доступна в 32- и 64-битных версиях и бесплатна, если вам не нужно больше функциональности.
Перейдите на https://jpsoft.com/ и нажмите Скачать и выберите, что хотите.
У TCC/LE есть START /ELEVATED, что запускает программу с повышенными административными правами. (Только для Windows Vista или новее.)
Ответ или решение
Есть ли команда, которая может повысить права в командной строке Windows без открытия нового окна?
На *nix системах получить root-доступ в терминале можно с помощью команды su
или sudo -s
, которая запускает shell с правами администратора в той же сессии. К сожалению, в Windows такой подход невозможен без открытия нового окна или отображения UAC-запросов. Рассмотрим, почему это так и какие существуют альтернативы.
Причины невозможности повышения прав в той же сессии
В Windows, начиная с Vista, пользовательский контроль учетных записей (User Account Control, UAC) разработан таким образом, чтобы предотвратить возможность "внедрения" дополнительных прав в уже работающий процесс. Когда процесс запускается, ему назначается один из двух токенов доступа: с ограниченными правами или с правами администратора. Эти токены создаются для защиты системы и не могут быть изменены в процессе выполнения программы.
Варианты решения задачи
-
Создание нового процесса: В Windows единственным способом выполнения команд с правами администратора является запуск нового процесса. Например, вы можете использовать PowerShell для этого:
powershell -Command "Start-Process 'cmd.exe' -Verb runAs"
Это запустит новую консоль с правами администратора, но, конечно, вызовет UAC-запрос.
-
Использование сторонних утилит: Существуют приложения, такие как
gsudo
, которые пытаются имитировать поведениеsudo
в Windows. Они позволяют выполнять команды с повышенными правами в том же окне, требуя подтверждения через UAC только один раз за определенный период.Установка gsudo:
- Через Scoop:
scoop install gsudo
- Через Chocolatey:
choco install gsudo
После установки, команда
gsudo
позволяет выполнять команды с правами администратора в текущей сессии. - Через Scoop:
-
Ручная настройка приложений: Можно создать копию
cmd.exe
, назвать еёcmdadmin.exe
, и в свойствах файла на вкладке "Совместимость" установить запуск от имени администратора. Однако это решение потребует отдельного окна.
Заключение
В контексте безопасности Windows, поднятие прав без открытия нового окна и без диалога UAC – невозможно. Даже если существуют обходные пути с использованием сторонних инструментов, они всегда будут основаны на создании новых процессов. Это внедрено на уровне Windows для предотвращения уязвимостей и соблюдения безопасности.
Таким образом, оптимальным подходом является использование подходящих решений, сохраняющих баланс между удобством и безопасностью, таких как gsudo
, которые минимизируют взаимодействие с UAC без нарушения системных протоколов безопасности.