Вчера я в очередной раз наткнулся на то, что выполненной команде нужны права администратора, и воспользовался полезной функцией PowerShell, написанной на коленке Василием Гусевым. Ниже мой слегка измененный вариант.
function resudo ( [switch]$NoProfile ) { $cmdline = "-NoExit -command $((Get-History)[-1].commandline)" if ($NoProfile) {$cmdline = "-NoProfile $cmdLine"} Start-Process -FilePath powershell -ArgumentList $cmdline -Verb runas } function sudo ( [scriptblock]$sb, [switch]$NoProfile ) { $cmdline = "-NoExit -command $sb" if ($NoProfile) {$cmdline = "-NoProfile $cmdLine"} Start-Process -FilePath powershell -ArgumentList $cmdline -Verb runas }
Это нужно закинуть в профиль PowerShell, а если его нет — создать. После чего:
- Запуск предыдущей команды от имени администратора [после отлупа о недостатке прав]
vssadmin list shadows resudo
- Запуск команды от имени администратора [когда вы заранее знаете, что потребуется повышение]
sudo {vssadmin list shadows}
Демо:
Конечно, это совсем не то же самое, что sudo в Linux, но ускоряет работу и экономит время. Оригинал функции в чате инсайдеров, но я счел более удобным дефолтный запуск без выхода из PowerShell, т.е. сразу с -NoExit
.
P.S. Обычно такие небольшие посты я пишу в свой канал Telegram, но там затруднительно красиво опубликовать сложный код вместе с видео ✌
Евгений Грицан
Спасибо, думаю, пригодится.
Только я работаю с Powershell, используя ConEmu, он перехватывает создание окна интерпретатора, например после команды powershell в окне «Выполнить«. А функции sudo/resudo создают обычное новое окно с повышенными привилегиями. Можно ли изменить функции таким образом, чтобы открывались новые вкладки ConEmu?
Vadim Sterkin
Я не пользуюсь ConEmu, поэтому не могу ничего точно сказать. Могу лишь предположить, что все вкладки ConEmu работают в рамках одного «окна», т.е. одного приложения. Если оно запущено с обычными правами, то оно не может быть одновременно запущено с правами администратора.
Если мое предположение верно, то единственный выход — запуск нового экземпляра ConEmu с правами администратора и передача ему параметров команды.
Евгений Грицан
Я пользуюсь этой оболочкой довольно давно, не особо вдаваясь в её внутреннюю кухню. Но помню по какой-то статье, что там много всяких костылей, которые пришлось разработчикам напилить, чтобы перехватывать создание окон обработчиков cmd и powershell.
Судя по тому, что я могу создать отдельную вкладку с повышенными привилегиями внутри запущенного приложения с обычными правами, как-то всё же можно теоретически допилить скрипт, но я, конечно, не жду, что кто-то закопается. Просто вдруг у кого-то такой же рабочий сетап и больше знаний языка.
https://conemu.ru/img/ConEmu-Maximus5.png
Vadim Sterkin
Можете поспрашивать в чате @winsiders, там есть любители ConEmu.
Lecron
В поставке ConEmu есть свой батник, позволяющий запускать программы с повышенным приоритетом во вкладке. Тоже sudo в названии. Нужно изменить Start-process на использование этого батника. Что-то типа
Любопытная матрешка получается. Команда шела sudo, вызывает командный файл другого шела sudo, который открывает вкладку с первым шелом с админ-правами.
Vadim Sterkin
Угу, когда вопрос перекочевал в чат, я просто загуглил conemu elevated и вышел на док https://conemu.github.io/en/csudo.html
Ilya K
Отлично) Но к сожалению, это не совсем sudo: У вас открывается новая консоль.
Так происходит потому, что при запуске процесса с UAC (через глагол runAs) сам процесс запускается не из вашего процесса, а из системного сервиса (не помню, как он точно называется).
В итоге, процесс с повышенными привилегиями не является наследником вашего процесса, и не наследует от него ни хендлер консоли, ни stdout.
Насколько я понимаю, красивого решения «поднять привилегии существующей программе» без перезапуска не существует.
Мы в свое время решали это хаком, запуская свой привелигированный процесс, и прося его (через named pipe) запустить другой процесс. Но городить такое на powershell конечно никто не будет, да и вряд-ли новое окно является проблемой)
Vadim Sterkin
Да, у этого метода много ограничений, но RunAs в данном случае просто запуск от имени администратора, а не от имени системного процесса.
Наследником процесса де-факто является https://i.imgur.com/JVP2tXB.png , но я понял, о чем вы.
Да, перезапуск нужен. Тот же Process Explorer запускает новый экземпляр, если из меню перезапустить.
Fullmoon
Полезно, спасибо. Особенно resudo. Я пользуюсь sudo от http://blog.lukesampson.com/sudo-for-windows,
https://github.com/lukesampson/psutils/blob/master/sudo.ps1 — судя по объёму кода, оно более навороченное. И новые окна не открывает.
Надо будет туда resudo прикрутить.
Vadim Sterkin
Интересно, спасибо! Но он там подгружает kernel32.dll, тут надо о безопасности думать тоже.