我遇到了以下问题:
我想卸载并重新安装一些软件(Symantec EPP),因为自动更新不起作用。
我们公司大约有 500 个客户,所以我认为编写自动化脚本会更容易。
不幸的是,静默卸载不起作用,所以我必须使用 SendKeys 方法。
我编写了该脚本,它确实可以运行,但只在某些客户端上运行。例如,如果我在我的计算机上运行该脚本,它会将虚拟按键发送给程序,如果我尝试在另一个客户端上运行它,它实际上会发送按键(使用记事本测试),但不会发送给程序...
是的,窗口位于前景中。
我的猜测是注册表中可能存在问题 - 可能不“允许”将击键发送到特定窗口,但它在记事本中也不应该起作用,对吗?
有人知道为什么它有时有效,有时无效吗?
答案1
使用 UAC 时,安装程序通常会运行升高,这不仅意味着更高的权限,还意味着更高的“完整性级别”,以便较低权限的进程无法篡改它们。(例如,非特权进程无法将命令注入提升的 PowerShell 窗口。换句话说,“无法写入”。)
因此,为了控制安装程序,PowerShell 脚本本身必须以提升的权限运行。
答案2
只需以管理员身份运行(根据用户1686的建议)。
我在这里找到了以下几行代码:如何以管理员身份运行 powershell 脚本
我将该代码复制到我的脚本中并且它立即就可以正常工作了!
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}