Вопрос или проблема
Итак, я создал этот скрипт 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-эксперта. Используя инструкции, аналогичные приведённым здесь, вы можете более эффективно решать возникающие проблемы и своевременно находить решения.