Почему msiexec не работает с Invoke-Command?

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

Итак, я создал этот скрипт PowerShell, чтобы удалить TortoiseVNC на удаленном компьютере.

Invoke-Command -ComputerName remotePC -ScriptBlock {
    $GUID = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | 
    Where-Object { $_.DisplayName -like "*TortoiseSVN*" }).UninstallString -replace '.*(\{[A-F0-9\-]+\}).*', '$1'
    $logPath="c:\temp\tortoise_log.txt" 
    msiexec.exe /x $GUID /qn /norestart /L*V `"$logPath`" MSIRESTARTMANAGERCONTROL=Disable
} -ErrorAction Continue

Но это работало только когда я был залогинен как администратор на удаленном ПК.
Изменение кода для запуска командной строки и последующего запуска msiexec как показано ниже исправило проблему, позволив деинсталлятору запускаться независимо от того, под какой учетной записью выполнен вход.

Start-Process -FilePath "cmd.exe" -ArgumentList "/c msiexec.exe /x $GUID /qn /norestart /L*V `"$logPath`" MSIRESTARTMANAGERCONTROL=Disable" -Wait -NoNewWindow

Почему это работает так?

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

Запрос предполагает выполнение команды для удаления TortoiseSVN с помощью PowerShell на удалённой машине, однако возникли проблемы при попытке выполнения этой команды через Invoke-Command. Сначала рассмотрим, зачем может появиться такая проблема, а затем рассмотрим её решение.

Теория

Безопасность и права доступа.

Invoke-Command в PowerShell используется для выполнения удалённых команд. Однако важно помнить, что права доступа, с которыми эта команда выполняется, особенно через удалённое подключение, могут отличаться от тех, которые имеются у интерактивного пользователя. Если удалённая команда требует повышенных прав, она может потерпеть неудачу, если не запущена с учётом этих прав.

Контекст выполнения.

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

Пример

Допустим, вы хотите удалить программу с удалённого компьютера. Вы запускаете следующий сценарий, который нацелен на удаление TortoiseSVN:

Invoke-Command -ComputerName remotePC -ScriptBlock {
    $GUID = (Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | 
    Where-Object { $_.DisplayName -like "*TortoiseSVN*"}).UninstallString -replace '.*(\{[A-F0-9\-]+\}).*', '$1'
    $logPath="c:\temp\tortoise_log.txt" 
    msiexec.exe /x $GUID /qn /norestart /L*V `"$logPath`" MSIRESTARTMANAGERCONTROL=Disable
} -ErrorAction Continue

Этот код может не сработать, потому что msiexec.exe, запущенный через удалённый Invoke-Command, может не иметь достаточных привилегий для выполнения удаления. Это связано с тем, что службы или системные процессы имеют разные контексты безопасности по сравнению с интерактивным пользователем или при локальном запуске с повышенными правами.

Применение

Чтобы обойти эту проблему, вы можете использовать Start-Process, который позволяет запустить процесс как часть команды оболочки, чтобы обойти ограничения безопасности. В частности, Start-Process позволяет запускать процессы с использованием разных контекстов безопасности. Этот подход работает, потому что cmd.exe часто имеет более высокие привилегии, особенно если он запущен с повышенными правами.

Start-Process -FilePath "cmd.exe" -ArgumentList "/c msiexec.exe /x $GUID /qn /norestart /L*V `"$logPath`" MSIRESTARTMANAGERCONTROL=Disable" -Wait -NoNewWindow

Этот сценарий решает проблему, так как он запускает cmd.exe, командный процессор, который затем выполняет msiexec.exe локально на удалённой машине. Поскольку Start-Process управляет созданием процесса, он может наследовать контекст безопасности, который обеспечит выполнение удаления с подходящими правами.

Таким образом, ключ к пониманию проблемы кроется в различии привилегий и контекстов безопасности между различными методами выполнения — непосредственно через Invoke-Command и через Start-Process.

Заключение

Выполнение административных задач, таких как удаление программного обеспечения через удалённое подключение, всегда сопряжено с особенностями, связанными с безопасностью. Различные контексты безопасности влияют на то, как и где процесс может быть выполнен, и иметь доступ к критическим системным ресурсам. Понимание этих различий и знание, как с ними справляться, это важный навык для IT-эксперта. Используя инструкции, аналогичные приведённым здесь, вы можете более эффективно решать возникающие проблемы и своевременно находить решения.

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

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