Чи існує команда, яка може підняти командний рядок на місці?


61

У * nix системах ви можете отримати кореневу оболонку так:

$ su # or 'sudo -s'
#

Коренева оболонка породжується на місці в межах одного терміналу.

Я намагаюся знайти щось, що робить подібне, на місці підвищення в командному рядку Windows. Іншими словами, він не повинен породити нове вікно або відображати підказки UAC. Поки що мені вдалося скласти заплановане завдання, яке обходить UAC, але підвищене вікно командної строки не породилось на місці.

Чи існує аналогічна команда для Windows, яка виконує місце на висоті без нерестування нового вікна?


31
зауважте, що su / sudo -s насправді також починає новий процес оболонки. Просто підвищені процеси підключені до одного терміналу, тому вони здаються так, ніби вони підняті на місці.
Лже Раян

"це не повинно породжувати нове вікно чи відображати підказки UAC" Ви просто говорите, що воно не потребує графічної взаємодії? Або ви не хочете бути запропоновано взагалі ? Наприклад, sudoінколи запросить пароль, але це робиться з текстовим інтерфейсом. Мені якось цікаво, як сервери Nano (які, як я не вірю, навіть пропонують графічний інтерфейс для віддаленого робочого столу), обробляють це.
jpmc26

2
@ jpmc26 Взаємодія в текстовому інтерфейсі нормальна.
користувач2064000

@ jpmc26 Цікаво, чи навіть у сервера Nano є 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 для робочого столу Windows плакат, що ідентифікує себе як члена Команди Windows Kernel:

Ядро NT ніколи не передбачалося дозволяти перемикати маркер, як тільки процес почався. Це пов’язано з тим, що ручки тощо можуть бути відкриті в старому контексті безпеки, операції польотів можуть використовувати невідповідні контексти безпеки тощо. Як правило, зазвичай не має сенсу перемикати маркер процесу після того, як він розпочато виконання. Однак це не було застосовано до Vista . [Курсив мій] (Джерело завдяки до @Ben N )

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

Це Super User відповідь призводить два додаткових джерел , які підтверджують той же:

Тому просто неможливо підняти командний рядок або будь-який інший процес на місці. Єдиний варіант - породити інший процес новим маркером доступу (який, за бажанням, може бути ще одним екземпляром початкового процесу). У випадку з командним рядком, запуск нового примірника з маркером доступу, який має більш високі дозволи, завжди призведе до створення нового вікна, і якщо підказки UAC включені в системі, вони також будуть запускатися.


1 Ви можете налаштувати привілеї в існуючому маркері доступу за допомогою функції AdjustTokenPrivileges , але відповідно до MSDN :

Функція AdjustTokenPrivileges не може додавати нові права до маркера доступу. Він може лише вмикати або вимикати наявні привілеї маркера.


19

Хоча я захоплений користувач TCC-LE, є рішення, яке не потребує нових програм: -

  • Почніть cmdяк адміністратор.
  • Це має почати вас %SystemRoot%\system32\- якщо ні, то cdтам.
  • copy cmd.exe cmdadmin.exe(або будь-яке обране вами ім’я, наприклад su.exe).
  • Тепер запустіть Провідник і знайдіть cmdadmin.exe.
  • Клацніть правою кнопкою миші та виберіть Властивості .
  • На вкладці « Сумісність » виберіть запустити як адміністратор (або встановіть його для всіх користувачів).

Тепер cmdadminваш suабо sudo: ви можете запустити його без параметрів, щоб надати вам оболонку з адміністративними привілеями, або можете запустити її /cдля виконання однієї команди в цьому режимі. Залежно від політики, вам може бути або не вимагати підтвердження.

Зауважте, що це завжди відкриє нове вікно (як і рішення TCC start /elevated ...): для програми GUI це очікується, але для програми командного рядка ви можете використовувати /kзамість /c, щоб дати вам можливість побачити вихід ; або ви можете запустити через пакетний файл ( sudo.cmdможливо?), який з'єднується & pauseз кінцем рядка запуску.

В будь-якому випадку це не зовсім так, як suабо sudo, але це найближче, що ви отримаєте. Встановивши макет вікон вручну, нове вікно можна створити прямо внизу та прилягати до оригіналу.


Це, мабуть, найближча ОП, яка може дійти до поведінки sudo, з попередженням про те, що все-таки доведеться мати справу з новим вікном / процесом, що породжується. Хоча, мабуть, не найкраща ідея з точки зору безпеки, відключення всіх підказок UAC усуне необхідність реагувати на підказку UAC, коли запускається підвищений процес.
Я кажу: Відновити Моніку

@Twisty - Дякую за коментар. Мені було відомо про наслідки для безпеки, але вони не гірші за первісну передумову, що обліковий запис дозволяє Запустити як адміністратор . Кожен, хто реалізує це, вирішує, чи хоче він чи вона постійно нагадувати, коли це буде викликано.
AFH

2
Я не згадував наслідки для безпеки для вашої користі, а для інших читачів. Однак я не погоджуюся з тим, що відключення підказок UAC - це не гірше, ніж працювати адміністратором. Підказки UAC можуть перешкоджати користувачеві, який увійшов як адміністратор, надавати небажані адміністративні права на процес. Без підказок користувач втрачає цю можливість.
Я кажу: Відновити Моніку

@Twisty - Просто так. Моя відповідь виходила з подібних мотивів. Знову дякую.
AFH

1
замість копіювання cmd.exe створіть до нього символьне посилання. Таким чином, якщо Windows оновить його та виправить помилки безпеки, ви не запускаєте стару версіюmklink cmdadmin.exe cmd.exe
Йозеф

11

Чи існує команда, яка може підняти командний рядок на місці?

Є досить незручний спосіб:

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

Були й кращі способи, але Microsoft їх закрила. Звичайно, ви завжди можете засунути рукави і написати власний еквівалент сценарію sudoз вихідним кодом, який я вам щойно дав.

Іншими словами, він не повинен породити нове вікно або відображати підказки UAC.

Богохульство! Спаліть його на колі! ;) Жарт убік, ні. Немає. Це буде помилка та вразливість безпеки. Microsoft доклала явних зусиль для того, щоб підвищений і стандартний процес мали якомога менше спільного.

Розумні діти, які розмірковують про два зворотні частини (один стандартний та один піднесений) та один графічний передній для обох, повинні прочитати про сесію 0 Ізоляція .


2

Чи існує аналогічна команда для Windows, яка виконує місце на висоті без нерестування нового вікна?

Не існує такої команди, яка вбудована. Хоча я цього і не довів, я вважаю, що тому, що я бачив кілька способів використання додаткового програмного забезпечення / коду, щоб вирішити цю проблему.

Іншими словами, він не повинен породити нове вікно або відображати підказки UAC.

Забудь це. Абсолютно забути це. Це суперечить дизайну UAC. Якщо ви зможете цим керувати, ви порушуєте фундаментальний процес безпеки. Очікуйте, що ваше рішення зламається на патч після того, як Microsoft дізнається, і виправить будь-який процес, який ви могли б зробити для вирішення цього питання.

Рішення, щоб уникнути підказок UAC, - це мати високу висоту для початку. UAC не повинен вас турбувати, якщо ви маєте достатню повноваження. Якщо ви почнете з нижчої висоти (що часто рекомендується для переваг безпеки), а потім спробуйте зробити щось, що вимагає більш високого підвищення, тоді очікуйте взаємодії з ОАК.


Підказки UAC вже можна обійти плановим завданням; Я шукаю те, що робить місце на місці замість нерестування нового вікна командного рядка.
користувач2064000

Якщо ви це зробите, чи можете ви дійсно створити заплановану задачу, не задовольняючи вимог UAC? Щодо нересту, я кажу, що цього не очікую, тому що я помітив, що всі піднесені рішення, які я бачив до цього часу, включали початок нового процесу. Я думаю, що технічно підняття без запуску нового процесу може бути зроблено, оскільки інсталяційні програми можуть попросити UAC після їх запуску, але я не пам'ятаю, як я бачив якісь доступні рішення, легко імпортні в пакетний файл.
TOOGAM

Дійсно; Заплановані завдання повністю переможуть UAC. Після підняття ви можете піднятись до системи СИСТЕМИ через сервіси, а потім використовувати токен заміни в оригінальному процесі cmd.exe.
Джошуа

Є дещо офіційний сценарій PowerToy, який виконує основну роботу; Ви можете ввести, elevate cmdщоб відкрити нове вікно командного рядка за допомогою підказки UAC (на сайті також є команди контекстного меню!). Або, звичайно, ви можете просто Ctrl + Shift + клацнути піктограму панелі завдань будь-якого наявного вікна командного рядка, щоб зробити те саме - це те, що я схильний робити найчастіше. (Що я знаю, це не те, про що просила ОП, а те, що просила ОП, заблоковано дизайном.)
Мірал

2

Те, що ви хочете, неможливо в Windows, оскільки не підтримує цю концепцію. Потрібно розпочати новий процес із більш високими дозволами .

Я використовую nircmd, щоб підняти процеси з командного рядка. Ваша команда була бnircmdc elevate cmd


2

Я побачив це питання і придумав просте рішення. Це крихітна утиліта rsudo, яка називається , яка запускає ескальовані команди із звичайного вікна CMD.

Примітка: UAC підказка буде придумати. Приховувати це неможливо, саме так розроблено UAC.

Usage:
  rsudo.exe "[command]"

Завантажити [Завантаження не працює, незабаром оновиться]

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


Хіба не повинно бути rsudo.exe "[command] && pause"?

@fleet Ні, помилка змушує pauseзапускатися спочатку
rahuldottech

Рахул, дякую! Будь-який шанс вихідного коду? ;) (А може, я просто шукав у вашому веб-сайті неправильне місце.)
cxw

@cwz впевнений! Я відредагую його, коли
доїду

0

Цей дивний.

Ви можете спробувати зробити ssh у власному комп’ютері, який би використовував той самий існуючий термінал, але насправді був би зовсім іншим.

Це спрацює, але, мабуть, не те, що ви хочете.

Інші можуть вважати це корисним.


-1

Спробуйте командний рядок JPSOFT Take Command TCC / LE. Він поставляється в 32- та 64-бітних версіях і є безкоштовним, якщо ви не хочете більше функціоналу.

Перейдіть на сторінку https://jpsoft.com/ і натисніть на Завантаження та виберіть те, що потрібно.

TCC / LE має функцію START / ELEVATED, яка запускає програму, підвищену з повними правами адміністратора. (Тільки для Windows Vista або новішої версії.)


1
Як це пов’язано з питанням?
користувач2064000

@DavidGrainger виявляється, що перемикач / підвищений все ще не дозволяє мені обійти UAC і зробити місце на висоті (детальніше див. Питання). Я щось пропускаю?
користувач2064000

Це заміна командного рядка Windows. Плюс до того, що запустити його піднятим не відрізняється від запуску вбудованого командного рядка підвищеним.
Я кажу, відновіть Моніку

Єдиний спосіб, можливо, змінити налаштування UAC на "Ніколи не повідомляти". Коли повідомлення UAC з'явиться, натисніть посилання "Показати більше деталей", а потім виберіть посилання "Показати, коли це повідомлення повинно з'являтися". Виберіть налаштування, яке працює. Можливо, ви захочете змінити його назад, коли будете готові, тому на нього потрапляють небажані дії. це можна зробити в налаштуваннях Windows.
Девід Грінгер

TCC / LE теж багато іншого. Я спробував це з набором UAC, щоб ніколи не використовувався, а потім використовував "Start / Elevated / PGM" C: \ Program Files \ IrfanView \ i_view64.exe "/ thumbs", щоб відкрити програму "Підвищений".
Девід Грінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.