我正在尝试使用PowerShell远程处理在远程计算机上安装Windows安全修补程序。这是我用来更新Windows的函数
<#
.SYNOPSIS
This functiion will automatically install all avaialable windows updates on a device and will automatically reboot if needed, after reboot, windows updates will continue to run until no more updates are available.
#>
function Install-WindowsUpdates
{
Install-Module -Name PSWindowsUpdate -RequiredVersion 2.1.0.1 -Force
Import-Module PSWindowsUpdate -Force
Get-WindowsUpdate -install -acceptall
}
当我在本地主机上运行此函数时,该函数成功安装了Windows安全补丁。我有下面的脚本来远程执行相同的操作:
param(
[Parameter(Mandatory = $true)]
[string] $IPaddress
)
try
{
$secpasswd = ConvertTo-SecureString "Pass@12345678" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("Admin02", $secpasswd)
#Create a Session.
$Session = New-PSSession -ComputerName $IPaddress -Credential $cred
cd C:\Users\Admin01\Documents
. .\Install-WindowsUpdates.ps1
Invoke-Command -Session $Session -ScriptBlock ${function:Install-WindowsUpdates}
return $true
}
catch
{
return $false
}
当我运行这个脚本时,我得到以下错误:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
+ CategoryInfo : NotSpecified: (:) [Get-WindowsUpdate], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,PSWindowsUpdate.GetWindowsUpdate
+ PSComputerName : 10.0.0.7
我已经设置了loaclhost和远程机器远程和能够远程执行其他脚本。也启用了远程机器上的WMI。还有什么其他的设置我必须做?
**使用定时任务:**我使用以下脚本启动定时任务:
param(
[parameter(Mandatory = $true)]
[string]$IPaddress
)
$PSModulePath = $env:PSModulePath
$SplittedModulePath = $PSModulePath.Split(";")
$ModulePath = $SplittedModulePath[0]
$secpasswd = ConvertTo-SecureString "Pass@12345678" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ("Admin02", $secpasswd)
#Create a Session. Replace host name with the host name of the remote machine.
$Session = New-PSSession -ComputerName $IPaddress -Credential $cred
$User= "Admin02"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "$env:ALLUSERSPROFILE\Install-WindowsUpdate.ps1"
$Trigger= New-ScheduledTaskTrigger -At 5:05am -Once
Invoke-Command -Session $Session -ScriptBlock { Register-ScheduledTask -TaskName "Install-Updates" -User $Using:User -Action $Using:Action -Trigger $Using:Trigger -RunLevel Highest –Force }
我已将以下脚本复制到目标计算机上的路径$env:ALLUSERSPROFILE
<#
.SYNOPSIS
This functiion will automatically install all avaialable windows updates on a device and will automatically reboot if needed, after reboot, windows updates will continue to run until no more updates are available.
.PARAMETER computer
Use the Computer parameter to specify the Computer to remotely install windows updates on.
#>
Install-Module -Name PSWindowsUpdate -RequiredVersion 2.1.0.1 -Force
Import-Module PSWindowsUpdate -Force
Get-WindowsUpdate -install -acceptall
在我安排任务后,什么也没发生。我做错了什么?
4条答案
按热度按时间mrwjdhj31#
是的,我打了几个星期,终于有一个很好的解决方案.该解决方案实际上是内置到PSWindowsUpdate模块.内置的解决方案确实使用Windows任务,但它立即启动,它实际上有助于跟踪其完成进度,它保持集成安全.我发现的问题是PSWindowsUpdate有穷人的文档.以下代码为我工作:
关于这个主题有很多零散的信息,所以请做你的阅读。PSWindowsUpdate是迄今为止最好的库为这项工作,虽然它是一个漫长的过程对我来说,我相信上述解决方案将为每个人工作。
请记住,您正在运行上述脚本的计算机需要信任您正在尝试更新的计算机,您可以运行此脚本来信任计算机:
注意:计算机名称中可以使用通配符
我还想给予你一些信息,这对我很有帮助:
获取WindowsUpdate:这是模块的主cmdlet。它列出、下载、安装或隐藏满足预定义要求的更新列表,并设置安装更新时的重新启动规则。
Remove-WindowsUpdate:卸载更新
添加WUServiceManage:注册新的Windows Update API服务管理器
Get-WUHistory:显示已安装更新的列表
获取WU设置:获取Windows Update客户端设置
获取WUInstallerStatus:获取Windows Update安装程序状态,无论它是否忙碌
启用WURemoting:为PSWindowsUpdate远程处理启用防火墙规则
Invoke-WUJob:远程调用PSWindowsUpdate操作
与所有PowerShell cmdlet一样,键入Get-Help“command”-examples可以为每个命令显示不同的用法示例。PSWindowsUpdate主参数
如上一节所示,PSWindowsUpdate模块包括不同的预定义别名,以简化修补过程。但是,下面将列出并解释Get-WindowsUpdate cmdlet的主要参数:
过滤更新:
全部接受:下载或安装所有可用的更新
KBArticleID:查找包含KBArticleID(或KBArticleID集)的更新
更新ID:指定具有特定UUID(或UUID集)的更新
类别:指定包含指定类别名称的更新,如“更新”、“安全更新”或“关键更新”
标题:查找与部分标题匹配的更新
严重程度:查找与部分严重性匹配的更新,如“重要”、“严重”或“中等”
更新类型:查找特定类型的更新,如“驱动程序”和“软件”。默认值包含所有更新
行动和目标:
下载:下载已批准的更新但不安装它们
安装:安装已批准的更新
隐藏:隐藏指定的更新,防止安装
计划任务:指定作业开始的日期
发送报告:发送安装过程中的报告
计算机名:指定目标服务器或计算机
客户端重启行为:
自动重启:如果需要,自动重新启动系统
忽略重启:禁止自动重新启动
ScheduleReboot:指定系统重新启动的日期。
如何避免意外安装#
Windows更新和修补程序可改进系统的功能和稳定性。但是,某些更新可能会扰乱系统并导致不稳定,特别是图形卡驱动程序等旧版软件的自动更新。要避免此类应用程序的自动更新和意外安装,您可以暂停Windows更新。
或者,您可以隐藏不希望更新的功能的特定更新。隐藏更新后,Windows将无法再下载和安装此类更新。在隐藏更新之前,您需要找出其详细信息,包括其知识库(KB)编号和标题。键入下面的cmdlet以列出系统上的所有可用更新:
Get-WUList
要使用知识库编号隐藏特定更新,请使用鼠标复制该知识库编号。接下来,键入以下命令:
Hide-WUUpdate -KBArticleID KB_Number
突出显示“KB_Number”,然后单击粘贴以将该部分替换为实际的KB编号。
当提示确认操作时,键入A,然后按Enter键。如果命令成功,“Get-WUList”将列出所有可用的更新,隐藏的更新将在其状态下显示符号“H”。
对于某些更新,更新的知识库编号可能不可用。在这种情况下,您可以使用标题隐藏更新。为此,请通过下面的cmdlet列出所有可用的更新:
Get-WUList
接下来,使用鼠标复制更新标题。确保它与其他更新标题不同。现在,在下面键入命令以隐藏更新:
Hide-WUUpdate -Title“Update_Title”
别忘了在“更新标题”部分粘贴实际的更新标题。
当提示确认操作时,键入A,然后按Enter键。如果命令成功,“Get-WUList”将列出所有可用的更新。但是,隐藏更新的状态会在其下方显示符号“H”。如何确定错误
为了能够修复错误的部署,拥有尽可能多的有关Windows Update安装过程的信息至关重要。Get-WindowsUpdate cmdlet和模块中可用的其余cmdlet在管理更新时提供了非常详细的日志级别,包括状态、KB ID、大小或标题。
集中所有计算机日志并分析它们以查找错误,管理员将始终能够知道其Windows计算机和服务器的补丁级别。
以上文章来自this site!
fnatzsnv2#
这在设计上似乎是不可能的:
远程连接的用户不可能从互联网上下载它出现的东西。
g6ll5ycj3#
只是把我的帽子扔到这个看似容易修复(与PSWindowsUpdate)的问题:
我在尝试更新Remote-Windows-Machines时遇到了OP与
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
的问题。在初始机器上,我执行了
Enable-WURemoting
,它允许我在远程机器上下载和安装更新。编辑:你可能还需要在相应的远程机器上调用
Enable-WURemoting
。这可以通过简单地调用Invoke-Command -ComputerName <server> -ScriptBlock{Enable-WURemoting}
从启动机器端完成。7vhp5slm4#
说到Windows Update,您有许多选项,例如:
1.使用psexec工具连接,然后运行wuauclt /detectnow /updatenow
1.如果您使用的是Windows 10 /Server 2016,则该工具已替换为USOClient.exe,这更有效。