【问题标题】:Powershell/batch uninstall script works locally but not when using invoke-commandPowershell / 批量卸载脚本在本地工作,但在使用调用命令时不起作用
【发布时间】:2019-04-10 13:12:04
【问题描述】:

我有一个脚本,它将带有一些参数的 .exe 远程安装到运行良好的服务器列表中。当我尝试做几乎完全相同的事情但运行安装到 C:\Program Files (x86)\ 的 uninstall.exe 时,它​​将不起作用。

当我在本地服务器上运行脚本时,它会启动卸载。当我尝试使用 powershell invoke-command 运行完全相同的脚本或命令时,它将无法正常工作。

$serverlist = Get-Content -Path C:\NagiosInstall\test.txt

ForEach ($server in $serverlist) {

New-Item -Path "\\$server\C$\" -Name "NagiosInstall" -Force -ItemType "directory"
Copy C:\NagiosInstall\ncpa-2.1.6.exe \\$server\C$\NagiosInstall\ncpa-2.1.6.exe
Copy C:\NagiosInstall\install.bat \\$server\C$\NagiosInstall\install.bat

invoke-command -ComputerName $server -ScriptBlock {C:\NagiosInstall\install.bat}

Start-Sleep -s 15
invoke-Command -ComputerName $server -ScriptBlock {Remove-Item -LiteralPath "C:\NagiosInstall" -Force -Recurse}

}

安装 .bat 只是一个简单的命令,用于静默安装 ncpa-2.1.6.exe。

以上是我的安装脚本,这部分一切正常。

invoke-command -ComputerName $server -ScriptBlock {Start-Process -FilePath "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"}

运行上述命令,没有任何反应。没有错误,什么都没有。

& "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"

但是在以管理员身份在服务器上本地运行的 powershell 中运行上述命令,它工作得很好。

我也尝试过相同的方法来创建、复制和运行批处理文件,与上面的“安装”代码非常相似。同样的事情......没有任何反应,但如果你在服务器上本地运行批处理,它工作得很好。如果有人感兴趣,我可以发布此代码。

我猜它与 invoke-command 或它位于 C:\Program Files (x86) 中的事实有关,这可能会使语法不同,但我尝试了很多除了创建帐户并在此处发布之外,我没有其他想法。

【问题讨论】:

    标签: powershell batch-file cmd


    【解决方案1】:

    问题在于Invoke-Command 以非交互方式运行,因此无法以管理员身份运行并响应 UAC 提示。

    唯一的解决方法是通过带有凭据的 PSSession 连接到计算机,并以这种方式执行:

    $Cred = Get-Credential
    $Session = New-PSSession -ComputerName $server -Credential $Cred
    Invoke-Command -Session $Session -ScriptBlock {Start-Process -FilePath "C:\Program Files (x86)\Nagios\NCPA\uninstall.exe" -ArgumentList "/S"}
    $Session | Exit-PSSession
    

    编辑:

    安装程序工作的原因是 Windows 安装的 UAC 提示与 Windows 中的任何其他提示不同,请参阅:How to Silence the UAC Prompt for Per-Machine MSI Packages for Non-AdminsUsing Windows Installer with UAC

    本质上,Windows Installer(已以管理员身份运行并获得 UAC 批准)代表您运行安装,Windows Installer 和安装程序设置决定您是否需要查看 UAC提示与否。因此,这就是安装工作的原因。 Windows Installer 确定您不需要看到 UAC 提示,然后安装继续进行。

    卸载是不同的。由于您正在运行uninstall.exe,因此可执行文件需要管理员访问权限,Windows 将在uninstall.exe 甚至运行之前执行 UAC。

    【讨论】:

    • 好吧,为什么我列出的那个例子不起作用,这是有道理的。仍然让我感到困惑的是为什么安装有效。我是否通过复制 .exe 和 .bat 并在服务器上运行它们来解决这个问题?如果该解决方法适用于安装,为什么我无法使其适用于卸载?我尝试复制并运行一个卸载蝙蝠,它只是默默地运行卸载.exe,但它无法使用调用命令使其工作,只能在服务器本地运行。
    • 是的,安装程序工作但卸载不起作用似乎很奇怪,所以我做了一些研究,这是因为 Windows Installer。请参阅对上述帖子的修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多