我在远程 Windows 更新脚本方面遇到问题。 我的目标:从 PowerShell 更新所有 Windows 服务器,无需使用 WSUS 或 SCCM,无需登录所有服务器并启动更新过程。
对于我的脚本,我使用 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 服务器并批量以提升的权限运行它不是问题,但这是唯一的方法吗?
我将进行批量解决方案,看看我能实现什么,但是我面临的问题还有其他解决方案吗? 有人试过吗?
非常感谢您的宝贵时间! 我也欢迎对我的代码或修复发表任何评论!
如果管理员正确,提升的提示是您的问题,以下内容可能会帮助您。
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
将执行策略设置回限制或您设置的值。
我在尝试使用
Invoke-Command
在远程计算机上导入模块时遇到了这个问题。有一个安全功能不允许您这样做。您可以尝试运行以下命令来查看导入新模块是否更成功。
$myPsSession = New-PSSession -ComputerName $HostName
Import-Module -Name PSWindowsUpdate -PSSession $myPsSession
我选择了任务调度程序解决方案,因为它看起来更容易。
我创建了一个名为 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
如果有人想要完整的脚本,我可以提供。 至于 Nixphhoe 和 Backin 的答案,我会检查它们,稍后我会回来评论它们。
非常感谢您的宝贵时间。
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/