PowerShell SendKeys 发送击键 - 但仅限于某些计算机

PowerShell SendKeys 发送击键 - 但仅限于某些计算机

我遇到了以下问题:

我想卸载并重新安装一些软件(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
}

相关内容