Использование runas.exe, похоже, не работает как sudo в PowerShell.

Вопрос или проблема

Я пытаюсь использовать runas в функции PowerShell в качестве подобия sudo, но runas, похоже, не предоставляет мне доступ администратора. Например, я получаю отказ в доступе при выполнении:

runas /user:admin "cmd /K mkdir C:\Windows\System32\mydirectory"

Также, если я открываю vim и пытаюсь сохранить файл в System32, мне выдается ошибка при сохранении:

runas /user:admin "C:\Program Files (x86)\Vim\vim74\gvim.exe C:\Windows\System32\mynewtextfile.txt"

Я не думаю, что это проблема с учетными данными, потому что я могу выполнять неадминистративные задачи, такие как запись файлов на рабочий стол, и мой пароль, похоже, работает нормально. Я проверил в инструменте “Управление компьютером” в административных инструментах, и “admin” входит в группу “Администраторы”. Что я упускаю? Я на Windows 7 Pro.

В ходе моего исследования в Windows 10 следующие команды РАБОТАЮТ:

Повышение привилегий:

saps -Verb RunAs "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory"

Смена пользователя:

saps -Verb RunAsUser "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory"

Следующие команды НЕ РАБОТАЮТ:

  • runas /user:admin "cmd /K mkdir C:\Windows\System32\mydirectory" – это не приводит к повышению привилегий
  • saps -Credential admin "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory" – это не приводит к повышению привилегий
  • New-Item -Credential admin "C:\Windows\System32\mydirectory" – провайдер FileSystem не поддерживает альтернативные учетные данные, кроме команды New-PSDrive.

Я нашел следующую информацию в документации get-help -full start-process:

# Запускает процесс PowerShell с правами “Запуск от имени администратора”.

PS C:>start-process powershell.exe -verb runas

Насколько я понимаю, runas.exe может сменить пользователя, но не поднимет ваши привилегии. Однако, исходя из вышеуказанной цитаты, процесс Start-Process в PowerShell может использоваться для этого, так что я в итоге сделал следующее в своей функции sudo, которая, похоже, работает довольно хорошо:

$MY_PROFILE_TMP="$Env:TMP\my_profile_tmp";
Function Init-TMP() {
   #Убедитесь, что мой личный временный каталог существует
   if (!(Test-Path $MY_PROFILE_TMP)) {
      mkdir $MY_PROFILE_TMP | Out-Null
   }
}

Function As-Admin() {
   Init-TMP

   #Создайте уникальные временные файлы для захвата stderr и stdout
   $GUID=New-Guid
   $ADMIN_OUT="$MY_PROFILE_TMP\$($GUID)_OUT.txt"
   $ADMIN_ERR="$MY_PROFILE_TMP\$($GUID)_ERR.txt"

   #Удалить временные файлы, если по какой-то аномалии или ошибке они уже существуют
   rm -ErrorAction Ignore $ADMIN_OUT
   rm -ErrorAction Ignore $ADMIN_ERR

   #Запустите PowerShell с повышенными привилегиями и запишите в временные выходные и ошибочные файлы
   #Без &{}, недопустимые команды, такие как `sudo dinosaur`, не будут
   #захвачены в файл ошибок
   Start-Process powershell "& { $args } 2>$ADMIN_ERR > $ADMIN_OUT" -Verb runas -Wait -WindowStyle Hidden

   #Запишите в текущую консоль результаты выхода и ошибок из повышенного процесса
   #TODO идеал, мы бы читали из этих файлов как поток, чтобы порядок был правильным...
   cat $ADMIN_ERR -Delimiter None | Write-Error
   cat $ADMIN_OUT

   #Удалите временные файлы
   rm -ErrorAction Ignore $ADMIN_OUT
   rm -ErrorAction Ignore $ADMIN_ERR
}

#Создайте псевдоним "sudo"
New-Alias -Name sudo -Value As-Admin

У вас включен UAC? Если да, то запускаете ли вы скрипт PowerShell из повышенной подсистемы?

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

К сожалению, это просто способ работы UAC. Единственное отличие заключается в том, что CLI-приложение (такое как runas) не может запрашивать повышение полномочий, когда это необходимо, так как это может сделать графическая программа. В Windows нет эквивалента команды sudo в операционных системах *NIX.

Ответ или решение

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

Проблема с runas.exe

Команда runas.exe позволяет запускать программы с другой учетной записью, однако она не предоставляет реального повышения привилегий. Это связано с тем, что runas наследует права доступа от родительского процесса. Если вы запустили runas из консоли PowerShell, которая не имеет повышенных прав, то команда попросту не сможет получить доступ к ресурсам, требующим административных прав, даже если используется учетная запись с административными полномочиями.

Например, запуск команды:

runas /user:admin "cmd /K mkdir C:\Windows\System32\mydirectory"

не приведет к успеху, если PowerShell была запущена без прав администратора. Таким образом, для успешного выполнения команды вам необходимо либо запустить PowerShell с повышенными правами, либо использовать другой метод.

Альтернативный способ — Start-Process

Как вы правильно заметили, Start-Process с параметром -Verb RunAs предоставляет более эффективный способ запуска процессов с повышенными привилегиями. Этот метод инициирует новую сессию PowerShell с правами администратора, что позволяет выполнять команды, требующие повышенного доступа.

Пример использования:

Start-Process powershell.exe -Verb RunAs -ArgumentList "-Command mkdir C:\Windows\System32\mydirectory"

Этот способ позволил вам создать функцию As-Admin, которая значительно упрощает выполнение команд с административными правами.

Важное замечание о UAC

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

Итог

Таким образом, если вам необходимо использовать команду, аналогичную sudo в UNIX-системах, эффективно воспользуйтесь реализованной вами функцией As-Admin. Это не только решит проблемы с правами доступа, но и обеспечит более удобное выполнение различных команд в PowerShell.

Если у вас есть дополнительный вопрос или требуется помощь по конкретным ситуациям, не стесняйтесь сообщить.

Оцените материал
Добавить комментарий

Капча загружается...