使用PowerShell远程安装Windows更新,(某些PowerCLI)

wyyhbhjk  于 2022-11-26  发布在  Windows
关注(0)|答案(4)|浏览(155)

我有一个远程windows更新脚本的问题。我的目标:在不使用WSUS或SCCM的情况下,从PowerShell更新所有Windows服务器,而不必登录到所有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服务器并以提升权限批处理运行它不是问题,但这是唯一的方法吗?
我会做批量解决方案,看看我可以实现什么,但有没有其他的解决方案,在我面临的问题?有人尝试过吗?
非常感谢你的时间!我也开放的任何意见,我的代码或修复!

bttbmeg0

bttbmeg01#

如果您的问题是管理员权限、提升的提示,以下内容可能会对您有所帮助。
检查是否以管理员身份运行的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
}

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

下面是一个简单得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将执行策略重新设置为restricted或您已设置的值。

oxcyiej7

oxcyiej72#

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

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

m1m5dgzv3#

我选择了任务调度解决方案,因为它看起来更容易。
我创建了名为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."

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

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

如果有人想要完整的脚本,我可以提供它。作为Nixphoe和Backin的答案,我会检查他们,我会回来后评论他们。
非常感谢您抽出时间。

nkoocmlb

nkoocmlb4#

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/

相关问题