我有一个脚本,该脚本将带有一些参数的.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)中,这可能会使语法有所不同,但是我尝试了很多事情,除了开一个帐户并在此处发布之外,我一无所有。
答案 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-Admins或Using Windows Installer with UAC。
本质上,Windows Installer(已以管理员身份运行且已获得UAC批准)是代表您运行安装的程序,并且是 Windows Installer 和安装程序设置来确定是否需要查看UAC。是否提示。因此,这就是安装有效的原因。 Windows Installer确定您不需要看到UAC提示符,安装将继续。
卸载是不同的。由于您正在运行uninstall.exe
,因此可执行文件需要管理员访问权限,Windows甚至可以在uninstall.exe
运行之前在 上执行UAC。