在深入研究这个问题之前,我发现了其他几个与我的问题相似的问题,但它们无法解决我的问题。以下是它们的链接:
现在来谈谈这个问题:我需要通过 Powershell 在远程计算机上运行 Windows 更新脚本。如果我通过 mstsc 远程访问计算机,以管理员身份运行 Powershell 并运行 Windows 更新脚本,它就可以正常工作。如果我通过 mstsc 远程访问计算机,运行 Powershell 而不选择以管理员身份运行,然后运行脚本,我将收到一系列错误,如下所示:“使用“0”个参数调用“下载”时出现异常:“来自 HRESULT 的异常:0x80240044””
仅当我在没有管理员权限的情况下运行它时才会发生这种情况。
我正在运行的脚本是这样的:http://www.ehow.com/how_8724332_use-powershell-run-windows-updates.html
现在,当我使用 Enter-PSSession 远程访问计算机并尝试运行脚本时,我收到错误,但它们略有不同。它们大致如下:“使用“0”个参数调用“CreateUpdateDownloader”时出现异常:“访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))””
我愿意听取关于导致此问题的原因的建议,但我想我已经找到了答案。我认为 Powershell 会话需要以提升的权限运行。我知道如何通过 mstsc 进行远程操作,但我无法找到通过 Enter-PSSession 执行此操作的方法。我反复搜索,但一无所获。如果有人能帮助阐明这一点,我将不胜感激。
答案1
当您远程执行命令时,它们将以管理员权限运行,因为只有管理员才被允许在 powershell 中远程执行命令。错误“使用“0”个参数调用“CreateUpdateDownloader”时发生异常:“访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))”不是本机 powershell 错误,它表示此行失败:$UpdatesDownloader = $UpdateSession.CreateUpdateDownloader(),此行尝试使用 $UpdateSession = New-Object -ComObject Microsoft.Update.Session 对象创建 updatedownloader 对象。
由于不知道下载器试图连接到哪里,我只能假设是母舰,它可能表明您在远程连接到服务器时所拥有的凭据可能是代理的对象。这是一种常见的安全做法,远程连接到机器的用户无法直接从互联网下载项目(无论来源多么可信)。
希望这有帮助,克里斯
答案2
关于远程服务器上的 Windows 更新,我可以通过在远程服务器上设置 JEA 端点作为本地虚拟帐户运行来使其正常工作。
从https://docs.microsoft.com/en-us/powershell/scripting/learn/remoting/jea/session-configurations:
本地虚拟账户
如果此 JEA 端点支持的角色都用于管理本地计算机,并且本地管理员帐户足以成功运行命令,则应将 JEA 配置为使用本地虚拟帐户。虚拟帐户是特定用户独有的临时帐户,仅在其 PowerShell 会话期间有效。在成员服务器或工作站上,虚拟帐户属于本地计算机的管理员组,并有权访问大多数系统资源。在 Active Directory 域控制器上,虚拟帐户属于域的域管理员组。
快速修复¹:
(1.)在 ComputerB(远程服务器)上创建一个新的不受限制的(并且持久的!)会话配置:
New-PSSessionConfigurationFile -RunAsVirtualAccount -Path .\VirtualAccount.pssc
# Note this will restart the WinRM service:
Register-PSSessionConfiguration -Name 'VirtualAccount' [-ShowSecurityDescriptorUI] -Path .\VirtualAccount.pssc -Force
# Check the Permission property:
Get-PSSessionConfiguration -Name 'VirtualAccount'
# Those users will have full unrestricted access to the system!
(2.)从 ComputerA(本地客户端)连接到 ComputerB 上不受限制的会话配置:
New-PSSession -ComputerName 'ComputerB' -ConfigurationName 'VirtualAccount' | Enter-PSSession
[ComputerB]: new-object -com "Microsoft.Update.Downloader" # Yay!
答案3
要运行远程 powershell 命令,您必须在启动命令的计算机上以管理员身份运行,至少在开箱即用的配置中是这样。这是 PowerShell 远程处理的记录限制,尽管如果您下定决心,可以放宽默认值,但这将涉及对 PowerShell 配置进行更改。
对于远程执行,您是否使用 -credentials 参数传递凭据?例如
Enter-PSSession -Credential(Get-Credential) -ComputerName <remotehost>
答案4
可靠的解决方法是在目标服务器上创建一个计划任务,该计划任务将使用如下参数运行 powershell.exe:
-ExecutionPolicy ByPass -Command "c:\scripts\myscript.ps1" param1 param2
如果您不需要脚本来访问网络,请将任务设置为“以最高权限运行”并以 SYSTEM 权限运行。如果是,您可能需要使用一些特殊的服务帐户。然后在多个主机上远程运行该任务,例如
foreach($srv in $servers){
$res=schtasks /s $srv /tn "taskname" /run 2>&1
if($res -like "*SUCCESS*"){
write-host "task started" -ForegroundColor cyan
}
}
您可以创建一次计划任务,然后将其导出为 XML 文件,并使用如下命令将其批量部署到许多服务器
schtasks /s $hostname /create /tn mytaskname /ru system /f /xml c:\temp\mytask-schtask.xml