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

61

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

$ su # or 'sudo -s'
#

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

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

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

user2064000
источник
31
обратите внимание, что su / sudo -s на самом деле также запускает новый процесс оболочки. Просто повышенные процессы подключены к одному и тому же терминалу, поэтому они выглядят так, как будто он повышен на месте.
Ли Райан
«не должно появляться новое окно или отображаться запросы UAC». Вы просто говорите, что не должны требовать графического взаимодействия? Или вы не хотите быть предложено вообще ? Например, sudoиногда запрашивает пароль, но это происходит с помощью текстового интерфейса. Мне интересно, как Nano-серверы (которые, по-моему, даже не предлагают графический интерфейс для удаленного рабочего стола по умолчанию) справляются с этим.
jpmc26
2
@ jpmc26 Взаимодействие с текстовым интерфейсом в порядке.
user2064000
@ jpmc26 Интересно, есть ли на нано-сервере UAC? Учитывая, что он оптимизирован для контейнеров, он не очень полезен. Это было отключено и в версиях Server Core, IIRC. Если вы включили его случайно, вы получите целую
кучу
2
@ user2064000 Приглашение UAC (по крайней мере по умолчанию для двоичных файлов, отличных от Windows) запускается на защищенном рабочем столе, а не на текущем рабочем столе пользователя. Помимо того, что это немного раздражает, оно предназначено для предотвращения вмешательства других процессов в приглашение UAC. Кроме того, если требуется аутентификация, она должна быть на защищенном рабочем столе, и некоторым администраторам может также потребоваться последовательность Ctrl-Alt-Del, чтобы доказать, что Windows принимает пароль, а не какой-то другой процесс, выдающий запрос пароля. Таким образом, ввод пароля в окне cmd, вероятно, не сработает с точки зрения безопасности Microsoft.
Calchas

Ответы:

65

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 не может добавлять новые привилегии к токену доступа. Он может только включать или отключать существующие полномочия токена.

Я говорю Восстановить Монику
источник
19

Хотя я энтузиаст пользователя 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, но это самое близкое, что вы получите. Установив расположение окон вручную, можно создать новое окно непосредственно под оригиналом.

AFH
источник
Это, вероятно, самый близкий ОП к поведению sudo, с оговоркой о том, что все еще приходится иметь дело с новым окном / процессом, порождаемым. Хотя это, вероятно, не самая лучшая идея с точки зрения безопасности, отключение всех приглашений UAC избавит от необходимости отвечать на приглашение UAC при запуске процесса с повышенными правами.
Я говорю Восстановить Монику
@ Твисти - Спасибо за комментарий. Я знал о последствиях для безопасности, но они не хуже первоначального предположения, что учетная запись позволяет запускать от имени администратора . Каждый, кто его реализует, должен решить, хочет ли он или она постоянно напоминать о каждом вызове.
AFH
2
Я не упомянул последствия для безопасности для вашей выгоды, а скорее для других читателей. Однако я не согласен с тем, что отключение запросов UAC ничуть не хуже, чем работа в качестве администратора. Запросы UAC могут помешать пользователю, вошедшему в систему с правами администратора, предоставить нежелательные административные права процессу. Без подсказок пользователь лишается этой возможности.
Я говорю Восстановить Монику
@ Твисти - Просто так. Мой ответ исходил из аналогичных мотивов. Еще раз спасибо.
AFH
1
вместо копирования cmd.exe создайте символическую ссылку на него. Таким образом, если Windows обновляет его и исправляет ошибки безопасности, вы не запускаете старую версиюmklink cmdadmin.exe cmd.exe
Josef
11

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

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

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

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

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

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

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


источник
2

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

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

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

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

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

TOOGAM
источник
Запросы UAC уже могут быть обойдены с запланированной задачей; Я ищу что-то, что делает повышение на месте, а не порождает новое окно командной строки.
user2064000
Если вы сделаете это, действительно ли вы сможете настроить запланированное задание, не удовлетворяя требованиям UAC? Что касается нереста, я говорю, что не ожидаю этого, потому что я заметил, что все решения для повышения, которые я видел до сих пор, включали запуск нового процесса. Я думаю, что технически повышение уровня без запуска нового процесса может быть выполнено, поскольку программы установки могут запрашивать UAC после их запуска, но я не припоминаю, чтобы когда-либо видел какие-либо легкодоступные решения, которые легко импортируются в пакетный файл.
ТООГАМ
На самом деле; Запланированные задачи полностью победят UAC. После повышения вы можете перейти в SYSTEM через службы, а затем использовать маркер замены в исходном процессе cmd.exe.
Джошуа
Есть несколько официальный скрипт PowerToy, который выполняет основную работу; Вы можете напечатать, elevate cmdчтобы открыть новое окно командной строки с приглашением UAC (на сайте также есть команды контекстного меню!). Или, конечно, вы можете просто нажать Ctrl + Shift + щелкнуть значок на панели задач любого существующего окна командной строки, чтобы сделать то же самое - это то, что я склонен делать чаще всего. (Что я знаю, это не то, о чем просил ОП, но то, о чем просил ОП, заблокировано по замыслу.)
Мирал,
2

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

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

magicandre1981
источник
2

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

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

Usage:
  rsudo.exe "[command]"

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

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

rahuldottech
источник
Разве это не должно быть rsudo.exe "[command] && pause"?
@fleet Нет, сначала ошибка pauseзапускается
rahuldottech
Рахул, спасибо! Есть ли шанс исходного кода? ;) (Или, может быть, я просто искал не в том месте на вашем сайте.)
cxw
@cwz уверен! Я отредактирую это, когда
доберусь
0

Это странно

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

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

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

Прадьёт Шандиля
источник
-1

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

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

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

Дэвид Грейнджер
источник
1
Как это связано с вопросом?
user2064000
@DavidGrainger выясняется, что ключ / elevated по-прежнему не позволяет мне обходить UAC и выполнять повышение на месте (подробности см. В вопросе). Я что-то пропустил?
user2064000
Это замена для командной строки Windows. Кроме того, запуск с повышенными правами ничем не отличается от запуска встроенной командной строки с повышенными правами.
Я говорю Восстановить Монику
Единственный способ, возможно, изменить настройки UAC на «Никогда не уведомлять». Когда всплывет уведомление UAC, нажмите ссылку «Показать дополнительные сведения», затем выберите ссылку «Показать, когда должно появиться это уведомление». Выберите настройку, которая работает. Вы можете изменить его обратно, когда закончите, поэтому нежелательные действия будут обнаружены. это можно сделать в настройках Windows.
Дэвид Грейнджер
TCC / LE также делает много других вещей. Я попытался сделать это с UAC, установленным на «никогда», и затем использовал «Start / Elevated / PGM» C: \ Program Files \ IrfanView \ i_view64.exe «/ thumbs», чтобы открыть программу Elevated.
Дэвид Грейнджер