57

В системах * nix вы можете получить корневую оболочку следующим образом:

$ su # or 'sudo -s'
#

Корневая оболочка создается в том же терминале.

Я пытаюсь найти что-то, что делает подобное повышение на месте в командной строке Windows. Другими словами, он не должен создавать новое окно или отображать запросы UAC. До сих пор я был в состоянии сделать запланированное задание, которое обходит UAC, но окно командной строки с повышенными правами не появляется на месте.

Существует ли подобная команда для Windows, которая выполняет повышение на месте без появления нового окна?

8 ответов8

62

TL; DR - единственный вариант - создать другой процесс. (Новый cmd.exe .) В случае командной строки запуск нового экземпляра с токеном доступа с более высокими разрешениями всегда приведет к созданию нового окна .


Невозможно предоставить дополнительные разрешения для уже запущенного процесса.

Когда пользователь с правами администратора входит в систему Windows с включенным контролем учетных записей (UAC), создаются два отдельных токена доступа:

  1. Один с полным доступом администратора и
  2. Второй "фильтрованный токен" со стандартным доступом пользователя

В момент создания процесса (например, CMD.EXE) ему назначается один из этих двух токенов доступа. Если процесс запущен "с повышенными правами" от имени администратора, используется маркер доступа без фильтрации. Если процессу не предоставлены права администратора, используется отфильтрованный токен стандартного пользователя.

После создания процесса невозможно заменить его токен доступа. 1 В этой теме MSDN Application Security для Windows Desktop постер, идентифицирующий себя как член команды ядра Windows, заявляет:

Ядро NT никогда не предназначалось для переключения токенов после запуска процесса. Это связано с тем, что дескрипторы и т.д. Могут быть открыты в старом контексте безопасности, операции в полете могут использовать противоречивые контексты безопасности и т.д. В связи с этим, как правило, нет смысла переключать токен процесса после начала его выполнения. Тем не менее, это не было применено до Vista. [выделение мое] (Источник благодаря @Ben N)

Примечание. Контроль учетных записей пользователей был представлен с выпуском Windows Vista.

Этот ответ суперпользователя приводит два дополнительных источника, подтверждающих то же самое:

Поэтому просто невозможно поднять Командную строку или любой другой процесс на месте. Единственный вариант - порождать другой процесс с новым токеном доступа (который может быть другим экземпляром исходного процесса при желании). В случае командной строки запуск нового экземпляра с токеном доступа с более высокими разрешениями всегда приведет к созданию нового окна, и, если в системе включены запросы UAC, они также будут запущены.


1 Вы можете настроить привилегии в существующем токене доступа с помощью функции AdjustTokenPrivileges , но в соответствии с MSDN:

Функция AdjustTokenPrivileges не может добавлять новые привилегии к токену доступа. Он может только включать или отключать существующие привилегии токена.

18

Хотя я и являюсь активным пользователем TCC-LE , есть решение, которое не требует новых программ:

  • Запустите cmd от имени администратора.
  • Это должно запустить вас в %SystemRoot%\system32\ - если нет, cd .
  • copy cmd.exe cmdadmin.exe (или любое другое имя, например su.exe).
  • Теперь запустите Explorer и найдите cmdadmin.exe .
  • Щелкните правой кнопкой мыши и выберите « Свойства» .
  • На вкладке « Совместимость » выберите «Запуск от имени администратора» (или установите его для всех пользователей).

Теперь cmdadmin - это ваш su или sudo: вы можете запустить его без параметров, чтобы дать вам оболочку с правами администратора, или вы можете запустить его с /c чтобы выполнить одну команду в этом режиме. В зависимости от вашей политики, вы можете или не можете запросить подтверждение.

Обратите внимание, что это всегда будет открывать новое окно (как запускается / повышается решение TCC start /elevated ...): для приложения с графическим интерфейсом это ожидается, но для программы командной строки вы можете использовать /k вместо /c , чтобы дать вам возможность увидеть результат; или вы можете запустить через командный файл (возможно, sudo.cmd ?) который объединяет & pause до конца вашей строки выполнения.

В любом случае это не совсем то же самое, что su или sudo , но это самое близкое, что вы получите. Установив расположение окон вручную, можно создать новое окно непосредственно под оригиналом.

9

Есть ли команда, которая может поднять командную строку на месте?

Есть довольно неудобный способ:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

Были лучшие способы, но Microsoft закрыла их. Конечно, вы всегда можете засучить рукава и написать собственный сценарий, эквивалентный sudo с исходным кодом, который я только что дал вам.

Другими словами, он не должен создавать новое окно или отображать запросы UAC.

Богохульство! Сожги его в костре! ;) Шутки в стороне нет. Нет Это было бы ошибкой и уязвимостью безопасности. Microsoft предприняла явные усилия, чтобы гарантировать, что расширенный и стандартный процесс имеют как можно меньше общего.

Умные дети, которые думают о двух бэкэндах (один стандартный и один с повышенными правами) и один графический интерфейс для обоих, должны прочитать о Session 0 Isolation.

2

Существует ли подобная команда для Windows, которая выполняет повышение на месте без появления нового окна?

Такой команды нет. Хотя я этого не доказал, я верю в это, потому что я видел несколько способов использования дополнительного программного обеспечения / кода для решения этой проблемы.

Другими словами, он не должен создавать новое окно или отображать запросы UAC.

Забудь это. Абсолютно забудь об этом. Это идет вразрез с дизайном UAC. Если бы вы могли управлять этим, вы нарушаете фундаментальный процесс безопасности. Ожидайте, что ваше решение сломается на патч после того, как Microsoft узнает и исправит любой процесс, который вы можете предпринять, чтобы обойти это.

Решение, позволяющее избежать запросов UAC, состоит в том, чтобы начать с высокой отметки. UAC не должен беспокоить вас, если вы достаточно уполномочены. Если вы начнете с более низкого уровня прав (что часто рекомендуется для обеспечения безопасности), а затем попытаетесь сделать что-то, требующее более высокого уровня прав, тогда ожидайте взаимодействия с UAC.

2

То, что вы хотите, невозможно в Windows, потому что не поддерживает эту концепцию. Вам нужно начать новый процесс с более высокими разрешениями.

Я использую nircmd, чтобы поднять процессы из командной строки. Ваша команда будет nircmdc elevate cmd

2

Я увидел этот вопрос и нашел простое решение. Это крошечная утилита rsudo , которая запускает расширенные команды из обычного окна CMD.

Примечание: появится приглашение UAC. Спрятать это невозможно, просто так был разработан UAC.

Usage:
  rsudo.exe "[command]"

Скачать [Скачать не работает, скоро обновлю]

Примечание. Команды запускаются в новом окне. Если вы хотите просмотреть вывод, запустите rsudo.exe "pause && [command]"

0

Это странно

Вы можете попробовать сделать ssh на своем собственном компьютере, который будет использовать тот же существующий терминал, но на самом деле будет совсем другим.

Это будет работать, но это, вероятно, не то, что вы хотите.

Другие могут найти это полезным, хотя.

-1

Попробуйте выполнить командную строку JPSOFT Take TCC/LE. Он поставляется в 32- и 64-разрядных версиях и является бесплатным, если вам не нужна дополнительная функциональность.

Перейдите на https://jpsoft.com/ и нажмите «Загрузки» и выберите то, что вы хотите.

TCC/LE имеет START /ELEVATED, который запускает программу с повышенными правами администратора. (Только для Windows Vista или более поздней версии.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .