【问题标题】:Installing windows updates remotely, using PowerShell. (some PowerCLI)使用 PowerShell 远程安装 Windows 更新。 (一些 PowerCLI)
【发布时间】:2019-03-19 14:54:46
【问题描述】:

我的远程 Windows 更新脚本有问题。 我的目标:在不使用 WSUS 或 SCCM 的情况下,从 PowerShell 更新所有 Windows 服务器,而无需登录所有服务器并启动更新过程。

对于我的脚本,我使用的是 powercli 和 PSWindowsUpdate 模块。 出于测试目的,我在 $hostname 变量中使用单个主机。

这就是我所拥有的。

$Cred = Get-Credential
Import-Module PSWindowsUpdate
Invoke-Command -ComputerName $HostName {Import-Module PSWindowsUpdate} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName {Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName -ScriptBlock {Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Out-File C:\Setup\PSWindowsUpdate.log } -credential $cred
Get-Content \\$HostName\c$\Setup\PSWindowsUpdate.log

运行脚本后,从关机、快照、开机开始一切正常,但我无法安装任何更新。 我收到以下错误:

WARNING: To perform some operations you must run an elevated Windows PowerShell console.
WARNING: Can't access to machine "hostName". Try use: winrm qc

当我搜索时,我发现我无法在 PowerShell 本身中进行任何提升,我正在阅读一些关于运行 CMD bat 以提升权限启动 PowerShell 的帖子。 将更新脚本复制到每个 Windows 服务器并以提升的权限批量运行它对我来说不是问题,但这是唯一的方法吗?

我会做批处理解决方案,看看我能实现什么,但我面临的问题还有其他解决方案吗? 有人试过吗?

非常感谢您的宝贵时间! 我也愿意对我的代码或修复发表任何评论!

【问题讨论】:

  • 您只需要包含 minimal reproducible example... 的代码...只有代码的最后 6 行与您的问题相关。由于其余部分工作正常,因此无需包含它,像您这样拥有大量代码只会让人们看不到它。
  • 感谢您的评论@JamesC。我只是用给我错误的部分编辑了代码。如果有人想查看完整的脚本,我只想提供我对脚本所做的事情。
  • 现在使用批处理文件,我必须按接受 UAC 以提升权限运行 powershell,但我不希望这样。有没有办法绕过该 UAC 而无需从操作系统禁用它?我正在阅读有关计划任务的信息,并且我知道我可以做到这一点,因为我的许多生成报告的脚本都是这样运行的。调度器是唯一的解决方案吗?

标签: windows powershell powercli windows-update


【解决方案1】:

如果管理员正确,提升的提示是您的问题,以下内容可能会对您有所帮助。

PS 代码检查是否以管理员身份运行。如果没有,它将以管理员身份重新启动。

If (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    $Arguments = "& '" + $MyInvocation.MyCommand.Definition + "'"
    Start-Process Powershell -Verb RunAs -ArgumentList $Arguments
    Break
}

您可能还需要在注册表中修改ConsentPromptBehaviorAdmin HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\

-

这是一个简单的 BAT 文件,它将绕过 PS 执行策略,然后启动 PS 脚本(假设它们的名称相同)。

REG ADD "HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /T REG_SZ /V ExecutionPolicy /D Unrestricted /F

Start PowerShell.exe -Command "& '%~dpn0.ps1'"

添加 PS 脚本的末尾,您可以使用 Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope LocalMachine -Force 将执行策略设置回受限或您设置的内容。

【讨论】:

    【解决方案2】:

    我在尝试使用 Invoke-Command 在远程机器上导入模块时遇到了这个问题。有一个安全功能不允许您这样做。您可以尝试运行以下命令,看看您是否更成功地导入了新模块。

    $myPsSession = New-PSSession -ComputerName $HostName
    Import-Module -Name PSWindowsUpdate -PSSession $myPsSession
    

    【讨论】:

    • 嗨 Nixphoe,您的回答没有给我解决方案,因为我需要在“管理员模式”下运行 PowerShell 会话。我添加了两个脚本,一个取消注册任何以前具有相同名称的计划任务,并创建一个新的脚本,该脚本将以系统用户身份以提升的权限运行实际脚本。该解决方案对我来说很好。谢谢你的贡献!
    【解决方案3】:

    我选择了任务调度解决方案,因为它看起来更容易。

    我创建了一个名为 WUpdates.ps1 的脚本

    $Timestamp=((Get-Date).ToString('dd_MM_yyyy_HH_mm'))
    Import-Module PSWindowsUpdate -Verbose
    Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false -Verbose
    Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Format-Table -AutoSize | Out-File C:\Setup\WUpdates\PSWindowsUpdate_$Timestamp.log
    

    以及用于创建名为 WinUpdateScheduler.ps1 的计划任务的脚本

    Unregister-ScheduledTask -TaskName "WindowsUpdates" -Confirm:$False    
    $Action = New-ScheduledTaskAction -Execute C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Argument '-f "C:\Setup\WUpdates\WUpdates.ps1"'
    $Trigger =  New-ScheduledTaskTrigger -Once -At (get-date).AddSeconds(30)
    Register-ScheduledTask -Action $Action -Trigger $Trigger -RunLevel Highest -User system -TaskName "WindowsUpdates" -Description "Running Windows updates."
    

    然后在主脚本中调用调度脚本并安装我的更新。

    Invoke-Command -ComputerName $HostName { c:\setup\WUpdates\WinUpdateScheduler.ps1 } -Credential $Cred
    

    如果有人想要完整的脚本,我可以提供。 至于 Nixphoe 和 Backin 的答案,我会检查它们,稍后我会回来评论它们。

    非常感谢您的宝贵时间。

    【讨论】:

      【解决方案4】:
      Invoke-WUInstall -ComputerName Test-1 -Script { ipmo PSWindowsUpdate; Get-WUInstall -AcceptAll | Out-File C:\PSWindowsUpdate.log } 
      -Confirm:$false –Verbose
      

      https://4sysops.com/archives/install-windows-updates-remotely-with-the-powershell/

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
      猜你喜欢
      • 1970-01-01
      • 2016-03-16
      • 2015-12-08
      • 1970-01-01
      • 2020-01-12
      • 2015-07-06
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多