WSUS 和 Microsoft 更新目录

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012

Microsoft 更新目录是一项提供一系列可通过公司网络分发的更新的服务。 可以使用该目录查找有关 Microsoft 软件更新、驱动程序和修补程序的信息。 WSUS 当前包含从 Microsoft 更新目录导入更新的选项。 但是,WSUS 中的导入更新操作是使用 ActiveX 生成的,现已弃用。 WSUS 中的此导入功能已替换为 PowerShell 脚本。 该脚本允许将单个更新或多个更新导入 WSUS。 本文提供有关目录、导入脚本以及如何使用脚本的信息。

将更新导入 WSUS 的先决条件

使用 PowerShell 脚本将更新导入 WSUS 需要满足以下先决条件:

  • 任何安装了 WSUS 管理控制台的计算机(无论是否为 WSUS 服务器)都可用于导入更新。
    • 从 WSUS 服务器导入时,使用“WSUS 管理员”组或“本地管理员”组的成员帐户。
    • 从远程计算机导入时,使用属于“WSUS 管理员”组并且对本地计算机具有管理权限的帐户。 远程计算机必须能够通过网络访问 WSUS 服务器。

Microsoft 更新目录

Microsoft 更新目录允许搜索各种更新字段和类别。 这些更新字段包括:

  • 更新标题
  • 说明
  • 适用的产品
  • 分类
  • 采用 KB1234567 格式的知识库文章编号

搜索硬件更新或驱动程序时,还可以搜索以下字段:

  • 驱动程序型号
  • 制造商
  • 四部分硬件 ID,例如 PCI\VEN_14E4&DEV_1677&SUBSYS_01AD1028

可以通过添加其他搜索词来缩小搜索范围。 要搜索特定字符串,请使用双引号。

注意

目录还允许使用下载按钮直接从站点下载更新。 但是,以这种方式下载的更新为 .MSU 格式。 WSUS 无法以 .MSU 格式导入更新。 Windows 更新独立安装程序DISM 或其他更新工具通常使用此文件类型。 某些工具要求先从 .MSU 中提取文件,然后才能使用。

使用 PowerShell 将更新导入 WSUS

使用以下说明将更新导入 WSUS:

  1. 从本文复制将更新导入 WSUS 的 PowerShell 脚本,并将其粘贴到文本编辑器,另存为 ImportUpdateToWSUS.ps1。 使用你可以轻松访问的位置,例如 C:\temp

  2. 在浏览器中打开 Microsoft 更新目录 https://catalog.update.microsoft.com

  3. 搜索要导入到 WSUS 中的更新。

  4. 从返回的列表中,选择要导入到 WSUS 中的更新。 此时会打开更新详细信息页。

  5. 使用更新详细信息页上的“复制”按钮复制 UpdateID

  6. 该脚本可用于导入单个更新或多个更新。

    • 要将多个更新导入 WSUS,请将要导入的每个更新的 update ID 粘贴到文本文件中。 完成后,每行列出一个更新 ID,然后保存文本文件。 使用你可以轻松访问的位置,例如 C:\temp\UpdateIDs.txt
    • 要导入单个更新,只需复制单个 updateID。
  7. 要导入更新,请以管理员身份打开 PowerShell 控制台,并使用任何所需的参数通过以下语法运行脚本:

    C:\temp\ImportUpdateToWSUS.ps1 [-WsusServer] <String> [-PortNumber] <Int32> [-UseSsl] [-UpdateId] <String> [-UpdateIdFilePath] <string> [<CommonParameters>]
    

    示例 1:登录到使用默认端口的 WSUS 服务器时,使用以下语法导入单个更新:

    .\ImportUpdateToWSUS.ps1 -UpdateId 12345678-90ab-cdef-1234-567890abcdef
    

    示例 2:使用远程计算机时,使用以下语法将多个更新导入 WSUS 服务器:

    .\ImportUpdateToWSUS.ps1 -WsusServer WSUSServer.contoso.com -PortNumber 8531 -UseSsl -UpdateIdFilePath C:\temp\UpdateIDs.txt
    
  8. 导入的更新的更新文件会根据你的更新文件设置进行下载。 例如,如果使用仅在批准更新时将更新文件下载到此服务器选项,则更新文件将在批准更新时下载。 有关存储更新的选项的详细信息,请参阅 1.3 选择 WSUS 存储策略

将更新导入 WSUS 的 PowerShell 脚本

<#
.SYNOPSIS
Powershell script to import an update, or multiple updates into WSUS based on the UpdateID from the catalog.

.DESCRIPTION
This script takes user input and attempts to connect to the WSUS server.
Then it tries to import the update using the provided UpdateID from the catalog.

.INPUTS
The script takes WSUS server Name/IP, WSUS server port, SSL configuration option and UpdateID as input. UpdateID can be viewed and copied from the update details page for any update in the catalog, https://catalog.update.microsoft.com. 

.OUTPUTS
Writes logging information to standard output.

.EXAMPLE
# Use with remote server IP, port and SSL
.\ImportUpdateToWSUS.ps1 -WsusServer 127.0.0.1 -PortNumber 8531 -UseSsl -UpdateId 12345678-90ab-cdef-1234-567890abcdef

.EXAMPLE
# Use with remote server Name, port and SSL
.\ImportUpdateToWSUS.ps1 -WsusServer WSUSServer1.us.contoso.com -PortNumber 8531 -UseSsl -UpdateId 12345678-90ab-cdef-1234-567890abcdef

.EXAMPLE
# Use with remote server IP, defaultport and no SSL
.\ImportUpdateToWSUS.ps1 -WsusServer 127.0.0.1  -UpdateId 12345678-90ab-cdef-1234-567890abcdef

.EXAMPLE
# Use with localhost default port
.\ImportUpdateToWSUS.ps1 -UpdateId 12345678-90ab-cdef-1234-567890abcdef

.EXAMPLE
# Use with localhost default port, file with updateID's
.\ImportUpdateToWSUS.ps1 -UpdateIdFilePath .\file.txt


.NOTES  
# On error, try enabling TLS: https://learn.microsoft.com/mem/configmgr/core/plan-design/security/enable-tls-1-2-client

# Sample registry add for the WSUS server from command line. Restarts the WSUSService and IIS after adding:
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 /V SchUseStrongCrypto /T REG_DWORD /D 1

## Sample registry add for the WSUS server from PowerShell. Restarts WSUSService and IIS after adding:
$registryPath = "HKLM:\Software\Microsoft\.NETFramework\v4.0.30319"
$Name = "SchUseStrongCrypto"
$value = "1" 
if (!(Test-Path $registryPath)) {
    New-Item -Path $registryPath -Force | Out-Null
}
New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force | Out-Null
Restart-Service WsusService, w3svc

# Update import logs/errors are under %ProgramFiles%\Update Services\LogFiles\SoftwareDistribution.log

#>

param(
    [Parameter(Mandatory = $false, HelpMessage = "Specifies the name of a WSUS server, if not specified connects to localhost")]
    # Specifies the name of a WSUS server, if not specified connects to localhost.
    [string]$WsusServer,

    [Parameter(Mandatory = $false, HelpMessage = "Specifies the port number to use to communicate with the upstream WSUS server, default is 8530")]
    # Specifies the port number to use to communicate with the upstream WSUS server, default is 8530.
    [ValidateSet("80", "443", "8530", "8531")]
    [int32]$PortNumber = 8530,

    [Parameter(Mandatory = $false, HelpMessage = "Specifies that the WSUS server should use Secure Sockets Layer (SSL) via HTTPS to communicate with an upstream server")]
    # Specifies that the WSUS server should use Secure Sockets Layer (SSL) via HTTPS to communicate with an upstream server.  
    [Switch]$UseSsl,

    [Parameter(Mandatory = $true, HelpMessage = "Specifies the update Id we should import to WSUS", ParameterSetName = "Single")]
    # Specifies the update Id we should import to WSUS
    [ValidateNotNullOrEmpty()]
    [String]$UpdateId,

    [Parameter(Mandatory = $true, HelpMessage = "Specifies path to a text file containing a list of update ID's on each line", ParameterSetName = "Multiple")]
    # Specifies path to a text file containing a list of update ID's on each line.
    [ValidateNotNullOrEmpty()]
    [String]$UpdateIdFilePath
)

Set-StrictMode -Version Latest

# set server options
$serverOptions = "Get-WsusServer"
if ($psBoundParameters.containsKey('WsusServer')) { $serverOptions += " -Name $WsusServer -PortNumber $PortNumber" }
if ($UseSsl) { $serverOptions += " -UseSsl" }

# empty updateID list
$updateList = @()

# get update id's
if ($UpdateIdFilePath) {
    if (Test-Path $UpdateIdFilePath) {
        foreach ($id in (Get-Content $UpdateIdFilePath)) {
            $updateList += $id.Trim()
        }
    }
    else {
        Write-Error "[$UpdateIdFilePath]: File not found"
		return
    }
}
else {
    $updateList = @($UpdateId)
}

# get WSUS server
Try {
    Write-Host "Attempting WSUS Connection using $serverOptions... " -NoNewline
    $server = invoke-expression $serverOptions
    Write-Host "Connection Successful"
}
Catch {
    Write-Error $_
    return
}

# empty file list
$FileList = @()

# call ImportUpdateFromCatalogSite on WSUS
foreach ($uid in $updateList) {
    Try {
        Write-Host "Attempting WSUS update import for Update ID: $uid... " -NoNewline
        $server.ImportUpdateFromCatalogSite($uid, $FileList)
        Write-Host "Import Successful"
    }
    Catch {
        Write-Error "Failed. $_"
    }
}

脚本参数

WsusServer:<string>
指定 WSUS 服务器的名称。 如果未指定,则脚本将连接到 localhost。

  • 必需:false
  • 默认值:localhost

PortNumber:<Int32>
指定要用于和上游 WSUS 服务器通信的端口号。

  • 必需:false
  • 默认值:8530
  • 允许的值:80、443、8530、8531

UseSsl:<switch>
指定是否应使用通过 HTTPS 的安全套接字层 (SSL) 与 WSUS 服务器通信。 如果此参数名称存在,则参数测试 $true 和连接使用 SSL 到达 WSUS 服务器,否则为 false。 使用 USeSSL 参数时,将 PortNumber 设置为 443 或 8531。

  • 必需:false

UpdateId:<string>
指定要导入到 WSUS 的更新 ID。 如果要导入单个更新,则需要此参数。 UpdateId 不能与 UpdateIdFilePath 一起使用。

  • Required:true,导入指定为脚本参数的单个 updateID 时

UpdateIdFilePath:<string>
指定包含每行的更新 ID 列表的文本文件的路径。 如果要导入多个更新,则需要此参数。 UpdateIdFilePath 不能与 UpdateId 一起使用。

  • Required:true,使用文本文件导入多个更新时

CommonParameters
Verbose、Debug、ErrorAction、ErrorVariable、WarningAction、WarningVariable、OutBuffer、PipelineVariable、OutVariable。 有关详细信息,请参阅关于 CommonParameters

限制对修补程序的访问

WSUS 管理员可能会考虑限制对从 Microsoft 更新目录下载的修补程序的访问。 要限制可用的修补程序,请完成以下步骤:

  1. 启动“Internet Information Services (IIS) 管理器”控制台。
  2. 导航到“WSUS 管理”网站下的“内容”节点。
  3. 在“内容主页”窗格中,双击“身份验证”选项。
  4. 选择“匿名身份验证”,然后在右侧的“操作”窗格中选择“禁用”。
  5. 选择“Windows 身份验证”,然后在右侧的“操作”窗格中选择“启用”。
  6. 在 WSUS 管理控制台中,为需要修补程序的计算机创建 WSUS 目标组,并将其添加到该组。 有关计算机和组的详细信息,请参阅本指南中的管理 WSUS 客户端计算机和 WSUS 计算机组,以及 WSUS 部署指南中的配置 WSUS 计算机组
  7. 下载修补程序文件。
  8. 设置这些文件的权限,以便只有这些计算机的计算机帐户才能读取这些文件。 还需要允许网络服务帐户对这些文件的完全访问权限。
  9. 批准步骤 2 中创建的 WSUS 目标组的修补程序。

注意

可以通过运行 WSUS 服务器清理向导,删除从 Microsoft 更新目录中导入的设置为“未批准”或“已拒绝”的更新。 可以重新导入以前从 WSUS 系统中移除的更新。

导入不同语言的更新

该目录包含支持多种语言的更新。

重要

将 WSUS 服务器支持的语言与导入的更新支持的语言相匹配。

如果 WSUS 服务器不支持更新中包含的所有语言,则不会将更新部署到客户端计算机。 如果支持多种语言的更新已下载到 WSUS 服务器,但尚未部署到客户端计算机,并且管理员取消选择更新中包含的其中一种语言,则不会将更新部署到客户端。