Powershell /批处理卸载脚本在本地有效,但在使用invoke-command时无效

时间:2019-04-10 13:12:05

标签: powershell batch-file cmd

我有一个脚本,该脚本将带有一些参数的.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}

}

install .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"

但是在服务器上以admin身份运行的powershell中运行上述命令,效果很好。

我还尝试了相同的方法来创建,复制和运行批处理文件,与上面的“安装”代码非常相似。同样的事情...什么也不会发生,但是如果您在服务器上本地运行批处理,它就可以正常工作。如果有人感兴趣,我可以发布此代码。

我猜想它与 invoke-command 有关,或者它位于C:\ Program Files(x86)中,这可能会使语法有所不同,但是我尝试了很多事情,除了开一个帐户并在此处发布之外,我一无所有。

1 个答案:

答案 0 :(得分:0)

问题是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。