4565 lines
151 KiB
Go
4565 lines
151 KiB
Go
package scanner
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"golang.org/x/exp/maps"
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/future-architect/vuls/config"
|
|
"github.com/future-architect/vuls/constant"
|
|
"github.com/future-architect/vuls/logging"
|
|
"github.com/future-architect/vuls/models"
|
|
)
|
|
|
|
// inherit OsTypeInterface
|
|
type windows struct {
|
|
base
|
|
}
|
|
|
|
type osInfo struct {
|
|
productName string
|
|
version string
|
|
build string
|
|
revision string
|
|
edition string
|
|
servicePack string
|
|
arch string
|
|
installationType string
|
|
}
|
|
|
|
func newWindows(c config.ServerInfo) *windows {
|
|
d := &windows{
|
|
base: base{
|
|
osPackages: osPackages{
|
|
Packages: models.Packages{},
|
|
VulnInfos: models.VulnInfos{},
|
|
},
|
|
},
|
|
}
|
|
d.log = logging.NewNormalLogger()
|
|
d.setServerInfo(c)
|
|
return d
|
|
}
|
|
|
|
func detectWindows(c config.ServerInfo) (bool, osTypeInterface) {
|
|
tmp := c
|
|
tmp.Distro.Family = constant.Windows
|
|
|
|
if isLocalExec(c.Port, c.Host) {
|
|
if r, r2 := exec(tmp, `$CurrentVersion = (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion"); Format-List -InputObject $CurrentVersion -Property ProductName, CurrentVersion, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR, CSDVersion, EditionID, InstallationType`, noSudo), exec(tmp, `(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment").PROCESSOR_ARCHITECTURE`, noSudo); (r.isSuccess() && r.Stdout != "") && (r2.isSuccess() && r2.Stdout != "") {
|
|
w := newWindows(c)
|
|
osInfo, err := parseRegistry(r.Stdout, strings.TrimSpace(r2.Stdout))
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to parse Registry. err: %w", err)})
|
|
return true, w
|
|
}
|
|
|
|
w.log.Debugf("osInfo(Registry): %+v", osInfo)
|
|
release, err := detectOSName(osInfo)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to detect os name. err: %w", err)})
|
|
return true, w
|
|
}
|
|
w.setDistro(constant.Windows, release)
|
|
w.Kernel = models.Kernel{Version: formatKernelVersion(osInfo)}
|
|
return true, w
|
|
}
|
|
}
|
|
|
|
if r := exec(tmp, "Get-ComputerInfo -Property WindowsProductName, OsVersion, WindowsEditionId, OsCSDVersion, CsSystemType, WindowsInstallationType", noSudo); r.isSuccess() && r.Stdout != "" {
|
|
w := newWindows(c)
|
|
osInfo, err := parseGetComputerInfo(r.Stdout)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to parse Get-ComputerInfo. err: %w", err)})
|
|
return true, w
|
|
}
|
|
|
|
w.log.Debugf("osInfo(Get-ComputerInfo): %+v", osInfo)
|
|
release, err := detectOSName(osInfo)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to detect os name. err: %w", err)})
|
|
return true, w
|
|
}
|
|
w.setDistro(constant.Windows, release)
|
|
w.Kernel = models.Kernel{Version: formatKernelVersion(osInfo)}
|
|
return true, w
|
|
}
|
|
|
|
if r := exec(tmp, "$WmiOS = (Get-WmiObject Win32_OperatingSystem); Format-List -InputObject $WmiOS -Property Caption, Version, OperatingSystemSKU, CSDVersion; $WmiCS = (Get-WmiObject Win32_ComputerSystem); Format-List -InputObject $WmiCS -Property SystemType, DomainRole", noSudo); r.isSuccess() && r.Stdout != "" {
|
|
w := newWindows(c)
|
|
osInfo, err := parseWmiObject(r.Stdout)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to parse Get-WmiObject. err: %w", err)})
|
|
return true, w
|
|
}
|
|
|
|
w.log.Debugf("osInfo(Get-WmiObject): %+v", osInfo)
|
|
release, err := detectOSName(osInfo)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to detect os name. err: %w", err)})
|
|
return true, w
|
|
}
|
|
w.setDistro(constant.Windows, release)
|
|
w.Kernel = models.Kernel{Version: formatKernelVersion(osInfo)}
|
|
return true, w
|
|
}
|
|
|
|
if r := exec(tmp, "systeminfo.exe", noSudo); r.isSuccess() && r.Stdout != "" {
|
|
w := newWindows(c)
|
|
osInfo, _, err := parseSystemInfo(r.Stdout)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to parse systeminfo.exe. err: %w", err)})
|
|
return true, w
|
|
}
|
|
|
|
w.log.Debugf("osInfo(systeminfo.exe): %+v", osInfo)
|
|
release, err := detectOSName(osInfo)
|
|
if err != nil {
|
|
w.setErrs([]error{xerrors.Errorf("Failed to detect os name. err: %w", err)})
|
|
return true, w
|
|
}
|
|
w.setDistro(constant.Windows, release)
|
|
w.Kernel = models.Kernel{Version: formatKernelVersion(osInfo)}
|
|
return true, w
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|
|
func parseSystemInfo(stdout string) (osInfo, []string, error) {
|
|
var (
|
|
o osInfo
|
|
kbs []string
|
|
)
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
switch {
|
|
case strings.HasPrefix(line, "OS 名:"):
|
|
line = strings.NewReplacer("OS 名:", "OS Name:").Replace(line)
|
|
case strings.HasPrefix(line, "OS バージョン:"):
|
|
line = strings.NewReplacer("OS バージョン:", "OS Version:", "ビルド", "Build").Replace(line)
|
|
case strings.HasPrefix(line, "システムの種類:"):
|
|
line = strings.NewReplacer("システムの種類:", "System Type:").Replace(line)
|
|
case strings.HasPrefix(line, "OS 構成:"):
|
|
line = strings.NewReplacer("OS 構成:", "OS Configuration:", "サーバー", "Server", "ワークステーション", "Workstation").Replace(line)
|
|
case strings.HasPrefix(line, "ホットフィックス:"):
|
|
line = strings.NewReplacer("ホットフィックス:", "Hotfix(s):", "ホットフィックスがインストールされています。", "Hotfix(s) Installed.").Replace(line)
|
|
default:
|
|
}
|
|
|
|
switch {
|
|
case strings.HasPrefix(line, "OS Name:"):
|
|
o.productName = strings.TrimSpace(strings.TrimPrefix(line, "OS Name:"))
|
|
case strings.HasPrefix(line, "OS Version:"):
|
|
s := strings.TrimSpace(strings.TrimPrefix(line, "OS Version:"))
|
|
lhs, build, _ := strings.Cut(s, " Build ")
|
|
vb, sp, _ := strings.Cut(lhs, " ")
|
|
o.version = strings.TrimSuffix(vb, fmt.Sprintf(".%s", build))
|
|
o.build = build
|
|
if sp != "N/A" {
|
|
o.servicePack = sp
|
|
}
|
|
case strings.HasPrefix(line, "System Type:"):
|
|
o.arch = strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(line, "System Type:"), "PC"))
|
|
case strings.HasPrefix(line, "OS Configuration:"):
|
|
switch {
|
|
case strings.Contains(line, "Server"):
|
|
o.installationType = "Server"
|
|
case strings.Contains(line, "Workstation"):
|
|
o.installationType = "Client"
|
|
case strings.Contains(line, "Domain Controller"):
|
|
o.installationType = "Domain Controller"
|
|
default:
|
|
return osInfo{}, nil, xerrors.Errorf("Failed to detect installation type. line: %s", line)
|
|
}
|
|
case strings.HasPrefix(line, "Hotfix(s):"):
|
|
nKB, err := strconv.Atoi(strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(line, "Hotfix(s):"), "Hotfix(s) Installed.")))
|
|
if err != nil {
|
|
return osInfo{}, nil, xerrors.Errorf("Failed to detect number of installed hotfix from %s", line)
|
|
}
|
|
for i := 0; i < nKB; i++ {
|
|
scanner.Scan()
|
|
line := scanner.Text()
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
continue
|
|
}
|
|
s := strings.TrimSpace(rhs)
|
|
if strings.HasPrefix(s, "KB") {
|
|
kbs = append(kbs, strings.TrimPrefix(s, "KB"))
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
return o, kbs, nil
|
|
}
|
|
|
|
func parseGetComputerInfo(stdout string) (osInfo, error) {
|
|
var o osInfo
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
switch {
|
|
case strings.HasPrefix(line, "WindowsProductName"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect ProductName. expected: "WindowsProductName : <ProductName>", line: "%s"`, line)
|
|
}
|
|
o.productName = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "OsVersion"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect OsVersion. expected: "OsVersion : <Version>", line: "%s"`, line)
|
|
}
|
|
ss := strings.Split(strings.TrimSpace(rhs), ".")
|
|
o.version = strings.Join(ss[0:len(ss)-1], ".")
|
|
o.build = ss[len(ss)-1]
|
|
case strings.HasPrefix(line, "WindowsEditionId"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect WindowsEditionId. expected: "WindowsEditionId : <EditionId>", line: "%s"`, line)
|
|
}
|
|
o.edition = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "OsCSDVersion"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect OsCSDVersion. expected: "OsCSDVersion : <CSDVersion>", line: "%s"`, line)
|
|
}
|
|
o.servicePack = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CsSystemType"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CsSystemType. expected: "CsSystemType : <SystemType>", line: "%s"`, line)
|
|
}
|
|
o.arch = strings.TrimSpace(strings.TrimSuffix(rhs, "PC"))
|
|
case strings.HasPrefix(line, "WindowsInstallationType"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect WindowsInstallationType. expected: "WindowsInstallationType : <InstallationType>", line: "%s"`, line)
|
|
}
|
|
o.installationType = strings.TrimSpace(rhs)
|
|
default:
|
|
}
|
|
}
|
|
return o, nil
|
|
}
|
|
|
|
func parseWmiObject(stdout string) (osInfo, error) {
|
|
var o osInfo
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
switch {
|
|
case strings.HasPrefix(line, "Caption"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect Caption. expected: "Caption : <Caption>", line: "%s"`, line)
|
|
}
|
|
o.productName = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "Version"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect Version. expected: "Version : <Version>", line: "%s"`, line)
|
|
}
|
|
ss := strings.Split(strings.TrimSpace(rhs), ".")
|
|
o.version = strings.Join(ss[0:len(ss)-1], ".")
|
|
o.build = ss[len(ss)-1]
|
|
case strings.HasPrefix(line, "OperatingSystemSKU"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect OperatingSystemSKU. expected: "OperatingSystemSKU : <OperatingSystemSKU>", line: "%s"`, line)
|
|
}
|
|
switch n := strings.TrimSpace(rhs); n {
|
|
case "0":
|
|
o.edition = "Undefined"
|
|
case "1":
|
|
o.edition = "Ultimate"
|
|
o.installationType = "Client"
|
|
case "2":
|
|
o.edition = "Home Basic"
|
|
o.installationType = "Client"
|
|
case "3":
|
|
o.edition = "Home Premium"
|
|
o.installationType = "Client"
|
|
case "4":
|
|
o.edition = "Enterprise"
|
|
o.installationType = "Client"
|
|
case "6":
|
|
o.edition = "Business"
|
|
o.installationType = "Client"
|
|
case "7":
|
|
o.edition = "Windows Server Standard Edition (Desktop Experience installation)"
|
|
o.installationType = "Server"
|
|
case "8":
|
|
o.edition = "Windows Server Datacenter Edition (Desktop Experience installation)"
|
|
o.installationType = "Server"
|
|
case "9":
|
|
o.edition = "Small Business Server"
|
|
o.installationType = "Server"
|
|
case "10":
|
|
o.edition = "Enterprise Server"
|
|
o.installationType = "Server"
|
|
case "11":
|
|
o.edition = "Starter"
|
|
case "12":
|
|
o.edition = "Datacenter Server Core"
|
|
o.installationType = "Server Core"
|
|
case "13":
|
|
o.edition = "Standard Server Core"
|
|
o.installationType = "Server Core"
|
|
case "14":
|
|
o.edition = "Enterprise Server Core"
|
|
o.installationType = "Server Core"
|
|
case "17":
|
|
o.edition = "Web Server"
|
|
o.installationType = "Server"
|
|
case "19":
|
|
o.edition = "Home Server"
|
|
o.installationType = "Server"
|
|
case "20":
|
|
o.edition = "Storage Express Server"
|
|
o.installationType = "Server"
|
|
case "21":
|
|
o.edition = "Windows Storage Server Standard"
|
|
o.installationType = "Server"
|
|
case "22":
|
|
o.edition = "Windows Storage Server Workgroup"
|
|
o.installationType = "Server"
|
|
case "23":
|
|
o.edition = "Storage Enterprise Server"
|
|
o.installationType = "Server"
|
|
case "24":
|
|
o.edition = "Server For Small Business"
|
|
o.installationType = "Server"
|
|
case "25":
|
|
o.edition = "Small Business Server Premium"
|
|
o.installationType = "Server"
|
|
case "27":
|
|
o.edition = "Enterprise"
|
|
o.installationType = "Client"
|
|
case "28":
|
|
o.edition = "Ultimate"
|
|
o.installationType = "Client"
|
|
case "29":
|
|
o.edition = "Windows Server Web Server Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "36":
|
|
o.edition = "Windows Server Standard Edition without Hyper-V"
|
|
o.installationType = "Server"
|
|
case "37":
|
|
o.edition = "Windows Server Datacenter Edition without Hyper-V (full installation)"
|
|
o.installationType = "Server"
|
|
case "38":
|
|
o.edition = "Windows Server Enterprise Edition without Hyper-V (full installation)"
|
|
o.installationType = "Server"
|
|
case "39":
|
|
o.edition = "Windows Server Datacenter Edition without Hyper-V (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "40":
|
|
o.edition = "Windows Server Standard Edition without Hyper-V (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "41":
|
|
o.edition = "Windows Server Enterprise Edition without Hyper-V (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "42":
|
|
o.edition = "Microsoft Hyper-V Server"
|
|
o.installationType = "Server"
|
|
case "43":
|
|
o.edition = "Storage Server Express Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "44":
|
|
o.edition = "Storage Server Standard Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "45":
|
|
o.edition = "Storage Server Workgroup Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "46":
|
|
o.edition = "Storage Server Enterprise Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "48":
|
|
o.edition = "Professional"
|
|
o.installationType = "Client"
|
|
case "50":
|
|
o.edition = "Windows Server Essentials (Desktop Experience installation)"
|
|
o.installationType = "Server"
|
|
case "63":
|
|
o.edition = "Small Business Server Premium (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "64":
|
|
o.edition = "Windows Compute Cluster Server without Hyper-V"
|
|
o.installationType = "Server"
|
|
case "97":
|
|
o.edition = "Windows RT"
|
|
o.installationType = "Client"
|
|
case "101":
|
|
o.edition = "Home"
|
|
o.installationType = "Client"
|
|
case "103":
|
|
o.edition = "Media Center"
|
|
o.installationType = "Client"
|
|
case "104":
|
|
o.edition = "Mobile"
|
|
o.installationType = "Client"
|
|
case "123":
|
|
o.edition = "Windows IoT (Internet of Things) Core"
|
|
o.installationType = "Client"
|
|
case "143":
|
|
o.edition = "Windows Server Datacenter Edition (Nano Server installation)"
|
|
o.installationType = "Server"
|
|
case "144":
|
|
o.edition = "Windows Server Standard Edition (Nano Server installation)"
|
|
o.installationType = "Server"
|
|
case "147":
|
|
o.edition = "Windows Server Datacenter Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "148":
|
|
o.edition = "Windows Server Standard Edition (Server Core installation)"
|
|
o.installationType = "Server Core"
|
|
case "175":
|
|
o.edition = "Windows Enterprise for Virtual Desktops (Azure Virtual Desktop)"
|
|
o.installationType = "Client"
|
|
default:
|
|
}
|
|
|
|
case strings.HasPrefix(line, "CSDVersion"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CSDVersion. expected: "CSDVersion : <CSDVersion>", line: "%s"`, line)
|
|
}
|
|
o.servicePack = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "SystemType"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect SystemType. expected: "SystemType : <SystemType>", line: "%s"`, line)
|
|
}
|
|
o.arch = strings.TrimSpace(strings.TrimSuffix(rhs, "PC"))
|
|
case strings.HasPrefix(line, "DomainRole"):
|
|
if o.installationType != "" {
|
|
break
|
|
}
|
|
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect DomainRole. expected: "DomainRole : <DomainRole>", line: "%s"`, line)
|
|
}
|
|
switch domainRole := strings.TrimSpace(rhs); domainRole { // https://learn.microsoft.com/en-us/windows/win32/api/dsrole/ne-dsrole-dsrole_machine_role
|
|
case "0", "1":
|
|
o.installationType = "Client"
|
|
case "2", "3":
|
|
o.installationType = "Server"
|
|
case "4", "5":
|
|
o.installationType = "Domain Controller"
|
|
default:
|
|
return osInfo{}, xerrors.Errorf("Failed to detect Installation Type from DomainRole. err: %s is invalid DomainRole", domainRole)
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
return o, nil
|
|
}
|
|
|
|
func parseRegistry(stdout, arch string) (osInfo, error) {
|
|
var (
|
|
o osInfo
|
|
major string
|
|
minor string
|
|
)
|
|
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
|
|
switch {
|
|
case strings.HasPrefix(line, "ProductName"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect ProductName. expected: "ProductName : <ProductName>", line: "%s"`, line)
|
|
}
|
|
o.productName = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CurrentVersion"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CurrentVersion. expected: "CurrentVersion : <Version>", line: "%s"`, line)
|
|
}
|
|
o.version = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CurrentMajorVersionNumber"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CurrentMajorVersionNumber. expected: "CurrentMajorVersionNumber : <Version>", line: "%s"`, line)
|
|
}
|
|
major = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CurrentMinorVersionNumber"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CurrentMinorVersionNumber. expected: "CurrentMinorVersionNumber : <Version>", line: "%s"`, line)
|
|
}
|
|
minor = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CurrentBuildNumber"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CurrentBuildNumber. expected: "CurrentBuildNumber : <Build>", line: "%s"`, line)
|
|
}
|
|
o.build = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "UBR"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect UBR. expected: "UBR : <Revision>", line: "%s"`, line)
|
|
}
|
|
o.revision = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "EditionID"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect EditionID. expected: "EditionID : <EditionID>", line: "%s"`, line)
|
|
}
|
|
o.edition = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "CSDVersion"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect CSDVersion. expected: "CSDVersion : <CSDVersion>", line: "%s"`, line)
|
|
}
|
|
o.servicePack = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "InstallationType"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return osInfo{}, xerrors.Errorf(`Failed to detect InstallationType. expected: "InstallationType : <InstallationType>", line: "%s"`, line)
|
|
}
|
|
o.installationType = strings.TrimSpace(rhs)
|
|
default:
|
|
}
|
|
}
|
|
if major != "" && minor != "" {
|
|
o.version = fmt.Sprintf("%s.%s", major, minor)
|
|
}
|
|
|
|
formatted, err := formatArch(arch)
|
|
if err != nil {
|
|
return osInfo{}, xerrors.Errorf("Failed to format arch. arch: %s, err: %w", arch, err)
|
|
}
|
|
o.arch = formatted
|
|
|
|
return o, nil
|
|
}
|
|
|
|
func detectOSName(osInfo osInfo) (string, error) {
|
|
osName, err := detectOSNameFromOSInfo(osInfo)
|
|
if err != nil {
|
|
return "", xerrors.Errorf("Failed to detect OS Name from OSInfo: %+v, err: %w", osInfo, err)
|
|
}
|
|
return osName, nil
|
|
}
|
|
|
|
func detectOSNameFromOSInfo(osInfo osInfo) (string, error) {
|
|
switch osInfo.version {
|
|
case "5.0":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Microsoft Windows 2000 %s", osInfo.servicePack), nil
|
|
}
|
|
return "Microsoft Windows 2000", nil
|
|
case "Server", "Domain Controller":
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Microsoft Windows 2000 Server %s", osInfo.servicePack), nil
|
|
}
|
|
return "Microsoft Windows 2000 Server", nil
|
|
}
|
|
case "5.1":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
var n string
|
|
switch osInfo.edition {
|
|
case "Professional":
|
|
n = "Microsoft Windows XP Professional"
|
|
case "Media Center":
|
|
n = "Microsoft Windows XP Media Center Edition 2005"
|
|
case "Tablet PC":
|
|
n = "Microsoft Windows XP Tablet PC Edition 2005"
|
|
default:
|
|
n = "Microsoft Windows XP"
|
|
}
|
|
switch osInfo.arch {
|
|
case "x64-based":
|
|
n = fmt.Sprintf("%s x64 Edition", n)
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("%s %s", n, osInfo.servicePack), nil
|
|
}
|
|
return n, nil
|
|
}
|
|
case "5.2":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
var n string
|
|
switch osInfo.edition {
|
|
case "Professional":
|
|
n = "Microsoft Windows XP Professional"
|
|
case "Media Center":
|
|
n = "Microsoft Windows XP Media Center Edition 2005"
|
|
case "Tablet PC":
|
|
n = "Microsoft Windows XP Tablet PC Edition 2005"
|
|
default:
|
|
n = "Microsoft Windows XP"
|
|
}
|
|
switch osInfo.arch {
|
|
case "x64-based":
|
|
n = fmt.Sprintf("%s x64 Edition", n)
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("%s %s", n, osInfo.servicePack), nil
|
|
}
|
|
return n, nil
|
|
case "Server", "Domain Controller":
|
|
n := "Microsoft Windows Server 2003"
|
|
if strings.Contains(osInfo.productName, "R2") {
|
|
n = "Microsoft Windows Server 2003 R2"
|
|
}
|
|
switch osInfo.arch {
|
|
case "x64-based":
|
|
n = fmt.Sprintf("%s x64 Edition", n)
|
|
case "Itanium-based":
|
|
if osInfo.edition == "Enterprise" {
|
|
n = fmt.Sprintf("%s, Enterprise Edition for Itanium-based Systems", n)
|
|
} else {
|
|
n = fmt.Sprintf("%s for Itanium-based Systems", n)
|
|
}
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("%s %s", n, osInfo.servicePack), nil
|
|
}
|
|
return n, nil
|
|
}
|
|
case "6.0":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
var n string
|
|
switch osInfo.arch {
|
|
case "x64-based":
|
|
n = "Windows Vista x64 Editions"
|
|
default:
|
|
n = "Windows Vista"
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("%s %s", n, osInfo.servicePack), nil
|
|
}
|
|
return n, nil
|
|
case "Server", "Domain Controller":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Windows Server 2008 for %s Systems %s", arch, osInfo.servicePack), nil
|
|
}
|
|
return fmt.Sprintf("Windows Server 2008 for %s Systems", arch), nil
|
|
case "Server Core":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Windows Server 2008 for %s Systems %s (Server Core installation)", arch, osInfo.servicePack), nil
|
|
}
|
|
return fmt.Sprintf("Windows Server 2008 for %s Systems (Server Core installation)", arch), nil
|
|
}
|
|
case "6.1":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Windows 7 for %s Systems %s", arch, osInfo.servicePack), nil
|
|
}
|
|
return fmt.Sprintf("Windows 7 for %s Systems", arch), nil
|
|
case "Server", "Domain Controller":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Windows Server 2008 R2 for %s Systems %s", arch, osInfo.servicePack), nil
|
|
}
|
|
return fmt.Sprintf("Windows Server 2008 R2 for %s Systems", arch), nil
|
|
case "Server Core":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if osInfo.servicePack != "" {
|
|
return fmt.Sprintf("Windows Server 2008 R2 for %s Systems %s (Server Core installation)", arch, osInfo.servicePack), nil
|
|
}
|
|
return fmt.Sprintf("Windows Server 2008 R2 for %s Systems (Server Core installation)", arch), nil
|
|
}
|
|
case "6.2":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("Windows 8 for %s Systems", arch), nil
|
|
case "Server", "Domain Controller":
|
|
return "Windows Server 2012", nil
|
|
case "Server Core":
|
|
return "Windows Server 2012 (Server Core installation)", nil
|
|
}
|
|
case "6.3":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("Windows 8.1 for %s Systems", arch), nil
|
|
case "Server", "Domain Controller":
|
|
return "Windows Server 2012 R2", nil
|
|
case "Server Core":
|
|
return "Windows Server 2012 R2 (Server Core installation)", nil
|
|
}
|
|
case "10.0":
|
|
switch osInfo.installationType {
|
|
case "Client":
|
|
if strings.Contains(osInfo.productName, "Windows 11") {
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
name, err := formatNamebyBuild("11", osInfo.build)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("%s for %s Systems", name, arch), nil
|
|
}
|
|
|
|
arch, err := formatArch(osInfo.arch)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
name, err := formatNamebyBuild("10", osInfo.build)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("%s for %s Systems", name, arch), nil
|
|
case "Server", "Nano Server", "Domain Controller":
|
|
return formatNamebyBuild("Server", osInfo.build)
|
|
case "Server Core":
|
|
name, err := formatNamebyBuild("Server", osInfo.build)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return fmt.Sprintf("%s (Server Core installation)", name), nil
|
|
}
|
|
}
|
|
return "", xerrors.New("OS Name not found")
|
|
}
|
|
|
|
func formatArch(arch string) (string, error) {
|
|
switch arch {
|
|
case "AMD64", "x64-based":
|
|
return "x64-based", nil
|
|
case "ARM64", "ARM64-based":
|
|
return "ARM64-based", nil
|
|
case "IA64", "Itanium-based":
|
|
return "Itanium-based", nil
|
|
case "x86", "X86-based":
|
|
return "32-bit", nil
|
|
default:
|
|
return "", xerrors.New("CPU Architecture not found")
|
|
}
|
|
}
|
|
|
|
type buildNumber struct {
|
|
build string
|
|
name string
|
|
}
|
|
|
|
var (
|
|
winBuilds = map[string][]buildNumber{
|
|
"10": {
|
|
{
|
|
build: "10240",
|
|
name: "Windows 10", // not "Windows 10 Version 1507"
|
|
},
|
|
{
|
|
build: "10586",
|
|
name: "Windows 10 Version 1511",
|
|
},
|
|
{
|
|
build: "14393",
|
|
name: "Windows 10 Version 1607",
|
|
},
|
|
{
|
|
build: "15063",
|
|
name: "Windows 10 Version 1703",
|
|
},
|
|
{
|
|
build: "16299",
|
|
name: "Windows 10 Version 1709",
|
|
},
|
|
{
|
|
build: "17134",
|
|
name: "Windows 10 Version 1803",
|
|
},
|
|
{
|
|
build: "17763",
|
|
name: "Windows 10 Version 1809",
|
|
},
|
|
{
|
|
build: "18362",
|
|
name: "Windows 10 Version 1903",
|
|
},
|
|
{
|
|
build: "18363",
|
|
name: "Windows 10 Version 1909",
|
|
},
|
|
{
|
|
build: "19041",
|
|
name: "Windows 10 Version 2004",
|
|
},
|
|
{
|
|
build: "19042",
|
|
name: "Windows 10 Version 20H2",
|
|
},
|
|
{
|
|
build: "19043",
|
|
name: "Windows 10 Version 21H1",
|
|
},
|
|
{
|
|
build: "19044",
|
|
name: "Windows 10 Version 21H2",
|
|
},
|
|
{
|
|
build: "19045",
|
|
name: "Windows 10 Version 22H2",
|
|
},
|
|
// It seems that there are cases where the Product Name is Windows 10 even though it is Windows 11
|
|
// ref: https://docs.microsoft.com/en-us/answers/questions/586548/in-the-official-version-of-windows-11-why-the-key.html
|
|
{
|
|
build: "22000",
|
|
name: "Windows 11 Version 21H2",
|
|
},
|
|
{
|
|
build: "22621",
|
|
name: "Windows 11 Version 22H2",
|
|
},
|
|
},
|
|
"11": {
|
|
{
|
|
build: "22000",
|
|
name: "Windows 11 Version 21H2",
|
|
},
|
|
{
|
|
build: "22621",
|
|
name: "Windows 11 Version 22H2",
|
|
},
|
|
},
|
|
"Server": {
|
|
{
|
|
build: "14393",
|
|
name: "Windows Server 2016",
|
|
},
|
|
{
|
|
build: "16299",
|
|
name: "Windows Server, Version 1709",
|
|
},
|
|
{
|
|
build: "17134",
|
|
name: "Windows Server, Version 1803",
|
|
},
|
|
{
|
|
build: "17763",
|
|
name: "Windows Server, Version 1809",
|
|
},
|
|
{
|
|
build: "17763",
|
|
name: "Windows Server 2019",
|
|
},
|
|
{
|
|
build: "18362",
|
|
name: "Windows Server, Version 1903",
|
|
},
|
|
{
|
|
build: "18363",
|
|
name: "Windows Server, Version 1909",
|
|
},
|
|
{
|
|
build: "19041",
|
|
name: "Windows Server, Version 2004",
|
|
},
|
|
{
|
|
build: "19042",
|
|
name: "Windows Server, Version 20H2",
|
|
},
|
|
{
|
|
build: "20348",
|
|
name: "Windows Server 2022",
|
|
},
|
|
},
|
|
}
|
|
)
|
|
|
|
func formatNamebyBuild(osType string, mybuild string) (string, error) {
|
|
builds, ok := winBuilds[osType]
|
|
if !ok {
|
|
return "", xerrors.New("OS Type not found")
|
|
}
|
|
|
|
nMybuild, err := strconv.Atoi(mybuild)
|
|
if err != nil {
|
|
return "", xerrors.Errorf("Failed to parse build number. err: %w", err)
|
|
}
|
|
|
|
v := builds[0].name
|
|
for _, b := range builds {
|
|
nBuild, err := strconv.Atoi(b.build)
|
|
if err != nil {
|
|
return "", xerrors.Errorf("Failed to parse build number. err: %w", err)
|
|
}
|
|
if nMybuild < nBuild {
|
|
break
|
|
}
|
|
v = b.name
|
|
}
|
|
return v, nil
|
|
}
|
|
|
|
func formatKernelVersion(osInfo osInfo) string {
|
|
v := fmt.Sprintf("%s.%s", osInfo.version, osInfo.build)
|
|
if osInfo.revision != "" {
|
|
v = fmt.Sprintf("%s.%s", v, osInfo.revision)
|
|
}
|
|
return v
|
|
}
|
|
|
|
func (o *windows) checkScanMode() error {
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) checkIfSudoNoPasswd() error {
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) checkDeps() error {
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) preCure() error {
|
|
if err := o.detectIPAddr(); err != nil {
|
|
o.log.Warnf("Failed to detect IP addresses: %s", err)
|
|
o.warns = append(o.warns, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) postScan() error {
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) detectIPAddr() error {
|
|
var err error
|
|
o.ServerInfo.IPv4Addrs, o.ServerInfo.IPv6Addrs, err = o.ip()
|
|
return err
|
|
}
|
|
|
|
func (o *windows) ip() ([]string, []string, error) {
|
|
r := o.exec("ipconfig.exe", noSudo)
|
|
if !r.isSuccess() {
|
|
return nil, nil, xerrors.Errorf("Failed to detect IP address: %v", r)
|
|
}
|
|
ipv4Addrs, ipv6Addrs := o.parseIP(r.Stdout)
|
|
return ipv4Addrs, ipv6Addrs, nil
|
|
}
|
|
|
|
func (o *windows) parseIP(stdout string) ([]string, []string) {
|
|
var ipv4Addrs, ipv6Addrs []string
|
|
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
t := strings.TrimSpace(scanner.Text())
|
|
lhs, rhs, ok := strings.Cut(t, ":")
|
|
if !ok {
|
|
continue
|
|
}
|
|
switch {
|
|
case strings.HasPrefix(lhs, "IPv4 Address"), strings.Contains(lhs, "Autoconfiguration IPv4 Address"), strings.HasPrefix(lhs, "IPv4 アドレス"), strings.HasPrefix(lhs, "自動構成 IPv4 アドレス"):
|
|
rhs = strings.NewReplacer("(Duplicate)", "", "(Preferred)", "", "(重複)", "", "(優先)", "").Replace(rhs)
|
|
if ip := net.ParseIP(strings.TrimSpace(rhs)); ip != nil {
|
|
ipv4Addrs = append(ipv4Addrs, ip.String())
|
|
}
|
|
case strings.HasPrefix(lhs, "IPv6 Address"), strings.HasPrefix(lhs, "Temporary IPv6 Address"), strings.HasPrefix(lhs, "IPv6 アドレス"), strings.HasPrefix(lhs, "一時 IPv6 アドレス"):
|
|
if ip := net.ParseIP(strings.TrimSpace(rhs)); ip != nil {
|
|
ipv6Addrs = append(ipv6Addrs, ip.String())
|
|
}
|
|
case strings.HasPrefix(lhs, "Link-local IPv6 Address"), strings.HasPrefix(lhs, "リンクローカル IPv6 アドレス"):
|
|
lhs, _, ok := strings.Cut(rhs, "%")
|
|
if !ok {
|
|
break
|
|
}
|
|
if ip := net.ParseIP(strings.TrimSpace(lhs)); ip != nil {
|
|
ipv6Addrs = append(ipv6Addrs, ip.String())
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
return ipv4Addrs, ipv6Addrs
|
|
}
|
|
|
|
func (o *windows) scanPackages() error {
|
|
if r := o.exec("$Packages = (Get-Package); Format-List -InputObject $Packages -Property Name, Version, ProviderName", noSudo); r.isSuccess() {
|
|
installed, _, err := o.parseInstalledPackages(r.Stdout)
|
|
if err != nil {
|
|
return xerrors.Errorf("Failed to parse installed packages. err: %w", err)
|
|
}
|
|
o.Packages = installed
|
|
}
|
|
|
|
kbs, err := o.scanKBs()
|
|
if err != nil {
|
|
return xerrors.Errorf("Failed to scan KB. err: %w", err)
|
|
}
|
|
o.windowsKB = kbs
|
|
|
|
return nil
|
|
}
|
|
|
|
func (o *windows) parseInstalledPackages(stdout string) (models.Packages, models.SrcPackages, error) {
|
|
installed := models.Packages{}
|
|
|
|
var name, version string
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
switch {
|
|
case line == "":
|
|
name, version = "", ""
|
|
case strings.HasPrefix(line, "Name"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, nil, xerrors.Errorf(`Failed to detect PackageName. expected: "Name : <PackageName>", line: "%s"`, line)
|
|
}
|
|
name = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "Version"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, nil, xerrors.Errorf(`Failed to detect Version. expected: "Version : <Version>", line: "%s"`, line)
|
|
}
|
|
version = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "ProviderName"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, nil, xerrors.Errorf(`Failed to detect ProviderName. expected: "ProviderName : <ProviderName>", line: "%s"`, line)
|
|
}
|
|
|
|
switch strings.TrimSpace(rhs) {
|
|
case "msu":
|
|
default:
|
|
if name != "" {
|
|
installed[name] = models.Package{Name: name, Version: version}
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
|
|
return installed, nil, nil
|
|
}
|
|
|
|
func (o *windows) scanKBs() (*models.WindowsKB, error) {
|
|
applied, unapplied := map[string]struct{}{}, map[string]struct{}{}
|
|
if r := o.exec("$Hotfix = (Get-Hotfix); Format-List -InputObject $Hotfix -Property HotFixID", noSudo); r.isSuccess() {
|
|
kbs, err := o.parseGetHotfix(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Get-Hotifx. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
applied[kb] = struct{}{}
|
|
}
|
|
}
|
|
|
|
if r := o.exec("$Packages = (Get-Package -ProviderName msu); Format-List -InputObject $Packages -Property Name", noSudo); r.isSuccess() {
|
|
kbs, err := o.parseGetPackageMSU(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Get-Package. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
applied[kb] = struct{}{}
|
|
}
|
|
}
|
|
|
|
if isLocalExec(o.getServerInfo().Port, o.getServerInfo().Host) {
|
|
var searcher string
|
|
switch c := o.getServerInfo().Windows; c.ServerSelection {
|
|
case 3: // https://learn.microsoft.com/en-us/windows/win32/wua_sdk/using-wua-to-scan-for-updates-offline
|
|
searcher = fmt.Sprintf("$UpdateSession = (New-Object -ComObject Microsoft.Update.Session); $UpdateServiceManager = (New-Object -ComObject Microsoft.Update.ServiceManager); $UpdateService = $UpdateServiceManager.AddScanPackageService(\"Offline Sync Service\", \"%s\", 1); $UpdateSearcher = $UpdateSession.CreateUpdateSearcher(); $UpdateSearcher.ServerSelection = %d; $UpdateSearcher.ServiceID = $UpdateService.ServiceID;", c.CabPath, c.ServerSelection)
|
|
default:
|
|
searcher = fmt.Sprintf("$UpdateSession = (New-Object -ComObject Microsoft.Update.Session); $UpdateSearcher = $UpdateSession.CreateUpdateSearcher(); $UpdateSearcher.ServerSelection = %d;", c.ServerSelection)
|
|
}
|
|
|
|
if r := o.exec(fmt.Sprintf(`%s $UpdateSearcher.search("IsInstalled = 1 and RebootRequired = 0 and Type='Software'").Updates | ForEach-Object -MemberName KBArticleIDs`, searcher), noSudo); r.isSuccess() {
|
|
kbs, err := o.parseWindowsUpdaterSearch(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Windows Update Search. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
applied[kb] = struct{}{}
|
|
}
|
|
}
|
|
if r := o.exec(fmt.Sprintf(`%s $UpdateSearcher.search("IsInstalled = 0 and Type='Software'").Updates | ForEach-Object -MemberName KBArticleIDs`, searcher), noSudo); r.isSuccess() {
|
|
kbs, err := o.parseWindowsUpdaterSearch(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Windows Update Search. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
unapplied[kb] = struct{}{}
|
|
}
|
|
}
|
|
if r := o.exec(fmt.Sprintf(`%s $UpdateSearcher.search("IsInstalled = 1 and RebootRequired = 1 and Type='Software'").Updates | ForEach-Object -MemberName KBArticleIDs`, searcher), noSudo); r.isSuccess() {
|
|
kbs, err := o.parseWindowsUpdaterSearch(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Windows Update Search. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
unapplied[kb] = struct{}{}
|
|
}
|
|
}
|
|
}
|
|
|
|
if r := o.exec("$UpdateSearcher = (New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher(); $HistoryCount = $UpdateSearcher.GetTotalHistoryCount(); $UpdateSearcher.QueryHistory(0, $HistoryCount) | Sort-Object -Property Date | Format-List -Property Title, Operation, ResultCode", noSudo); r.isSuccess() {
|
|
kbs, err := o.parseWindowsUpdateHistory(r.Stdout)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to parse Windows Update History. err: %w", err)
|
|
}
|
|
for _, kb := range kbs {
|
|
applied[kb] = struct{}{}
|
|
}
|
|
}
|
|
|
|
kbs, err := o.detectKBsFromKernelVersion()
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("Failed to detect KBs from kernel version. err: %w", err)
|
|
}
|
|
for _, kb := range kbs.Applied {
|
|
applied[kb] = struct{}{}
|
|
}
|
|
for _, kb := range kbs.Unapplied {
|
|
unapplied[kb] = struct{}{}
|
|
}
|
|
|
|
return &models.WindowsKB{Applied: maps.Keys(applied), Unapplied: maps.Keys(unapplied)}, nil
|
|
}
|
|
|
|
func (o *windows) parseGetHotfix(stdout string) ([]string, error) {
|
|
var kbs []string
|
|
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
switch {
|
|
case strings.HasPrefix(line, "HotFixID"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, xerrors.Errorf(`Failed to detect HotFixID. expected: "HotFixID : <KBID>", line: "%s"`, line)
|
|
}
|
|
kbs = append(kbs, strings.TrimPrefix(strings.TrimSpace(rhs), "KB"))
|
|
default:
|
|
}
|
|
}
|
|
|
|
return kbs, nil
|
|
}
|
|
|
|
func (o *windows) parseGetPackageMSU(stdout string) ([]string, error) {
|
|
var kbs []string
|
|
|
|
kbIDPattern := regexp.MustCompile(`KB(\d{6,7})`)
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
switch {
|
|
case strings.HasPrefix(line, "Name"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, xerrors.Errorf(`Failed to detect PackageName. expected: "Name : <PackageName>", line: "%s"`, line)
|
|
}
|
|
|
|
for _, m := range kbIDPattern.FindAllStringSubmatch(strings.TrimSpace(rhs), -1) {
|
|
kbs = append(kbs, m[1])
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
|
|
return kbs, nil
|
|
}
|
|
|
|
func (o *windows) parseWindowsUpdaterSearch(stdout string) ([]string, error) {
|
|
var kbs []string
|
|
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
if line := scanner.Text(); line != "" {
|
|
kbs = append(kbs, line)
|
|
}
|
|
}
|
|
|
|
return kbs, nil
|
|
}
|
|
|
|
func (o *windows) parseWindowsUpdateHistory(stdout string) ([]string, error) {
|
|
kbs := map[string]struct{}{}
|
|
|
|
kbIDPattern := regexp.MustCompile(`KB(\d{6,7})`)
|
|
var title, operation string
|
|
scanner := bufio.NewScanner(strings.NewReader(stdout))
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
switch {
|
|
case line == "":
|
|
title, operation = "", ""
|
|
case strings.HasPrefix(line, "Title"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, xerrors.Errorf(`Failed to detect Title. expected: "Title : <Title>", line: "%s"`, line)
|
|
}
|
|
title = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "Operation"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, xerrors.Errorf(`Failed to detect Operation. expected: "Operation : <Operation>", line: "%s"`, line)
|
|
}
|
|
operation = strings.TrimSpace(rhs)
|
|
case strings.HasPrefix(line, "ResultCode"):
|
|
_, rhs, found := strings.Cut(line, ":")
|
|
if !found {
|
|
return nil, xerrors.Errorf(`Failed to detect ResultCode. expected: "ResultCode : <ResultCode>", line: "%s"`, line)
|
|
}
|
|
|
|
// https://learn.microsoft.com/en-us/windows/win32/api/wuapi/ne-wuapi-operationresultcode
|
|
if strings.TrimSpace(rhs) == "2" {
|
|
for _, m := range kbIDPattern.FindAllStringSubmatch(title, -1) {
|
|
// https://learn.microsoft.com/en-us/windows/win32/api/wuapi/ne-wuapi-updateoperation
|
|
switch operation {
|
|
case "1":
|
|
kbs[m[1]] = struct{}{}
|
|
case "2":
|
|
delete(kbs, m[1])
|
|
default:
|
|
}
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
}
|
|
|
|
return maps.Keys(kbs), nil
|
|
}
|
|
|
|
type windowsRelease struct {
|
|
revision string
|
|
kb string
|
|
}
|
|
|
|
type updateProgram struct {
|
|
rollup []windowsRelease
|
|
securityOnly []string
|
|
}
|
|
|
|
var windowsReleases = map[string]map[string]map[string]updateProgram{
|
|
"Client": {
|
|
"7": {
|
|
// https://support.microsoft.com/en-us/topic/windows-7-sp1-and-windows-server-2008-r2-sp1-update-history-720c2590-fd58-26ba-16cc-6d8f3b547599
|
|
"SP1": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "3172605"},
|
|
{revision: "", kb: "3179573"},
|
|
{revision: "", kb: "3185278"},
|
|
{revision: "", kb: "3185330"},
|
|
{revision: "", kb: "3192403"},
|
|
{revision: "", kb: "3197868"},
|
|
{revision: "", kb: "3197869"},
|
|
{revision: "", kb: "3207752"},
|
|
{revision: "", kb: "3212646"},
|
|
{revision: "", kb: "4012215"},
|
|
{revision: "", kb: "4012218"},
|
|
{revision: "", kb: "4015549"},
|
|
{revision: "", kb: "4015552"},
|
|
{revision: "", kb: "4019264"},
|
|
{revision: "", kb: "4019265"},
|
|
{revision: "", kb: "4022719"},
|
|
{revision: "", kb: "4022168"},
|
|
{revision: "", kb: "4025341"},
|
|
{revision: "", kb: "4025340"},
|
|
{revision: "", kb: "4034664"},
|
|
{revision: "", kb: "4034670"},
|
|
{revision: "", kb: "4038777"},
|
|
{revision: "", kb: "4038803"},
|
|
{revision: "", kb: "4041681"},
|
|
{revision: "", kb: "4041686"},
|
|
{revision: "", kb: "4048957"},
|
|
{revision: "", kb: "4051034"},
|
|
{revision: "", kb: "4054518"},
|
|
{revision: "", kb: "4056894"},
|
|
{revision: "", kb: "4057400"},
|
|
{revision: "", kb: "4074598"},
|
|
{revision: "", kb: "4075211"},
|
|
{revision: "", kb: "4088875"},
|
|
{revision: "", kb: "4088881"},
|
|
{revision: "", kb: "4093118"},
|
|
{revision: "", kb: "4093113"},
|
|
{revision: "", kb: "4103718"},
|
|
{revision: "", kb: "4103713"},
|
|
{revision: "", kb: "4284826"},
|
|
{revision: "", kb: "4284842"},
|
|
{revision: "", kb: "4338818"},
|
|
{revision: "", kb: "4338821"},
|
|
{revision: "", kb: "4343900"},
|
|
{revision: "", kb: "4343894"},
|
|
{revision: "", kb: "4457144"},
|
|
{revision: "", kb: "4457139"},
|
|
{revision: "", kb: "4462923"},
|
|
{revision: "", kb: "4462927"},
|
|
{revision: "", kb: "4467107"},
|
|
{revision: "", kb: "4467108"},
|
|
{revision: "", kb: "4471318"},
|
|
{revision: "", kb: "4480970"},
|
|
{revision: "", kb: "4480955"},
|
|
{revision: "", kb: "4486563"},
|
|
{revision: "", kb: "4486565"},
|
|
{revision: "", kb: "4489878"},
|
|
{revision: "", kb: "4489892"},
|
|
{revision: "", kb: "4493472"},
|
|
{revision: "", kb: "4493453"},
|
|
{revision: "", kb: "4499164"},
|
|
{revision: "", kb: "4499178"},
|
|
{revision: "", kb: "4503292"},
|
|
{revision: "", kb: "4503277"},
|
|
{revision: "", kb: "4507449"},
|
|
{revision: "", kb: "4507437"},
|
|
{revision: "", kb: "4512506"},
|
|
{revision: "", kb: "4512514"},
|
|
{revision: "", kb: "4516065"},
|
|
{revision: "", kb: "4516048"},
|
|
{revision: "", kb: "4524157"},
|
|
{revision: "", kb: "4519976"},
|
|
{revision: "", kb: "4519972"},
|
|
{revision: "", kb: "4525235"},
|
|
{revision: "", kb: "4525251"},
|
|
{revision: "", kb: "4530734"},
|
|
{revision: "", kb: "4534310"},
|
|
{revision: "", kb: "4539601"},
|
|
{revision: "", kb: "4537820"},
|
|
{revision: "", kb: "4540688"},
|
|
{revision: "", kb: "4550964"},
|
|
{revision: "", kb: "4556836"},
|
|
{revision: "", kb: "4561643"},
|
|
{revision: "", kb: "4565524"},
|
|
{revision: "", kb: "4571729"},
|
|
{revision: "", kb: "4577051"},
|
|
{revision: "", kb: "4580345"},
|
|
{revision: "", kb: "4586827"},
|
|
{revision: "", kb: "4592471"},
|
|
{revision: "", kb: "4598279"},
|
|
{revision: "", kb: "4601347"},
|
|
{revision: "", kb: "5000841"},
|
|
{revision: "", kb: "5001335"},
|
|
{revision: "", kb: "5003233"},
|
|
{revision: "", kb: "5003667"},
|
|
{revision: "", kb: "5004953"},
|
|
{revision: "", kb: "5004289"},
|
|
{revision: "", kb: "5005088"},
|
|
{revision: "", kb: "5005633"},
|
|
{revision: "", kb: "5006743"},
|
|
{revision: "", kb: "5007236"},
|
|
{revision: "", kb: "5008244"},
|
|
{revision: "", kb: "5009610"},
|
|
{revision: "", kb: "5010404"},
|
|
{revision: "", kb: "5011552"},
|
|
{revision: "", kb: "5012626"},
|
|
{revision: "", kb: "5014012"},
|
|
{revision: "", kb: "5014748"},
|
|
{revision: "", kb: "5015861"},
|
|
{revision: "", kb: "5016676"},
|
|
{revision: "", kb: "5017361"},
|
|
{revision: "", kb: "5018454"},
|
|
{revision: "", kb: "5020000"},
|
|
{revision: "", kb: "5021291"},
|
|
{revision: "", kb: "5022338"},
|
|
{revision: "", kb: "5022872"},
|
|
{revision: "", kb: "5023769"},
|
|
{revision: "", kb: "5025279"},
|
|
{revision: "", kb: "5026413"},
|
|
{revision: "", kb: "5027275"},
|
|
},
|
|
securityOnly: []string{
|
|
"3192391",
|
|
"3197867",
|
|
"3205394",
|
|
"3212642",
|
|
"4012212",
|
|
"4015546",
|
|
"4019263",
|
|
"4022722",
|
|
"4025337",
|
|
"4034679",
|
|
"4038779",
|
|
"4041678",
|
|
"4048960",
|
|
"4054521",
|
|
"4056897",
|
|
"4074587",
|
|
"4088878",
|
|
"4093108",
|
|
"4103712",
|
|
"4284867",
|
|
"4338823",
|
|
"4343899",
|
|
"4457145",
|
|
"4462915",
|
|
"4467106",
|
|
"4471328",
|
|
"4480960",
|
|
"4486564",
|
|
"4489885",
|
|
"4493448",
|
|
"4499175",
|
|
"4503269",
|
|
"4507456",
|
|
"4512486",
|
|
"4516033",
|
|
"4520003",
|
|
"4525233",
|
|
"4530692",
|
|
"4534314",
|
|
"4537813",
|
|
"4541500",
|
|
"4550965",
|
|
"4556843",
|
|
"4561669",
|
|
"4565539",
|
|
"4571719",
|
|
"4577053",
|
|
"4580387",
|
|
"4586805",
|
|
"4592503",
|
|
"4598289",
|
|
"4601363",
|
|
"5000851",
|
|
"5001392",
|
|
"5003228",
|
|
"5003694",
|
|
"5004951",
|
|
"5004307",
|
|
"5005089",
|
|
"5005615",
|
|
"5006728",
|
|
"5007233",
|
|
"5008282",
|
|
"5009621",
|
|
"5010422",
|
|
"5011529",
|
|
"5012649",
|
|
"5013999",
|
|
"5014742",
|
|
"5015862",
|
|
"5016679",
|
|
"5017373",
|
|
"5018479",
|
|
"5020013",
|
|
"5021288",
|
|
"5022339",
|
|
"5022874",
|
|
"5023759",
|
|
"5025277",
|
|
"5026426",
|
|
"5027256",
|
|
},
|
|
},
|
|
},
|
|
"8.1": {
|
|
// https://support.microsoft.com/en-us/topic/windows-8-1-and-windows-server-2012-r2-update-history-47d81dd2-6804-b6ae-4112-20089467c7a6
|
|
"": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "3172614"},
|
|
{revision: "", kb: "3179574"},
|
|
{revision: "", kb: "3185279"},
|
|
{revision: "", kb: "3185331"},
|
|
{revision: "", kb: "3192404"},
|
|
{revision: "", kb: "3197874"},
|
|
{revision: "", kb: "3197875"},
|
|
{revision: "", kb: "3205401"},
|
|
{revision: "", kb: "4012216"},
|
|
{revision: "", kb: "4012219"},
|
|
{revision: "", kb: "4015550"},
|
|
{revision: "", kb: "4015553"},
|
|
{revision: "", kb: "4019215"},
|
|
{revision: "", kb: "4019217"},
|
|
{revision: "", kb: "4022726"},
|
|
{revision: "", kb: "4022720"},
|
|
{revision: "", kb: "4025336"},
|
|
{revision: "", kb: "4025335"},
|
|
{revision: "", kb: "4034681"},
|
|
{revision: "", kb: "4034663"},
|
|
{revision: "", kb: "4038792"},
|
|
{revision: "", kb: "4038774"},
|
|
{revision: "", kb: "4041693"},
|
|
{revision: "", kb: "4041685"},
|
|
{revision: "", kb: "4048958"},
|
|
{revision: "", kb: "4050946"},
|
|
{revision: "", kb: "4054519"},
|
|
{revision: "", kb: "4056895"},
|
|
{revision: "", kb: "4057401"},
|
|
{revision: "", kb: "4074594"},
|
|
{revision: "", kb: "4075212"},
|
|
{revision: "", kb: "4088876"},
|
|
{revision: "", kb: "4088882"},
|
|
{revision: "", kb: "4093114"},
|
|
{revision: "", kb: "4093121"},
|
|
{revision: "", kb: "4103725"},
|
|
{revision: "", kb: "4103724"},
|
|
{revision: "", kb: "4284815"},
|
|
{revision: "", kb: "4284863"},
|
|
{revision: "", kb: "4338815"},
|
|
{revision: "", kb: "4338831"},
|
|
{revision: "", kb: "4343898"},
|
|
{revision: "", kb: "4343891"},
|
|
{revision: "", kb: "4457129"},
|
|
{revision: "", kb: "4457133"},
|
|
{revision: "", kb: "4462926"},
|
|
{revision: "", kb: "4462921"},
|
|
{revision: "", kb: "4467697"},
|
|
{revision: "", kb: "4467695"},
|
|
{revision: "", kb: "4471320"},
|
|
{revision: "", kb: "4480963"},
|
|
{revision: "", kb: "4480969"},
|
|
{revision: "", kb: "4487000"},
|
|
{revision: "", kb: "4487016"},
|
|
{revision: "", kb: "4489881"},
|
|
{revision: "", kb: "4489893"},
|
|
{revision: "", kb: "4493446"},
|
|
{revision: "", kb: "4493443"},
|
|
{revision: "", kb: "4499151"},
|
|
{revision: "", kb: "4499182"},
|
|
{revision: "", kb: "4503276"},
|
|
{revision: "", kb: "4503283"},
|
|
{revision: "", kb: "4507448"},
|
|
{revision: "", kb: "4507463"},
|
|
{revision: "", kb: "4512488"},
|
|
{revision: "", kb: "4512478"},
|
|
{revision: "", kb: "4516067"},
|
|
{revision: "", kb: "4516041"},
|
|
{revision: "", kb: "4524156"},
|
|
{revision: "", kb: "4520005"},
|
|
{revision: "", kb: "4520012"},
|
|
{revision: "", kb: "4525243"},
|
|
{revision: "", kb: "4525252"},
|
|
{revision: "", kb: "4530702"},
|
|
{revision: "", kb: "4534297"},
|
|
{revision: "", kb: "4534324"},
|
|
{revision: "", kb: "4537821"},
|
|
{revision: "", kb: "4537819"},
|
|
{revision: "", kb: "4541509"},
|
|
{revision: "", kb: "4541334"},
|
|
{revision: "", kb: "4550961"},
|
|
{revision: "", kb: "4550958"},
|
|
{revision: "", kb: "4556846"},
|
|
{revision: "", kb: "4561666"},
|
|
{revision: "", kb: "4565541"},
|
|
{revision: "", kb: "4571703"},
|
|
{revision: "", kb: "4577066"},
|
|
{revision: "", kb: "4580347"},
|
|
{revision: "", kb: "4586845"},
|
|
{revision: "", kb: "4592484"},
|
|
{revision: "", kb: "4598285"},
|
|
{revision: "", kb: "4601384"},
|
|
{revision: "", kb: "5000848"},
|
|
{revision: "", kb: "5001382"},
|
|
{revision: "", kb: "5003209"},
|
|
{revision: "", kb: "5003671"},
|
|
{revision: "", kb: "5004954"},
|
|
{revision: "", kb: "5004298"},
|
|
{revision: "", kb: "5005076"},
|
|
{revision: "", kb: "5005613"},
|
|
{revision: "", kb: "5006714"},
|
|
{revision: "", kb: "5007247"},
|
|
{revision: "", kb: "5008263"},
|
|
{revision: "", kb: "5009624"},
|
|
{revision: "", kb: "5010419"},
|
|
{revision: "", kb: "5011564"},
|
|
{revision: "", kb: "5012670"},
|
|
{revision: "", kb: "5014011"},
|
|
{revision: "", kb: "5014738"},
|
|
{revision: "", kb: "5015874"},
|
|
{revision: "", kb: "5016681"},
|
|
{revision: "", kb: "5017367"},
|
|
{revision: "", kb: "5018474"},
|
|
{revision: "", kb: "5020023"},
|
|
{revision: "", kb: "5021294"},
|
|
{revision: "", kb: "5022352"},
|
|
{revision: "", kb: "5022899"},
|
|
{revision: "", kb: "5023765"},
|
|
{revision: "", kb: "5025285"},
|
|
{revision: "", kb: "5026415"},
|
|
{revision: "", kb: "5027271"},
|
|
},
|
|
securityOnly: []string{
|
|
"3192392",
|
|
"3197873",
|
|
"3205400",
|
|
"4012213",
|
|
"4015547",
|
|
"4019213",
|
|
"4022717",
|
|
"4025333",
|
|
"4034672",
|
|
"4038793",
|
|
"4041687",
|
|
"4048961",
|
|
"4054522",
|
|
"4056898",
|
|
"4074597",
|
|
"4088879",
|
|
"4093115",
|
|
"4103715",
|
|
"4284878",
|
|
"4338824",
|
|
"4343888",
|
|
"4457143",
|
|
"4462941",
|
|
"4467703",
|
|
"4471322",
|
|
"4480964",
|
|
"4487028",
|
|
"4489883",
|
|
"4493467",
|
|
"4499165",
|
|
"4503290",
|
|
"4507457",
|
|
"4512489",
|
|
"4516064",
|
|
"4519990",
|
|
"4525250",
|
|
"4530730",
|
|
"4534309",
|
|
"4537803",
|
|
"4541505",
|
|
"4550970",
|
|
"4556853",
|
|
"4561673",
|
|
"4565540",
|
|
"4571723",
|
|
"4577071",
|
|
"4580358",
|
|
"4586823",
|
|
"4592495",
|
|
"4598275",
|
|
"4601349",
|
|
"5000853",
|
|
"5001393",
|
|
"5003220",
|
|
"5003681",
|
|
"5004958",
|
|
"5004285",
|
|
"5005106",
|
|
"5005627",
|
|
"5006729",
|
|
"5007255",
|
|
"5008285",
|
|
"5009595",
|
|
"5010395",
|
|
"5011560",
|
|
"5012639",
|
|
"5014001",
|
|
"5014746",
|
|
"5015877",
|
|
"5016683",
|
|
"5017365",
|
|
"5018476",
|
|
"5020010",
|
|
"5021296",
|
|
"5022346",
|
|
"5022894",
|
|
"5023764",
|
|
"5025288",
|
|
"5026409",
|
|
"5027282",
|
|
},
|
|
},
|
|
},
|
|
"10": {
|
|
// https://learn.microsoft.com/en-us/windows/release-health/release-information
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-93345c32-4ae1-6d1c-f885-6c0b718adf3b
|
|
"10240": {
|
|
rollup: []windowsRelease{
|
|
{revision: "16405", kb: "3074683"},
|
|
{revision: "16413", kb: "3081424"},
|
|
{revision: "16430", kb: "3081436"},
|
|
{revision: "16433", kb: "3081438"},
|
|
{revision: "16445", kb: "3081444"},
|
|
{revision: "16463", kb: "3081448"},
|
|
{revision: "16487", kb: "3081455"},
|
|
{revision: "16520", kb: "3093266"},
|
|
{revision: "16549", kb: "3097617"},
|
|
{revision: "16566", kb: "3105210"},
|
|
{revision: "16590", kb: "3105213"},
|
|
{revision: "16601", kb: "3116869"},
|
|
{revision: "16644", kb: "3124266"},
|
|
{revision: "16683", kb: "3135174"},
|
|
{revision: "16725", kb: "3140745"},
|
|
{revision: "16769", kb: "3147461"},
|
|
{revision: "16771", kb: "3147461"},
|
|
{revision: "16854", kb: "3156387"},
|
|
{revision: "16942", kb: "3163017"},
|
|
{revision: "17024", kb: "3163912"},
|
|
{revision: "17071", kb: "3176492"},
|
|
{revision: "17113", kb: "3185611"},
|
|
{revision: "17113", kb: "3193821"},
|
|
{revision: "17146", kb: "3192440"},
|
|
{revision: "17190", kb: "3198585"},
|
|
{revision: "17202", kb: "3205383"},
|
|
{revision: "17236", kb: "3210720"},
|
|
{revision: "17319", kb: "4012606"},
|
|
{revision: "17320", kb: "4016637"},
|
|
{revision: "17354", kb: "4015221"},
|
|
{revision: "17394", kb: "4019474"},
|
|
{revision: "17443", kb: "4022727"},
|
|
{revision: "17446", kb: "4032695"},
|
|
{revision: "17488", kb: "4025338"},
|
|
{revision: "17533", kb: "4034668"},
|
|
{revision: "17609", kb: "4038781"},
|
|
{revision: "17643", kb: "4042895"},
|
|
{revision: "17673", kb: "4048956"},
|
|
{revision: "17709", kb: "4053581"},
|
|
{revision: "17738", kb: "4056893"},
|
|
{revision: "17741", kb: "4075199"},
|
|
{revision: "17741", kb: "4077735"},
|
|
{revision: "17770", kb: "4074596"},
|
|
{revision: "17797", kb: "4088786"},
|
|
{revision: "17831", kb: "4093111"},
|
|
{revision: "17861", kb: "4103716"},
|
|
{revision: "17889", kb: "4284860"},
|
|
{revision: "17914", kb: "4338829"},
|
|
{revision: "17918", kb: "4345455"},
|
|
{revision: "17946", kb: "4343892"},
|
|
{revision: "17976", kb: "4457132"},
|
|
{revision: "18005", kb: "4462922"},
|
|
{revision: "18036", kb: "4467680"},
|
|
{revision: "18063", kb: "4471323"},
|
|
{revision: "18064", kb: "4483228"},
|
|
{revision: "18094", kb: "4480962"},
|
|
{revision: "18132", kb: "4487018"},
|
|
{revision: "18135", kb: "4491101"},
|
|
{revision: "18158", kb: "4489872"},
|
|
{revision: "18186", kb: "4493475"},
|
|
{revision: "18187", kb: "4498375"},
|
|
{revision: "18215", kb: "4499154"},
|
|
{revision: "18218", kb: "4505051"},
|
|
{revision: "18244", kb: "4503291"},
|
|
{revision: "18275", kb: "4507458"},
|
|
{revision: "18305", kb: "4512497"},
|
|
{revision: "18308", kb: "4517276"},
|
|
{revision: "18333", kb: "4516070"},
|
|
{revision: "18334", kb: "4522009"},
|
|
{revision: "18335", kb: "4524153"},
|
|
{revision: "18368", kb: "4520011"},
|
|
{revision: "18395", kb: "4525232"},
|
|
{revision: "18427", kb: "4530681"},
|
|
{revision: "18453", kb: "4534306"},
|
|
{revision: "18486", kb: "4537776"},
|
|
{revision: "18519", kb: "4540693"},
|
|
{revision: "18545", kb: "4550930"},
|
|
{revision: "18575", kb: "4556826"},
|
|
{revision: "18608", kb: "4561649"},
|
|
{revision: "18609", kb: "4567518"},
|
|
{revision: "18638", kb: "4565513"},
|
|
{revision: "18666", kb: "4571692"},
|
|
{revision: "18696", kb: "4577049"},
|
|
{revision: "18725", kb: "4580327"},
|
|
{revision: "18756", kb: "4586787"},
|
|
{revision: "18782", kb: "4592464"},
|
|
{revision: "18818", kb: "4598231"},
|
|
{revision: "18841", kb: "4601331"},
|
|
{revision: "18842", kb: "4601331"},
|
|
{revision: "18874", kb: "5000807"},
|
|
{revision: "18875", kb: "5001631"},
|
|
{revision: "18906", kb: "5001340"},
|
|
{revision: "18932", kb: "5003172"},
|
|
{revision: "18967", kb: "5003687"},
|
|
{revision: "18969", kb: "5004950"},
|
|
{revision: "19003", kb: "5004249"},
|
|
{revision: "19022", kb: "5005040"},
|
|
{revision: "19060", kb: "5005569"},
|
|
{revision: "19086", kb: "5006675"},
|
|
{revision: "19119", kb: "5007207"},
|
|
{revision: "19145", kb: "5008230"},
|
|
{revision: "19177", kb: "5009585"},
|
|
{revision: "19179", kb: "5010789"},
|
|
{revision: "19204", kb: "5010358"},
|
|
{revision: "19235", kb: "5011491"},
|
|
{revision: "19265", kb: "5012653"},
|
|
{revision: "19297", kb: "5013963"},
|
|
{revision: "19325", kb: "5014710"},
|
|
{revision: "19360", kb: "5015832"},
|
|
{revision: "19387", kb: "5016639"},
|
|
{revision: "19444", kb: "5017327"},
|
|
{revision: "19507", kb: "5018425"},
|
|
{revision: "19509", kb: "5020440"},
|
|
{revision: "19567", kb: "5019970"},
|
|
{revision: "19624", kb: "5021243"},
|
|
{revision: "19685", kb: "5022297"},
|
|
{revision: "19747", kb: "5022858"},
|
|
{revision: "19805", kb: "5023713"},
|
|
{revision: "19869", kb: "5025234"},
|
|
{revision: "19926", kb: "5026382"},
|
|
{revision: "19983", kb: "5027230"},
|
|
{revision: "19986", kb: "5028622"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-2ad7900f-882c-1dfc-f9d7-82b7ca162010
|
|
"10586": {
|
|
rollup: []windowsRelease{
|
|
{revision: "3", kb: "3105211"},
|
|
{revision: "11", kb: "3118754"},
|
|
{revision: "14", kb: "3120677"},
|
|
{revision: "17", kb: "3116908"},
|
|
{revision: "29", kb: "3116900"},
|
|
{revision: "36", kb: "3124200"},
|
|
{revision: "63", kb: "3124263"},
|
|
{revision: "71", kb: "3124262"},
|
|
{revision: "104", kb: "3135173"},
|
|
{revision: "122", kb: "3140743"},
|
|
{revision: "164", kb: "3140768"},
|
|
{revision: "218", kb: "3147458"},
|
|
{revision: "318", kb: "3156421"},
|
|
{revision: "420", kb: "3163018"},
|
|
{revision: "494", kb: "3172985"},
|
|
{revision: "545", kb: "3176493"},
|
|
{revision: "589", kb: "3185614"},
|
|
{revision: "633", kb: "3192441"},
|
|
{revision: "679", kb: "3198586"},
|
|
{revision: "682", kb: "3198586"},
|
|
{revision: "713", kb: "3205386"},
|
|
{revision: "753", kb: "3210721"},
|
|
{revision: "839", kb: "4013198"},
|
|
{revision: "842", kb: "4016636"},
|
|
{revision: "873", kb: "4015219"},
|
|
{revision: "916", kb: "4019473"},
|
|
{revision: "962", kb: "4022714"},
|
|
{revision: "965", kb: "4032693"},
|
|
{revision: "1007", kb: "4025344"},
|
|
{revision: "1045", kb: "4034660"},
|
|
{revision: "1106", kb: "4038783"},
|
|
{revision: "1176", kb: "4041689"},
|
|
{revision: "1177", kb: "4052232"},
|
|
{revision: "1232", kb: "4048952"},
|
|
{revision: "1295", kb: "4053578"},
|
|
{revision: "1356", kb: "4056888"},
|
|
{revision: "1358", kb: "4075200"},
|
|
{revision: "1417", kb: "4074591"},
|
|
{revision: "1478", kb: "4088779"},
|
|
{revision: "1540", kb: "4093109"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-2016-update-history-4acfbc84-a290-1b54-536a-1c0430e9f3fd
|
|
"14393": {
|
|
rollup: []windowsRelease{
|
|
{revision: "10", kb: "3176929"},
|
|
{revision: "51", kb: "3176495"},
|
|
{revision: "82", kb: "3176934"},
|
|
{revision: "105", kb: "3176938"},
|
|
{revision: "187", kb: "3189866"},
|
|
{revision: "187", kb: "3193494"},
|
|
{revision: "189", kb: "3193494"},
|
|
{revision: "222", kb: "3194496"},
|
|
{revision: "321", kb: "3194798"},
|
|
{revision: "351", kb: "3197954"},
|
|
{revision: "447", kb: "3200970"},
|
|
{revision: "448", kb: "3200970"},
|
|
{revision: "479", kb: "3201845"},
|
|
{revision: "571", kb: "3206632"},
|
|
{revision: "576", kb: "3206632"},
|
|
{revision: "693", kb: "3213986"},
|
|
{revision: "729", kb: "4010672"},
|
|
{revision: "953", kb: "4013429"},
|
|
{revision: "969", kb: "4015438"},
|
|
{revision: "970", kb: "4016635"},
|
|
{revision: "1066", kb: "4015217"},
|
|
{revision: "1083", kb: "4015217"},
|
|
{revision: "1198", kb: "4019472"},
|
|
{revision: "1230", kb: "4023680"},
|
|
{revision: "1358", kb: "4022715"},
|
|
{revision: "1378", kb: "4022723"},
|
|
{revision: "1480", kb: "4025339"},
|
|
{revision: "1532", kb: "4025334"},
|
|
{revision: "1537", kb: "4038220"},
|
|
{revision: "1593", kb: "4034658"},
|
|
{revision: "1613", kb: "4034661"},
|
|
{revision: "1670", kb: "4039396"},
|
|
{revision: "1715", kb: "4038782"},
|
|
{revision: "1737", kb: "4038801"},
|
|
{revision: "1770", kb: "4041691"},
|
|
{revision: "1794", kb: "4041688"},
|
|
{revision: "1797", kb: "4052231"},
|
|
{revision: "1884", kb: "4048953"},
|
|
{revision: "1914", kb: "4051033"},
|
|
{revision: "1944", kb: "4053579"},
|
|
{revision: "2007", kb: "4056890"},
|
|
{revision: "2034", kb: "4057142"},
|
|
{revision: "2035", kb: "4057142"},
|
|
{revision: "2068", kb: "4074590"},
|
|
{revision: "2097", kb: "4077525"},
|
|
{revision: "2125", kb: "4088787"},
|
|
{revision: "2126", kb: "4088787"},
|
|
{revision: "2155", kb: "4088889"},
|
|
{revision: "2156", kb: "4096309"},
|
|
{revision: "2189", kb: "4093119"},
|
|
{revision: "2214", kb: "4093120"},
|
|
{revision: "2248", kb: "4103723"},
|
|
{revision: "2273", kb: "4103720"},
|
|
{revision: "2312", kb: "4284880"},
|
|
{revision: "2339", kb: "4284833"},
|
|
{revision: "2363", kb: "4338814"},
|
|
{revision: "2368", kb: "4345418"},
|
|
{revision: "2395", kb: "4338822"},
|
|
{revision: "2396", kb: "4346877"},
|
|
{revision: "2430", kb: "4343887"},
|
|
{revision: "2457", kb: "4343884"},
|
|
{revision: "2485", kb: "4457131"},
|
|
{revision: "2515", kb: "4457127"},
|
|
{revision: "2551", kb: "4462917"},
|
|
{revision: "2580", kb: "4462928"},
|
|
{revision: "2608", kb: "4467691"},
|
|
{revision: "2639", kb: "4467684"},
|
|
{revision: "2641", kb: "4478877"},
|
|
{revision: "2665", kb: "4471321"},
|
|
{revision: "2670", kb: "4483229"},
|
|
{revision: "2724", kb: "4480961"},
|
|
{revision: "2759", kb: "4480977"},
|
|
{revision: "2791", kb: "4487026"},
|
|
{revision: "2828", kb: "4487006"},
|
|
{revision: "2848", kb: "4489882"},
|
|
{revision: "2879", kb: "4489889"},
|
|
{revision: "2906", kb: "4493470"},
|
|
{revision: "2908", kb: "4499418"},
|
|
{revision: "2941", kb: "4493473"},
|
|
{revision: "2969", kb: "4494440"},
|
|
{revision: "2972", kb: "4505052"},
|
|
{revision: "2999", kb: "4499177"},
|
|
{revision: "3025", kb: "4503267"},
|
|
{revision: "3053", kb: "4503294"},
|
|
{revision: "3056", kb: "4509475"},
|
|
{revision: "3085", kb: "4507460"},
|
|
{revision: "3115", kb: "4507459"},
|
|
{revision: "3144", kb: "4512517"},
|
|
{revision: "3181", kb: "4512495"},
|
|
{revision: "3204", kb: "4516044"},
|
|
{revision: "3206", kb: "4522010"},
|
|
{revision: "3242", kb: "4516061"},
|
|
{revision: "3243", kb: "4524152"},
|
|
{revision: "3274", kb: "4519998"},
|
|
{revision: "3300", kb: "4519979"},
|
|
{revision: "3326", kb: "4525236"},
|
|
{revision: "3384", kb: "4530689"},
|
|
{revision: "3443", kb: "4534271"},
|
|
{revision: "3474", kb: "4534307"},
|
|
{revision: "3504", kb: "4537764"},
|
|
{revision: "3542", kb: "4537806"},
|
|
{revision: "3564", kb: "4540670"},
|
|
{revision: "3595", kb: "4541329"},
|
|
{revision: "3630", kb: "4550929"},
|
|
{revision: "3659", kb: "4550947"},
|
|
{revision: "3686", kb: "4556813"},
|
|
{revision: "3750", kb: "4561616"},
|
|
{revision: "3755", kb: "4567517"},
|
|
{revision: "3808", kb: "4565511"},
|
|
{revision: "3866", kb: "4571694"},
|
|
{revision: "3930", kb: "4577015"},
|
|
{revision: "3986", kb: "4580346"},
|
|
{revision: "4046", kb: "4586830"},
|
|
{revision: "4048", kb: "4594441"},
|
|
{revision: "4104", kb: "4593226"},
|
|
{revision: "4169", kb: "4598243"},
|
|
{revision: "4225", kb: "4601318"},
|
|
{revision: "4283", kb: "5000803"},
|
|
{revision: "4288", kb: "5001633"},
|
|
{revision: "4350", kb: "5001347"},
|
|
{revision: "4402", kb: "5003197"},
|
|
{revision: "4467", kb: "5003638"},
|
|
{revision: "4470", kb: "5004948"},
|
|
{revision: "4530", kb: "5004238"},
|
|
{revision: "4532", kb: "5005393"},
|
|
{revision: "4583", kb: "5005043"},
|
|
{revision: "4651", kb: "5005573"},
|
|
{revision: "4704", kb: "5006669"},
|
|
{revision: "4770", kb: "5007192"},
|
|
{revision: "4771", kb: "5008601"},
|
|
{revision: "4825", kb: "5008207"},
|
|
{revision: "4827", kb: "5010195"},
|
|
{revision: "4886", kb: "5009546"},
|
|
{revision: "4889", kb: "5010790"},
|
|
{revision: "4946", kb: "5010359"},
|
|
{revision: "5006", kb: "5011495"},
|
|
{revision: "5066", kb: "5012596"},
|
|
{revision: "5125", kb: "5013952"},
|
|
{revision: "5127", kb: "5015019"},
|
|
{revision: "5192", kb: "5014702"},
|
|
{revision: "5246", kb: "5015808"},
|
|
{revision: "5291", kb: "5016622"},
|
|
{revision: "5356", kb: "5017305"},
|
|
{revision: "5427", kb: "5018411"},
|
|
{revision: "5429", kb: "5020439"},
|
|
{revision: "5501", kb: "5019964"},
|
|
{revision: "5502", kb: "5021654"},
|
|
{revision: "5582", kb: "5021235"},
|
|
{revision: "5648", kb: "5022289"},
|
|
{revision: "5717", kb: "5022838"},
|
|
{revision: "5786", kb: "5023697"},
|
|
{revision: "5850", kb: "5025228"},
|
|
{revision: "5921", kb: "5026363"},
|
|
{revision: "5989", kb: "5027219"},
|
|
{revision: "5996", kb: "5028623"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-83aa43c0-82e0-92d8-1580-10642c9ed612
|
|
"15063": {
|
|
rollup: []windowsRelease{
|
|
{revision: "13", kb: "4016251"},
|
|
{revision: "138", kb: "4015583"},
|
|
{revision: "250", kb: "4016240"},
|
|
{revision: "296", kb: "4016871"},
|
|
{revision: "297", kb: "4016871"},
|
|
{revision: "332", kb: "4020102"},
|
|
{revision: "413", kb: "4022725"},
|
|
{revision: "414", kb: "4022725"},
|
|
{revision: "447", kb: "4022716"},
|
|
{revision: "483", kb: "4025342"},
|
|
{revision: "502", kb: "4032188"},
|
|
{revision: "540", kb: "4034674"},
|
|
{revision: "608", kb: "4038788"},
|
|
{revision: "632", kb: "4040724"},
|
|
{revision: "674", kb: "4041676"},
|
|
{revision: "675", kb: "4049370"},
|
|
{revision: "726", kb: "4048954"},
|
|
{revision: "728", kb: "4048954"},
|
|
{revision: "729", kb: "4055254"},
|
|
{revision: "786", kb: "4053580"},
|
|
{revision: "850", kb: "4056891"},
|
|
{revision: "877", kb: "4057144"},
|
|
{revision: "909", kb: "4074592"},
|
|
{revision: "936", kb: "4077528"},
|
|
{revision: "936", kb: "4092077"},
|
|
{revision: "966", kb: "4088782"},
|
|
{revision: "968", kb: "4088782"},
|
|
{revision: "994", kb: "4088891"},
|
|
{revision: "1029", kb: "4093107"},
|
|
{revision: "1058", kb: "4093117"},
|
|
{revision: "1088", kb: "4103731"},
|
|
{revision: "1112", kb: "4103722"},
|
|
{revision: "1155", kb: "4284874"},
|
|
{revision: "1182", kb: "4284830"},
|
|
{revision: "1206", kb: "4338826"},
|
|
{revision: "1209", kb: "4345419"},
|
|
{revision: "1235", kb: "4338827"},
|
|
{revision: "1266", kb: "4343885"},
|
|
{revision: "1292", kb: "4343889"},
|
|
{revision: "1324", kb: "4457138"},
|
|
{revision: "1356", kb: "4457141"},
|
|
{revision: "1358", kb: "4457141"},
|
|
{revision: "1387", kb: "4462937"},
|
|
{revision: "1418", kb: "4462939"},
|
|
{revision: "1446", kb: "4467696"},
|
|
{revision: "1478", kb: "4467699"},
|
|
{revision: "1506", kb: "4471327"},
|
|
{revision: "1508", kb: "4483230"},
|
|
{revision: "1563", kb: "4480973"},
|
|
{revision: "1596", kb: "4480959"},
|
|
{revision: "1631", kb: "4487020"},
|
|
{revision: "1659", kb: "4487011"},
|
|
{revision: "1689", kb: "4489871"},
|
|
{revision: "1716", kb: "4489888"},
|
|
{revision: "1746", kb: "4493474"},
|
|
{revision: "1784", kb: "4493436"},
|
|
{revision: "1785", kb: "4502112"},
|
|
{revision: "1805", kb: "4499181"},
|
|
{revision: "1808", kb: "4505055"},
|
|
{revision: "1839", kb: "4499162"},
|
|
{revision: "1868", kb: "4503279"},
|
|
{revision: "1897", kb: "4503289"},
|
|
{revision: "1898", kb: "4509476"},
|
|
{revision: "1928", kb: "4507450"},
|
|
{revision: "1955", kb: "4507467"},
|
|
{revision: "1988", kb: "4512507"},
|
|
{revision: "2021", kb: "4512474"},
|
|
{revision: "2045", kb: "4516068"},
|
|
{revision: "2046", kb: "4522011"},
|
|
{revision: "2078", kb: "4516059"},
|
|
{revision: "2079", kb: "4524151"},
|
|
{revision: "2108", kb: "4520010"},
|
|
{revision: "2172", kb: "4525245"},
|
|
{revision: "2224", kb: "4530711"},
|
|
{revision: "2254", kb: "4534296"},
|
|
{revision: "2284", kb: "4537765"},
|
|
{revision: "2313", kb: "4540705"},
|
|
{revision: "2346", kb: "4550939"},
|
|
{revision: "2375", kb: "4556804"},
|
|
{revision: "2409", kb: "4561605"},
|
|
{revision: "2411", kb: "4567516"},
|
|
{revision: "2439", kb: "4565499"},
|
|
{revision: "2467", kb: "4571689"},
|
|
{revision: "2500", kb: "4577021"},
|
|
{revision: "2525", kb: "4580370"},
|
|
{revision: "2554", kb: "4586782"},
|
|
{revision: "2584", kb: "4592473"},
|
|
{revision: "2614", kb: "4599208"},
|
|
{revision: "2642", kb: "4601330"},
|
|
{revision: "2679", kb: "5000812"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-update-history-8e779ac1-e840-d3b8-524e-91037bf7645a
|
|
"16299": {
|
|
rollup: []windowsRelease{
|
|
{revision: "19", kb: "4043961"},
|
|
{revision: "64", kb: "4048955"},
|
|
{revision: "98", kb: "4051963"},
|
|
{revision: "125", kb: "4054517"},
|
|
{revision: "192", kb: "4056892"},
|
|
{revision: "194", kb: "4073290"},
|
|
{revision: "201", kb: "4073291"},
|
|
{revision: "214", kb: "4058258"},
|
|
{revision: "248", kb: "4074588"},
|
|
{revision: "251", kb: "4090913"},
|
|
{revision: "309", kb: "4088776"},
|
|
{revision: "334", kb: "4089848"},
|
|
{revision: "371", kb: "4093112"},
|
|
{revision: "402", kb: "4093105"},
|
|
{revision: "431", kb: "4103727"},
|
|
{revision: "461", kb: "4103714"},
|
|
{revision: "492", kb: "4284819"},
|
|
{revision: "522", kb: "4284822"},
|
|
{revision: "547", kb: "4338825"},
|
|
{revision: "551", kb: "4345420"},
|
|
{revision: "579", kb: "4338817"},
|
|
{revision: "611", kb: "4343897"},
|
|
{revision: "637", kb: "4343893"},
|
|
{revision: "665", kb: "4457142"},
|
|
{revision: "666", kb: "4464217"},
|
|
{revision: "699", kb: "4457136"},
|
|
{revision: "726", kb: "4462918"},
|
|
{revision: "755", kb: "4462932"},
|
|
{revision: "785", kb: "4467686"},
|
|
{revision: "820", kb: "4467681"},
|
|
{revision: "846", kb: "4471329"},
|
|
{revision: "847", kb: "4483232"},
|
|
{revision: "904", kb: "4480978"},
|
|
{revision: "936", kb: "4480967"},
|
|
{revision: "967", kb: "4486996"},
|
|
{revision: "1004", kb: "4487021"},
|
|
{revision: "1029", kb: "4489886"},
|
|
{revision: "1059", kb: "4489890"},
|
|
{revision: "1087", kb: "4493441"},
|
|
{revision: "1127", kb: "4493440"},
|
|
{revision: "1146", kb: "4499179"},
|
|
{revision: "1150", kb: "4505062"},
|
|
{revision: "1182", kb: "4499147"},
|
|
{revision: "1217", kb: "4503284"},
|
|
{revision: "1237", kb: "4503281"},
|
|
{revision: "1239", kb: "4509477"},
|
|
{revision: "1268", kb: "4507455"},
|
|
{revision: "1296", kb: "4507465"},
|
|
{revision: "1331", kb: "4512516"},
|
|
{revision: "1365", kb: "4512494"},
|
|
{revision: "1387", kb: "4516066"},
|
|
{revision: "1392", kb: "4522012"},
|
|
{revision: "1420", kb: "4516071"},
|
|
{revision: "1421", kb: "4524150"},
|
|
{revision: "1451", kb: "4520004"},
|
|
{revision: "1481", kb: "4520006"},
|
|
{revision: "1508", kb: "4525241"},
|
|
{revision: "1565", kb: "4530714"},
|
|
{revision: "1625", kb: "4534276"},
|
|
{revision: "1654", kb: "4534318"},
|
|
{revision: "1686", kb: "4537789"},
|
|
{revision: "1717", kb: "4537816"},
|
|
{revision: "1747", kb: "4540681"},
|
|
{revision: "1775", kb: "4541330"},
|
|
{revision: "1776", kb: "4554342"},
|
|
{revision: "1806", kb: "4550927"},
|
|
{revision: "1868", kb: "4556812"},
|
|
{revision: "1932", kb: "4561602"},
|
|
{revision: "1937", kb: "4567515"},
|
|
{revision: "1992", kb: "4565508"},
|
|
{revision: "2045", kb: "4571741"},
|
|
{revision: "2107", kb: "4577041"},
|
|
{revision: "2166", kb: "4580328"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-0d8c2da6-3dba-66e4-2ef2-059192bf7869
|
|
"17134": {
|
|
rollup: []windowsRelease{
|
|
{revision: "48", kb: "4103721"},
|
|
{revision: "81", kb: "4100403"},
|
|
{revision: "83", kb: "4338548"},
|
|
{revision: "112", kb: "4284835"},
|
|
{revision: "137", kb: "4284848"},
|
|
{revision: "165", kb: "4338819"},
|
|
{revision: "167", kb: "4345421"},
|
|
{revision: "191", kb: "4340917"},
|
|
{revision: "228", kb: "4343909"},
|
|
{revision: "254", kb: "4346783"},
|
|
{revision: "285", kb: "4457128"},
|
|
{revision: "286", kb: "4464218"},
|
|
{revision: "320", kb: "4458469"},
|
|
{revision: "345", kb: "4462919"},
|
|
{revision: "376", kb: "4462933"},
|
|
{revision: "407", kb: "4467702"},
|
|
{revision: "441", kb: "4467682"},
|
|
{revision: "471", kb: "4471324"},
|
|
{revision: "472", kb: "4483234"},
|
|
{revision: "523", kb: "4480966"},
|
|
{revision: "556", kb: "4480976"},
|
|
{revision: "590", kb: "4487017"},
|
|
{revision: "619", kb: "4487029"},
|
|
{revision: "648", kb: "4489868"},
|
|
{revision: "677", kb: "4489894"},
|
|
{revision: "706", kb: "4493464"},
|
|
{revision: "753", kb: "4493437"},
|
|
{revision: "765", kb: "4499167"},
|
|
{revision: "766", kb: "4505064"},
|
|
{revision: "799", kb: "4499183"},
|
|
{revision: "829", kb: "4503286"},
|
|
{revision: "858", kb: "4503288"},
|
|
{revision: "860", kb: "4509478"},
|
|
{revision: "885", kb: "4507435"},
|
|
{revision: "915", kb: "4507466"},
|
|
{revision: "950", kb: "4512501"},
|
|
{revision: "984", kb: "4512509"},
|
|
{revision: "1006", kb: "4516058"},
|
|
{revision: "1009", kb: "4522014"},
|
|
{revision: "1039", kb: "4516045"},
|
|
{revision: "1040", kb: "4524149"},
|
|
{revision: "1069", kb: "4520008"},
|
|
{revision: "1099", kb: "4519978"},
|
|
{revision: "1130", kb: "4525237"},
|
|
{revision: "1184", kb: "4530717"},
|
|
{revision: "1246", kb: "4534293"},
|
|
{revision: "1276", kb: "4534308"},
|
|
{revision: "1304", kb: "4537762"},
|
|
{revision: "1345", kb: "4537795"},
|
|
{revision: "1365", kb: "4540689"},
|
|
{revision: "1399", kb: "4541333"},
|
|
{revision: "1401", kb: "4554349"},
|
|
{revision: "1425", kb: "4550922"},
|
|
{revision: "1456", kb: "4550944"},
|
|
{revision: "1488", kb: "4556807"},
|
|
{revision: "1550", kb: "4561621"},
|
|
{revision: "1553", kb: "4567514"},
|
|
{revision: "1610", kb: "4565489"},
|
|
{revision: "1667", kb: "4571709"},
|
|
{revision: "1726", kb: "4577032"},
|
|
{revision: "1792", kb: "4580330"},
|
|
{revision: "1845", kb: "4586785"},
|
|
{revision: "1902", kb: "4592446"},
|
|
{revision: "1967", kb: "4598245"},
|
|
{revision: "2026", kb: "4601354"},
|
|
{revision: "2087", kb: "5000809"},
|
|
{revision: "2088", kb: "5001565"},
|
|
{revision: "2090", kb: "5001634"},
|
|
{revision: "2145", kb: "5001339"},
|
|
{revision: "2208", kb: "5003174"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-2019-update-history-725fc2e1-4443-6831-a5ca-51ff5cbcb059
|
|
"17763": {
|
|
rollup: []windowsRelease{
|
|
{revision: "1", kb: ""},
|
|
{revision: "55", kb: "4464330"},
|
|
{revision: "107", kb: "4464455"},
|
|
{revision: "134", kb: "4467708"},
|
|
{revision: "168", kb: "4469342"},
|
|
{revision: "194", kb: "4471332"},
|
|
{revision: "195", kb: "4483235"},
|
|
{revision: "253", kb: "4480116"},
|
|
{revision: "292", kb: "4476976"},
|
|
{revision: "316", kb: "4487044"},
|
|
{revision: "348", kb: "4482887"},
|
|
{revision: "379", kb: "4489899"},
|
|
{revision: "402", kb: "4490481"},
|
|
{revision: "404", kb: "4490481"},
|
|
{revision: "437", kb: "4493509"},
|
|
{revision: "439", kb: "4501835"},
|
|
{revision: "475", kb: "4495667"},
|
|
{revision: "503", kb: "4494441"},
|
|
{revision: "504", kb: "4505056"},
|
|
{revision: "529", kb: "4497934"},
|
|
{revision: "557", kb: "4503327"},
|
|
{revision: "592", kb: "4501371"},
|
|
{revision: "593", kb: "4509479"},
|
|
{revision: "615", kb: "4507469"},
|
|
{revision: "652", kb: "4505658"},
|
|
{revision: "678", kb: "4511553"},
|
|
{revision: "720", kb: "4512534"},
|
|
{revision: "737", kb: "4512578"},
|
|
{revision: "740", kb: "4522015"},
|
|
{revision: "774", kb: "4516077"},
|
|
{revision: "775", kb: "4524148"},
|
|
{revision: "805", kb: "4519338"},
|
|
{revision: "832", kb: "4520062"},
|
|
{revision: "864", kb: "4523205"},
|
|
{revision: "914", kb: "4530715"},
|
|
{revision: "973", kb: "4534273"},
|
|
{revision: "1012", kb: "4534321"},
|
|
{revision: "1039", kb: "4532691"},
|
|
{revision: "1075", kb: "4537818"},
|
|
{revision: "1098", kb: "4538461"},
|
|
{revision: "1131", kb: "4541331"},
|
|
{revision: "1132", kb: "4554354"},
|
|
{revision: "1158", kb: "4549949"},
|
|
{revision: "1192", kb: "4550969"},
|
|
{revision: "1217", kb: "4551853"},
|
|
{revision: "1282", kb: "4561608"},
|
|
{revision: "1294", kb: "4567513"},
|
|
{revision: "1339", kb: "4558998"},
|
|
{revision: "1369", kb: "4559003"},
|
|
{revision: "1397", kb: "4565349"},
|
|
{revision: "1432", kb: "4571748"},
|
|
{revision: "1457", kb: "4570333"},
|
|
{revision: "1490", kb: "4577069"},
|
|
{revision: "1518", kb: "4577668"},
|
|
{revision: "1554", kb: "4580390"},
|
|
{revision: "1577", kb: "4586793"},
|
|
{revision: "1579", kb: "4594442"},
|
|
{revision: "1613", kb: "4586839"},
|
|
{revision: "1637", kb: "4592440"},
|
|
{revision: "1697", kb: "4598230"},
|
|
{revision: "1728", kb: "4598296"},
|
|
{revision: "1757", kb: "4601345"},
|
|
{revision: "1790", kb: "4601383"},
|
|
{revision: "1817", kb: "5000822"},
|
|
{revision: "1821", kb: "5001568"},
|
|
{revision: "1823", kb: "5001638"},
|
|
{revision: "1852", kb: "5000854"},
|
|
{revision: "1879", kb: "5001342"},
|
|
{revision: "1911", kb: "5001384"},
|
|
{revision: "1935", kb: "5003171"},
|
|
{revision: "1971", kb: "5003217"},
|
|
{revision: "1999", kb: "5003646"},
|
|
{revision: "2028", kb: "5003703"},
|
|
{revision: "2029", kb: "5004947"},
|
|
{revision: "2061", kb: "5004244"},
|
|
{revision: "2090", kb: "5004308"},
|
|
{revision: "2091", kb: "5005394"},
|
|
{revision: "2114", kb: "5005030"},
|
|
{revision: "2145", kb: "5005102"},
|
|
{revision: "2183", kb: "5005568"},
|
|
{revision: "2210", kb: "5005625"},
|
|
{revision: "2213", kb: "5005625"},
|
|
{revision: "2237", kb: "5006672"},
|
|
{revision: "2268", kb: "5006744"},
|
|
{revision: "2300", kb: "5007206"},
|
|
{revision: "2305", kb: "5008602"},
|
|
{revision: "2330", kb: "5007266"},
|
|
{revision: "2366", kb: "5008218"},
|
|
{revision: "2369", kb: "5010196"},
|
|
{revision: "2452", kb: "5009557"},
|
|
{revision: "2458", kb: "5010791"},
|
|
{revision: "2510", kb: "5009616"},
|
|
{revision: "2565", kb: "5010351"},
|
|
{revision: "2628", kb: "5010427"},
|
|
{revision: "2686", kb: "5011503"},
|
|
{revision: "2746", kb: "5011551"},
|
|
{revision: "2803", kb: "5012647"},
|
|
{revision: "2867", kb: "5012636"},
|
|
{revision: "2928", kb: "5013941"},
|
|
{revision: "2931", kb: "5015018"},
|
|
{revision: "2989", kb: "5014022"},
|
|
{revision: "3046", kb: "5014692"},
|
|
{revision: "3113", kb: "5014669"},
|
|
{revision: "3165", kb: "5015811"},
|
|
{revision: "3232", kb: "5015880"},
|
|
{revision: "3287", kb: "5016623"},
|
|
{revision: "3346", kb: "5016690"},
|
|
{revision: "3406", kb: "5017315"},
|
|
{revision: "3469", kb: "5017379"},
|
|
{revision: "3532", kb: "5018419"},
|
|
{revision: "3534", kb: "5020438"},
|
|
{revision: "3650", kb: "5019966"},
|
|
{revision: "3653", kb: "5021655"},
|
|
{revision: "3770", kb: "5021237"},
|
|
{revision: "3772", kb: "5022554"},
|
|
{revision: "3887", kb: "5022286"},
|
|
{revision: "4010", kb: "5022840"},
|
|
{revision: "4131", kb: "5023702"},
|
|
{revision: "4252", kb: "5025229"},
|
|
{revision: "4377", kb: "5026362"},
|
|
{revision: "4499", kb: "5027222"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-e6058e7c-4116-38f1-b984-4fcacfba5e5d
|
|
"18362": {
|
|
rollup: []windowsRelease{
|
|
{revision: "116", kb: "4505057"},
|
|
{revision: "145", kb: "4497935"},
|
|
{revision: "175", kb: "4503293"},
|
|
{revision: "207", kb: "4501375"},
|
|
{revision: "239", kb: "4507453"},
|
|
{revision: "267", kb: "4505903"},
|
|
{revision: "295", kb: "4512508"},
|
|
{revision: "329", kb: "4512941"},
|
|
{revision: "356", kb: "4515384"},
|
|
{revision: "357", kb: "4522016"},
|
|
{revision: "387", kb: "4517211"},
|
|
{revision: "388", kb: "4524147"},
|
|
{revision: "418", kb: "4517389"},
|
|
{revision: "449", kb: "4522355"},
|
|
{revision: "476", kb: "4524570"},
|
|
{revision: "535", kb: "4530684"},
|
|
{revision: "592", kb: "4528760"},
|
|
{revision: "628", kb: "4532695"},
|
|
{revision: "657", kb: "4532693"},
|
|
{revision: "693", kb: "4535996"},
|
|
{revision: "719", kb: "4540673"},
|
|
{revision: "720", kb: "4551762"},
|
|
{revision: "752", kb: "4541335"},
|
|
{revision: "753", kb: "4554364"},
|
|
{revision: "778", kb: "4549951"},
|
|
{revision: "815", kb: "4550945"},
|
|
{revision: "836", kb: "4556799"},
|
|
{revision: "900", kb: "4560960"},
|
|
{revision: "904", kb: "4567512"},
|
|
{revision: "959", kb: "4565483"},
|
|
{revision: "997", kb: "4559004"},
|
|
{revision: "1016", kb: "4565351"},
|
|
{revision: "1049", kb: "4566116"},
|
|
{revision: "1082", kb: "4574727"},
|
|
{revision: "1110", kb: "4577062"},
|
|
{revision: "1139", kb: "4577671"},
|
|
{revision: "1171", kb: "4580386"},
|
|
{revision: "1198", kb: "4586786"},
|
|
{revision: "1199", kb: "4594443"},
|
|
{revision: "1237", kb: "4586819"},
|
|
{revision: "1256", kb: "4592449"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-53c270dc-954f-41f7-7ced-488578904dfe
|
|
"18363": {
|
|
rollup: []windowsRelease{
|
|
{revision: "476", kb: "4524570"},
|
|
{revision: "535", kb: "4530684"},
|
|
{revision: "592", kb: "4528760"},
|
|
{revision: "628", kb: "4532695"},
|
|
{revision: "657", kb: "4532693"},
|
|
{revision: "693", kb: "4535996"},
|
|
{revision: "719", kb: "4540673"},
|
|
{revision: "720", kb: "4551762"},
|
|
{revision: "752", kb: "4541335"},
|
|
{revision: "753", kb: "4554364"},
|
|
{revision: "778", kb: "4549951"},
|
|
{revision: "815", kb: "4550945"},
|
|
{revision: "836", kb: "4556799"},
|
|
{revision: "900", kb: "4560960"},
|
|
{revision: "904", kb: "4567512"},
|
|
{revision: "959", kb: "4565483"},
|
|
{revision: "997", kb: "4559004"},
|
|
{revision: "1016", kb: "4565351"},
|
|
{revision: "1049", kb: "4566116"},
|
|
{revision: "1082", kb: "4574727"},
|
|
{revision: "1110", kb: "4577062"},
|
|
{revision: "1139", kb: "4577671"},
|
|
{revision: "1171", kb: "4580386"},
|
|
{revision: "1198", kb: "4586786"},
|
|
{revision: "1199", kb: "4594443"},
|
|
{revision: "1237", kb: "4586819"},
|
|
{revision: "1256", kb: "4592449"},
|
|
{revision: "1316", kb: "4598229"},
|
|
{revision: "1350", kb: "4598298"},
|
|
{revision: "1377", kb: "4601315"},
|
|
{revision: "1379", kb: "5001028"},
|
|
{revision: "1411", kb: "4601380"},
|
|
{revision: "1440", kb: "5000808"},
|
|
{revision: "1441", kb: "5001566"},
|
|
{revision: "1443", kb: "5001648"},
|
|
{revision: "1474", kb: "5000850"},
|
|
{revision: "1500", kb: "5001337"},
|
|
{revision: "1533", kb: "5001396"},
|
|
{revision: "1556", kb: "5003169"},
|
|
{revision: "1593", kb: "5003212"},
|
|
{revision: "1621", kb: "5003635"},
|
|
{revision: "1645", kb: "5003698"},
|
|
{revision: "1646", kb: "5004946"},
|
|
{revision: "1679", kb: "5004245"},
|
|
{revision: "1714", kb: "5004293"},
|
|
{revision: "1734", kb: "5005031"},
|
|
{revision: "1766", kb: "5005103"},
|
|
{revision: "1801", kb: "5005566"},
|
|
{revision: "1830", kb: "5005624"},
|
|
{revision: "1832", kb: "5005624"},
|
|
{revision: "1854", kb: "5006667"},
|
|
{revision: "1916", kb: "5007189"},
|
|
{revision: "1977", kb: "5008206"},
|
|
{revision: "2037", kb: "5009545"},
|
|
{revision: "2039", kb: "5010792"},
|
|
{revision: "2094", kb: "5010345"},
|
|
{revision: "2158", kb: "5011485"},
|
|
{revision: "2212", kb: "5012591"},
|
|
{revision: "2274", kb: "5013945"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-24ea91f4-36e7-d8fd-0ddb-d79d9d0cdbda
|
|
"19041": {
|
|
rollup: []windowsRelease{
|
|
{revision: "264", kb: ""},
|
|
{revision: "329", kb: "4557957"},
|
|
{revision: "331", kb: "4567523"},
|
|
{revision: "388", kb: "4565503"},
|
|
{revision: "423", kb: "4568831"},
|
|
{revision: "450", kb: "4566782"},
|
|
{revision: "488", kb: "4571744"},
|
|
{revision: "508", kb: "4571756"},
|
|
{revision: "546", kb: "4577063"},
|
|
{revision: "572", kb: "4579311"},
|
|
{revision: "610", kb: "4580364"},
|
|
{revision: "630", kb: "4586781"},
|
|
{revision: "631", kb: "4594440"},
|
|
{revision: "662", kb: "4586853"},
|
|
{revision: "685", kb: "4592438"},
|
|
{revision: "746", kb: "4598242"},
|
|
{revision: "789", kb: "4598291"},
|
|
{revision: "804", kb: "4601319"},
|
|
{revision: "844", kb: "4601382"},
|
|
{revision: "867", kb: "5000802"},
|
|
{revision: "868", kb: "5001567"},
|
|
{revision: "870", kb: "5001649"},
|
|
{revision: "906", kb: "5000842"},
|
|
{revision: "928", kb: "5001330"},
|
|
{revision: "964", kb: "5001391"},
|
|
{revision: "985", kb: "5003173"},
|
|
{revision: "1023", kb: "5003214"},
|
|
{revision: "1052", kb: "5003637"},
|
|
{revision: "1055", kb: "5004476"},
|
|
{revision: "1081", kb: "5003690"},
|
|
{revision: "1082", kb: "5004760"},
|
|
{revision: "1083", kb: "5004945"},
|
|
{revision: "1110", kb: "5004237"},
|
|
{revision: "1151", kb: "5004296"},
|
|
{revision: "1165", kb: "5005033"},
|
|
{revision: "1202", kb: "5005101"},
|
|
{revision: "1237", kb: "5005565"},
|
|
{revision: "1266", kb: "5005611"},
|
|
{revision: "1288", kb: "5006670"},
|
|
{revision: "1320", kb: "5006738"},
|
|
{revision: "1348", kb: "5007186"},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-7dd3071a-3906-fa2c-c342-f7f86728a6e3
|
|
"19042": {
|
|
rollup: []windowsRelease{
|
|
{revision: "572", kb: ""},
|
|
{revision: "610", kb: "4580364"},
|
|
{revision: "630", kb: "4586781"},
|
|
{revision: "631", kb: "4594440"},
|
|
{revision: "662", kb: "4586853"},
|
|
{revision: "685", kb: "4592438"},
|
|
{revision: "746", kb: "4598242"},
|
|
{revision: "789", kb: "4598291"},
|
|
{revision: "804", kb: "4601319"},
|
|
{revision: "844", kb: "4601382"},
|
|
{revision: "867", kb: "5000802"},
|
|
{revision: "868", kb: "5001567"},
|
|
{revision: "870", kb: "5001649"},
|
|
{revision: "906", kb: "5000842"},
|
|
{revision: "928", kb: "5001330"},
|
|
{revision: "964", kb: "5001391"},
|
|
{revision: "985", kb: "5003173"},
|
|
{revision: "1023", kb: "5003214"},
|
|
{revision: "1052", kb: "5003637"},
|
|
{revision: "1055", kb: "5004476"},
|
|
{revision: "1081", kb: "5003690"},
|
|
{revision: "1082", kb: "5004760"},
|
|
{revision: "1083", kb: "5004945"},
|
|
{revision: "1110", kb: "5004237"},
|
|
{revision: "1151", kb: "5004296"},
|
|
{revision: "1165", kb: "5005033"},
|
|
{revision: "1202", kb: "5005101"},
|
|
{revision: "1237", kb: "5005565"},
|
|
{revision: "1266", kb: "5005611"},
|
|
{revision: "1288", kb: "5006670"},
|
|
{revision: "1320", kb: "5006738"},
|
|
{revision: "1348", kb: "5007186"},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
{revision: "1466", kb: "5009543"},
|
|
{revision: "1469", kb: "5010793"},
|
|
{revision: "1503", kb: "5009596"},
|
|
{revision: "1526", kb: "5010342"},
|
|
{revision: "1566", kb: "5010415"},
|
|
{revision: "1586", kb: "5011487"},
|
|
{revision: "1620", kb: "5011543"},
|
|
{revision: "1645", kb: "5012599"},
|
|
{revision: "1682", kb: "5011831"},
|
|
{revision: "1706", kb: "5013942"},
|
|
{revision: "1708", kb: "5015020"},
|
|
{revision: "1741", kb: "5014023"},
|
|
{revision: "1766", kb: "5014699"},
|
|
{revision: "1767", kb: "5016139"},
|
|
{revision: "1806", kb: "5014666"},
|
|
{revision: "1826", kb: "5015807"},
|
|
{revision: "1865", kb: "5015878"},
|
|
{revision: "1889", kb: "5016616"},
|
|
{revision: "1949", kb: "5016688"},
|
|
{revision: "2006", kb: "5017308"},
|
|
{revision: "2075", kb: "5017380"},
|
|
{revision: "2130", kb: "5018410"},
|
|
{revision: "2132", kb: "5020435"},
|
|
{revision: "2193", kb: "5018482"},
|
|
{revision: "2194", kb: "5020953"},
|
|
{revision: "2251", kb: "5019959"},
|
|
{revision: "2311", kb: "5020030"},
|
|
{revision: "2364", kb: "5021233"},
|
|
{revision: "2486", kb: "5022282"},
|
|
{revision: "2546", kb: "5019275"},
|
|
{revision: "2604", kb: "5022834"},
|
|
{revision: "2673", kb: "5022906"},
|
|
{revision: "2728", kb: "5023696"},
|
|
{revision: "2788", kb: "5023773"},
|
|
{revision: "2846", kb: "5025221"},
|
|
{revision: "2965", kb: "5026361"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-1b6aac92-bf01-42b5-b158-f80c6d93eb11
|
|
"19043": {
|
|
rollup: []windowsRelease{
|
|
{revision: "985", kb: "5003173"},
|
|
{revision: "1023", kb: "5003214"},
|
|
{revision: "1052", kb: "5003637"},
|
|
{revision: "1055", kb: "5004476"},
|
|
{revision: "1081", kb: "5003690"},
|
|
{revision: "1082", kb: "5004760"},
|
|
{revision: "1083", kb: "5004945"},
|
|
{revision: "1110", kb: "5004237"},
|
|
{revision: "1151", kb: "5004296"},
|
|
{revision: "1165", kb: "5005033"},
|
|
{revision: "1202", kb: "5005101"},
|
|
{revision: "1237", kb: "5005565"},
|
|
{revision: "1266", kb: "5005611"},
|
|
{revision: "1288", kb: "5006670"},
|
|
{revision: "1320", kb: "5006738"},
|
|
{revision: "1348", kb: "5007186"},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
{revision: "1466", kb: "5009543"},
|
|
{revision: "1469", kb: "5010793"},
|
|
{revision: "1503", kb: "5009596"},
|
|
{revision: "1526", kb: "5010342"},
|
|
{revision: "1566", kb: "5010415"},
|
|
{revision: "1586", kb: "5011487"},
|
|
{revision: "1620", kb: "5011543"},
|
|
{revision: "1645", kb: "5012599"},
|
|
{revision: "1682", kb: "5011831"},
|
|
{revision: "1706", kb: "5013942"},
|
|
{revision: "1708", kb: "5015020"},
|
|
{revision: "1741", kb: "5014023"},
|
|
{revision: "1766", kb: "5014699"},
|
|
{revision: "1767", kb: "5016139"},
|
|
{revision: "1806", kb: "5014666"},
|
|
{revision: "1826", kb: "5015807"},
|
|
{revision: "1865", kb: "5015878"},
|
|
{revision: "1889", kb: "5016616"},
|
|
{revision: "1949", kb: "5016688"},
|
|
{revision: "2006", kb: "5017308"},
|
|
{revision: "2075", kb: "5017380"},
|
|
{revision: "2130", kb: "5018410"},
|
|
{revision: "2132", kb: "5020435"},
|
|
{revision: "2193", kb: "5018482"},
|
|
{revision: "2194", kb: "5020953"},
|
|
{revision: "2251", kb: "5019959"},
|
|
{revision: "2311", kb: "5020030"},
|
|
{revision: "2364", kb: "5021233"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-857b8ccb-71e4-49e5-b3f6-7073197d98fb
|
|
"19044": {
|
|
rollup: []windowsRelease{
|
|
{revision: "1288", kb: ""},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
{revision: "1466", kb: "5009543"},
|
|
{revision: "1469", kb: "5010793"},
|
|
{revision: "1503", kb: "5009596"},
|
|
{revision: "1526", kb: "5010342"},
|
|
{revision: "1566", kb: "5010415"},
|
|
{revision: "1586", kb: "5011487"},
|
|
{revision: "1620", kb: "5011543"},
|
|
{revision: "1645", kb: "5012599"},
|
|
{revision: "1682", kb: "5011831"},
|
|
{revision: "1706", kb: "5013942"},
|
|
{revision: "1708", kb: "5015020"},
|
|
{revision: "1741", kb: "5014023"},
|
|
{revision: "1766", kb: "5014699"},
|
|
{revision: "1767", kb: "5016139"},
|
|
{revision: "1806", kb: "5014666"},
|
|
{revision: "1826", kb: "5015807"},
|
|
{revision: "1865", kb: "5015878"},
|
|
{revision: "1889", kb: "5016616"},
|
|
{revision: "1949", kb: "5016688"},
|
|
{revision: "2006", kb: "5017308"},
|
|
{revision: "2075", kb: "5017380"},
|
|
{revision: "2130", kb: "5018410"},
|
|
{revision: "2132", kb: "5020435"},
|
|
{revision: "2193", kb: "5018482"},
|
|
{revision: "2194", kb: "5020953"},
|
|
{revision: "2251", kb: "5019959"},
|
|
{revision: "2311", kb: "5020030"},
|
|
{revision: "2364", kb: "5021233"},
|
|
{revision: "2486", kb: "5022282"},
|
|
{revision: "2546", kb: "5019275"},
|
|
{revision: "2604", kb: "5022834"},
|
|
{revision: "2673", kb: "5022906"},
|
|
{revision: "2728", kb: "5023696"},
|
|
{revision: "2788", kb: "5023773"},
|
|
{revision: "2846", kb: "5025221"},
|
|
{revision: "2965", kb: "5026361"},
|
|
{revision: "3086", kb: "5027215"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-8127c2c6-6edf-4fdf-8b9f-0f7be1ef3562
|
|
"19045": {
|
|
rollup: []windowsRelease{
|
|
{revision: "2130", kb: ""},
|
|
{revision: "2194", kb: "5020953"},
|
|
{revision: "2251", kb: "5019959"},
|
|
{revision: "2311", kb: "5020030"},
|
|
{revision: "2364", kb: "5021233"},
|
|
{revision: "2486", kb: "5022282"},
|
|
{revision: "2546", kb: "5019275"},
|
|
{revision: "2604", kb: "5022834"},
|
|
{revision: "2673", kb: "5022906"},
|
|
{revision: "2728", kb: "5023696"},
|
|
{revision: "2788", kb: "5023773"},
|
|
{revision: "2846", kb: "5025221"},
|
|
{revision: "2913", kb: "5025297"},
|
|
{revision: "2965", kb: "5026361"},
|
|
{revision: "3031", kb: "5026435"},
|
|
{revision: "3086", kb: "5027215"},
|
|
{revision: "3155", kb: "5027293"},
|
|
},
|
|
},
|
|
},
|
|
"11": {
|
|
// https://learn.microsoft.com/en-us/windows/release-health/windows11-release-information
|
|
// https://support.microsoft.com/en-us/topic/windows-11-version-21h2-update-history-a19cd327-b57f-44b9-84e0-26ced7109ba9/
|
|
"22000": {
|
|
rollup: []windowsRelease{
|
|
{revision: "194", kb: ""},
|
|
{revision: "258", kb: "5006674"},
|
|
{revision: "282", kb: "5006746"},
|
|
{revision: "318", kb: "5007215"},
|
|
{revision: "348", kb: "5007262"},
|
|
{revision: "376", kb: "5008215"},
|
|
{revision: "434", kb: "5009566"},
|
|
{revision: "438", kb: "5010795"},
|
|
{revision: "469", kb: "5008353"},
|
|
{revision: "493", kb: "5010386"},
|
|
{revision: "527", kb: "5010414"},
|
|
{revision: "556", kb: "5011493"},
|
|
{revision: "593", kb: "5011563"},
|
|
{revision: "613", kb: "5012592"},
|
|
{revision: "652", kb: "5012643"},
|
|
{revision: "675", kb: "5013943"},
|
|
{revision: "708", kb: "5014019"},
|
|
{revision: "739", kb: "5014697"},
|
|
{revision: "740", kb: "5016138"},
|
|
{revision: "778", kb: "5014668"},
|
|
{revision: "795", kb: "5015814"},
|
|
{revision: "832", kb: "5015882"},
|
|
{revision: "856", kb: "5016629"},
|
|
{revision: "918", kb: "5016691"},
|
|
{revision: "978", kb: "5017328"},
|
|
{revision: "1042", kb: "5017383"},
|
|
{revision: "1098", kb: "5018418"},
|
|
{revision: "1100", kb: "5020387"},
|
|
{revision: "1165", kb: "5018483"},
|
|
{revision: "1219", kb: "5019961"},
|
|
{revision: "1281", kb: "5019157"},
|
|
{revision: "1335", kb: "5021234"},
|
|
{revision: "1455", kb: "5022287"},
|
|
{revision: "1516", kb: "5019274"},
|
|
{revision: "1574", kb: "5022836"},
|
|
{revision: "1641", kb: "5022905"},
|
|
{revision: "1696", kb: "5023698"},
|
|
{revision: "1761", kb: "5023774"},
|
|
{revision: "1817", kb: "5025224"},
|
|
{revision: "1880", kb: "5025298"},
|
|
{revision: "1936", kb: "5026368"},
|
|
{revision: "2003", kb: "5026436"},
|
|
{revision: "2057", kb: "5027223"},
|
|
{revision: "2124", kb: "5027292"},
|
|
},
|
|
},
|
|
// https://support.microsoft.com/en-us/topic/windows-11-version-22h2-update-history-ec4229c3-9c5f-4e75-9d6d-9025ab70fcce
|
|
"22621": {
|
|
rollup: []windowsRelease{
|
|
{revision: "521", kb: ""},
|
|
{revision: "525", kb: "5019311"},
|
|
{revision: "608", kb: "5017389"},
|
|
{revision: "674", kb: "5018427"},
|
|
{revision: "675", kb: "5019509"},
|
|
{revision: "755", kb: "5018496"},
|
|
{revision: "819", kb: "5019980"},
|
|
{revision: "900", kb: "5020044"},
|
|
{revision: "963", kb: "5021255"},
|
|
{revision: "1105", kb: "5022303"},
|
|
{revision: "1194", kb: "5022360"},
|
|
{revision: "1265", kb: "5022845"},
|
|
{revision: "1344", kb: "5022913"},
|
|
{revision: "1413", kb: "5023706"},
|
|
{revision: "1485", kb: "5023778"},
|
|
{revision: "1555", kb: "5025239"},
|
|
{revision: "1635", kb: "5025305"},
|
|
{revision: "1702", kb: "5026372"},
|
|
{revision: "1778", kb: "5026446"},
|
|
{revision: "1848", kb: "5027231"},
|
|
{revision: "1928", kb: "5027303"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"Server": {
|
|
"2008": {
|
|
// https://support.microsoft.com/en-us/topic/windows-server-2008-sp2-update-history-9197740a-7430-f69f-19ff-4998a4e8b25b
|
|
"SP2": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "4458010"},
|
|
{revision: "", kb: "4458315"},
|
|
{revision: "", kb: "4463097"},
|
|
{revision: "", kb: "4463105"},
|
|
{revision: "", kb: "4467706"},
|
|
{revision: "", kb: "4467687"},
|
|
{revision: "", kb: "4471325"},
|
|
{revision: "", kb: "4480968"},
|
|
{revision: "", kb: "4480974"},
|
|
{revision: "", kb: "4487023"},
|
|
{revision: "", kb: "4487022"},
|
|
{revision: "", kb: "4489880"},
|
|
{revision: "", kb: "4489887"},
|
|
{revision: "", kb: "4493471"},
|
|
{revision: "", kb: "4493460"},
|
|
{revision: "", kb: "4499149"},
|
|
{revision: "", kb: "4499184"},
|
|
{revision: "", kb: "4503273"},
|
|
{revision: "", kb: "4503271"},
|
|
{revision: "", kb: "4507452"},
|
|
{revision: "", kb: "4507451"},
|
|
{revision: "", kb: "4512476"},
|
|
{revision: "", kb: "4512499"},
|
|
{revision: "", kb: "4516026"},
|
|
{revision: "", kb: "4516030"},
|
|
{revision: "", kb: "4520002"},
|
|
{revision: "", kb: "4520015"},
|
|
{revision: "", kb: "4525234"},
|
|
{revision: "", kb: "4525244"},
|
|
{revision: "", kb: "4530695"},
|
|
{revision: "", kb: "4534303"},
|
|
{revision: "", kb: "4537810"},
|
|
{revision: "", kb: "4541506"},
|
|
{revision: "", kb: "4550951"},
|
|
{revision: "", kb: "4556860"},
|
|
{revision: "", kb: "4561670"},
|
|
{revision: "", kb: "4565536"},
|
|
{revision: "", kb: "4571730"},
|
|
{revision: "", kb: "4577064"},
|
|
{revision: "", kb: "4580378"},
|
|
{revision: "", kb: "4586807"},
|
|
{revision: "", kb: "4592498"},
|
|
{revision: "", kb: "4598288"},
|
|
{revision: "", kb: "4601360"},
|
|
{revision: "", kb: "5000844"},
|
|
{revision: "", kb: "5001389"},
|
|
{revision: "", kb: "5003210"},
|
|
{revision: "", kb: "5003661"},
|
|
{revision: "", kb: "5004955"},
|
|
{revision: "", kb: "5004305"},
|
|
{revision: "", kb: "5005090"},
|
|
{revision: "", kb: "5005606"},
|
|
{revision: "", kb: "5006736"},
|
|
{revision: "", kb: "5007263"},
|
|
{revision: "", kb: "5008274"},
|
|
{revision: "", kb: "5009627"},
|
|
{revision: "", kb: "5010384"},
|
|
{revision: "", kb: "5011534"},
|
|
{revision: "", kb: "5012658"},
|
|
{revision: "", kb: "5014010"},
|
|
{revision: "", kb: "5014752"},
|
|
{revision: "", kb: "5015866"},
|
|
{revision: "", kb: "5016669"},
|
|
{revision: "", kb: "5017358"},
|
|
{revision: "", kb: "5018450"},
|
|
{revision: "", kb: "5020019"},
|
|
{revision: "", kb: "5021289"},
|
|
{revision: "", kb: "5022340"},
|
|
{revision: "", kb: "5022890"},
|
|
{revision: "", kb: "5023755"},
|
|
{revision: "", kb: "5025271"},
|
|
{revision: "", kb: "5026408"},
|
|
{revision: "", kb: "5027279"},
|
|
},
|
|
securityOnly: []string{
|
|
"4457984",
|
|
"4463104",
|
|
"4467700",
|
|
"4471319",
|
|
"4480957",
|
|
"4487019",
|
|
"4489876",
|
|
"4493458",
|
|
"4499180",
|
|
"4503287",
|
|
"4507461",
|
|
"4512491",
|
|
"4516051",
|
|
"4520009",
|
|
"4525239",
|
|
"4530719",
|
|
"4534312",
|
|
"4537822",
|
|
"4541504",
|
|
"4550957",
|
|
"4556854",
|
|
"4561645",
|
|
"4565529",
|
|
"4571746",
|
|
"4577070",
|
|
"4580385",
|
|
"4586817",
|
|
"4592504",
|
|
"4598287",
|
|
"4601366",
|
|
"5000856",
|
|
"5001332",
|
|
"5003225",
|
|
"5003695",
|
|
"5004959",
|
|
"5004299",
|
|
"5005095",
|
|
"5005618",
|
|
"5006715",
|
|
"5007246",
|
|
"5008271",
|
|
"5009601",
|
|
"5010403",
|
|
"5011525",
|
|
"5012632",
|
|
"5014006",
|
|
"5014743",
|
|
"5015870",
|
|
"5016686",
|
|
"5017371",
|
|
"5018446",
|
|
"5020005",
|
|
"5021293",
|
|
"5022353",
|
|
"5022893",
|
|
"5023754",
|
|
"5025273",
|
|
"5026427",
|
|
"5027277",
|
|
},
|
|
},
|
|
},
|
|
"2008 R2": {
|
|
// https://support.microsoft.com/en-us/topic/windows-7-sp1-and-windows-server-2008-r2-sp1-update-history-720c2590-fd58-26ba-16cc-6d8f3b547599
|
|
"SP1": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "3172605"},
|
|
{revision: "", kb: "3179573"},
|
|
{revision: "", kb: "3185278"},
|
|
{revision: "", kb: "3185330"},
|
|
{revision: "", kb: "3192403"},
|
|
{revision: "", kb: "3197868"},
|
|
{revision: "", kb: "3197869"},
|
|
{revision: "", kb: "3207752"},
|
|
{revision: "", kb: "3212646"},
|
|
{revision: "", kb: "4012215"},
|
|
{revision: "", kb: "4012218"},
|
|
{revision: "", kb: "4015549"},
|
|
{revision: "", kb: "4015552"},
|
|
{revision: "", kb: "4019264"},
|
|
{revision: "", kb: "4019265"},
|
|
{revision: "", kb: "4022719"},
|
|
{revision: "", kb: "4022168"},
|
|
{revision: "", kb: "4025341"},
|
|
{revision: "", kb: "4025340"},
|
|
{revision: "", kb: "4034664"},
|
|
{revision: "", kb: "4034670"},
|
|
{revision: "", kb: "4038777"},
|
|
{revision: "", kb: "4038803"},
|
|
{revision: "", kb: "4041681"},
|
|
{revision: "", kb: "4041686"},
|
|
{revision: "", kb: "4048957"},
|
|
{revision: "", kb: "4051034"},
|
|
{revision: "", kb: "4054518"},
|
|
{revision: "", kb: "4056894"},
|
|
{revision: "", kb: "4057400"},
|
|
{revision: "", kb: "4074598"},
|
|
{revision: "", kb: "4075211"},
|
|
{revision: "", kb: "4088875"},
|
|
{revision: "", kb: "4088881"},
|
|
{revision: "", kb: "4093118"},
|
|
{revision: "", kb: "4093113"},
|
|
{revision: "", kb: "4103718"},
|
|
{revision: "", kb: "4103713"},
|
|
{revision: "", kb: "4284826"},
|
|
{revision: "", kb: "4284842"},
|
|
{revision: "", kb: "4338818"},
|
|
{revision: "", kb: "4338821"},
|
|
{revision: "", kb: "4343900"},
|
|
{revision: "", kb: "4343894"},
|
|
{revision: "", kb: "4457144"},
|
|
{revision: "", kb: "4457139"},
|
|
{revision: "", kb: "4462923"},
|
|
{revision: "", kb: "4462927"},
|
|
{revision: "", kb: "4467107"},
|
|
{revision: "", kb: "4467108"},
|
|
{revision: "", kb: "4471318"},
|
|
{revision: "", kb: "4480970"},
|
|
{revision: "", kb: "4480955"},
|
|
{revision: "", kb: "4486563"},
|
|
{revision: "", kb: "4486565"},
|
|
{revision: "", kb: "4489878"},
|
|
{revision: "", kb: "4489892"},
|
|
{revision: "", kb: "4493472"},
|
|
{revision: "", kb: "4493453"},
|
|
{revision: "", kb: "4499164"},
|
|
{revision: "", kb: "4499178"},
|
|
{revision: "", kb: "4503292"},
|
|
{revision: "", kb: "4503277"},
|
|
{revision: "", kb: "4507449"},
|
|
{revision: "", kb: "4507437"},
|
|
{revision: "", kb: "4512506"},
|
|
{revision: "", kb: "4512514"},
|
|
{revision: "", kb: "4516065"},
|
|
{revision: "", kb: "4516048"},
|
|
{revision: "", kb: "4524157"},
|
|
{revision: "", kb: "4519976"},
|
|
{revision: "", kb: "4519972"},
|
|
{revision: "", kb: "4525235"},
|
|
{revision: "", kb: "4525251"},
|
|
{revision: "", kb: "4530734"},
|
|
{revision: "", kb: "4534310"},
|
|
{revision: "", kb: "4539601"},
|
|
{revision: "", kb: "4537820"},
|
|
{revision: "", kb: "4540688"},
|
|
{revision: "", kb: "4550964"},
|
|
{revision: "", kb: "4556836"},
|
|
{revision: "", kb: "4561643"},
|
|
{revision: "", kb: "4565524"},
|
|
{revision: "", kb: "4571729"},
|
|
{revision: "", kb: "4577051"},
|
|
{revision: "", kb: "4580345"},
|
|
{revision: "", kb: "4586827"},
|
|
{revision: "", kb: "4592471"},
|
|
{revision: "", kb: "4598279"},
|
|
{revision: "", kb: "4601347"},
|
|
{revision: "", kb: "5000841"},
|
|
{revision: "", kb: "5001335"},
|
|
{revision: "", kb: "5003233"},
|
|
{revision: "", kb: "5003667"},
|
|
{revision: "", kb: "5004953"},
|
|
{revision: "", kb: "5004289"},
|
|
{revision: "", kb: "5005088"},
|
|
{revision: "", kb: "5005633"},
|
|
{revision: "", kb: "5006743"},
|
|
{revision: "", kb: "5007236"},
|
|
{revision: "", kb: "5008244"},
|
|
{revision: "", kb: "5009610"},
|
|
{revision: "", kb: "5010404"},
|
|
{revision: "", kb: "5011552"},
|
|
{revision: "", kb: "5012626"},
|
|
{revision: "", kb: "5014012"},
|
|
{revision: "", kb: "5014748"},
|
|
{revision: "", kb: "5015861"},
|
|
{revision: "", kb: "5016676"},
|
|
{revision: "", kb: "5017361"},
|
|
{revision: "", kb: "5018454"},
|
|
{revision: "", kb: "5020000"},
|
|
{revision: "", kb: "5021291"},
|
|
{revision: "", kb: "5022338"},
|
|
{revision: "", kb: "5022872"},
|
|
{revision: "", kb: "5023769"},
|
|
{revision: "", kb: "5025279"},
|
|
{revision: "", kb: "5026413"},
|
|
{revision: "", kb: "5027275"},
|
|
},
|
|
securityOnly: []string{
|
|
"3192391",
|
|
"3197867",
|
|
"3205394",
|
|
"3212642",
|
|
"4012212",
|
|
"4015546",
|
|
"4019263",
|
|
"4022722",
|
|
"4025337",
|
|
"4034679",
|
|
"4038779",
|
|
"4041678",
|
|
"4048960",
|
|
"4054521",
|
|
"4056897",
|
|
"4074587",
|
|
"4088878",
|
|
"4093108",
|
|
"4103712",
|
|
"4284867",
|
|
"4338823",
|
|
"4343899",
|
|
"4457145",
|
|
"4462915",
|
|
"4467106",
|
|
"4471328",
|
|
"4480960",
|
|
"4486564",
|
|
"4489885",
|
|
"4493448",
|
|
"4499175",
|
|
"4503269",
|
|
"4507456",
|
|
"4512486",
|
|
"4516033",
|
|
"4520003",
|
|
"4525233",
|
|
"4530692",
|
|
"4534314",
|
|
"4537813",
|
|
"4541500",
|
|
"4550965",
|
|
"4556843",
|
|
"4561669",
|
|
"4565539",
|
|
"4571719",
|
|
"4577053",
|
|
"4580387",
|
|
"4586805",
|
|
"4592503",
|
|
"4598289",
|
|
"4601363",
|
|
"5000851",
|
|
"5001392",
|
|
"5003228",
|
|
"5003694",
|
|
"5004951",
|
|
"5004307",
|
|
"5005089",
|
|
"5005615",
|
|
"5006728",
|
|
"5007233",
|
|
"5008282",
|
|
"5009621",
|
|
"5010422",
|
|
"5011529",
|
|
"5012649",
|
|
"5013999",
|
|
"5014742",
|
|
"5015862",
|
|
"5016679",
|
|
"5017373",
|
|
"5018479",
|
|
"5020013",
|
|
"5021288",
|
|
"5022339",
|
|
"5022874",
|
|
"5023759",
|
|
"5025277",
|
|
"5026426",
|
|
"5027256",
|
|
},
|
|
},
|
|
},
|
|
"2012": {
|
|
// https://support.microsoft.com/en-us/topic/windows-server-2012-update-history-abfb9afd-2ebf-1c19-4224-ad86f8741edd
|
|
"": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "3172615"},
|
|
{revision: "", kb: "3179575"},
|
|
{revision: "", kb: "3185280"},
|
|
{revision: "", kb: "3185332"},
|
|
{revision: "", kb: "3192406"},
|
|
{revision: "", kb: "3197877"},
|
|
{revision: "", kb: "3197878"},
|
|
{revision: "", kb: "3205409"},
|
|
{revision: "", kb: "4012217"},
|
|
{revision: "", kb: "4012220"},
|
|
{revision: "", kb: "4015551"},
|
|
{revision: "", kb: "4015554"},
|
|
{revision: "", kb: "4019216"},
|
|
{revision: "", kb: "4019218"},
|
|
{revision: "", kb: "4022724"},
|
|
{revision: "", kb: "4022721"},
|
|
{revision: "", kb: "4025331"},
|
|
{revision: "", kb: "4025332"},
|
|
{revision: "", kb: "4034665"},
|
|
{revision: "", kb: "4034659"},
|
|
{revision: "", kb: "4038799"},
|
|
{revision: "", kb: "4038797"},
|
|
{revision: "", kb: "4041690"},
|
|
{revision: "", kb: "4041692"},
|
|
{revision: "", kb: "4048959"},
|
|
{revision: "", kb: "4050945"},
|
|
{revision: "", kb: "4054520"},
|
|
{revision: "", kb: "4056896"},
|
|
{revision: "", kb: "4057402"},
|
|
{revision: "", kb: "4074593"},
|
|
{revision: "", kb: "4075213"},
|
|
{revision: "", kb: "4088877"},
|
|
{revision: "", kb: "4088883"},
|
|
{revision: "", kb: "4093123"},
|
|
{revision: "", kb: "4093116"},
|
|
{revision: "", kb: "4103730"},
|
|
{revision: "", kb: "4103719"},
|
|
{revision: "", kb: "4284855"},
|
|
{revision: "", kb: "4284852"},
|
|
{revision: "", kb: "4338830"},
|
|
{revision: "", kb: "4338816"},
|
|
{revision: "", kb: "4343901"},
|
|
{revision: "", kb: "4343895"},
|
|
{revision: "", kb: "4457135"},
|
|
{revision: "", kb: "4457134"},
|
|
{revision: "", kb: "4462929"},
|
|
{revision: "", kb: "4462925"},
|
|
{revision: "", kb: "4467701"},
|
|
{revision: "", kb: "4467683"},
|
|
{revision: "", kb: "4471330"},
|
|
{revision: "", kb: "4480975"},
|
|
{revision: "", kb: "4480971"},
|
|
{revision: "", kb: "4487025"},
|
|
{revision: "", kb: "4487024"},
|
|
{revision: "", kb: "4489891"},
|
|
{revision: "", kb: "4489920"},
|
|
{revision: "", kb: "4493451"},
|
|
{revision: "", kb: "4493462"},
|
|
{revision: "", kb: "4499171"},
|
|
{revision: "", kb: "4499145"},
|
|
{revision: "", kb: "4503285"},
|
|
{revision: "", kb: "4503295"},
|
|
{revision: "", kb: "4507462"},
|
|
{revision: "", kb: "4507447"},
|
|
{revision: "", kb: "4512518"},
|
|
{revision: "", kb: "4512512"},
|
|
{revision: "", kb: "4516055"},
|
|
{revision: "", kb: "4516069"},
|
|
{revision: "", kb: "4524154"},
|
|
{revision: "", kb: "4520007"},
|
|
{revision: "", kb: "4520013"},
|
|
{revision: "", kb: "4525246"},
|
|
{revision: "", kb: "4525242"},
|
|
{revision: "", kb: "4530691"},
|
|
{revision: "", kb: "4534283"},
|
|
{revision: "", kb: "4534320"},
|
|
{revision: "", kb: "4537814"},
|
|
{revision: "", kb: "4537807"},
|
|
{revision: "", kb: "4541510"},
|
|
{revision: "", kb: "4541332"},
|
|
{revision: "", kb: "4550917"},
|
|
{revision: "", kb: "4550960"},
|
|
{revision: "", kb: "4556840"},
|
|
{revision: "", kb: "4561612"},
|
|
{revision: "", kb: "4565537"},
|
|
{revision: "", kb: "4571736"},
|
|
{revision: "", kb: "4577038"},
|
|
{revision: "", kb: "4580382"},
|
|
{revision: "", kb: "4586834"},
|
|
{revision: "", kb: "4592468"},
|
|
{revision: "", kb: "4598278"},
|
|
{revision: "", kb: "4601348"},
|
|
{revision: "", kb: "5000847"},
|
|
{revision: "", kb: "5001387"},
|
|
{revision: "", kb: "5003208"},
|
|
{revision: "", kb: "5003697"},
|
|
{revision: "", kb: "5004956"},
|
|
{revision: "", kb: "5004294"},
|
|
{revision: "", kb: "5005099"},
|
|
{revision: "", kb: "5005623"},
|
|
{revision: "", kb: "5006739"},
|
|
{revision: "", kb: "5007260"},
|
|
{revision: "", kb: "5008277"},
|
|
{revision: "", kb: "5009586"},
|
|
{revision: "", kb: "5010392"},
|
|
{revision: "", kb: "5011535"},
|
|
{revision: "", kb: "5012650"},
|
|
{revision: "", kb: "5014017"},
|
|
{revision: "", kb: "5014747"},
|
|
{revision: "", kb: "5015863"},
|
|
{revision: "", kb: "5016672"},
|
|
{revision: "", kb: "5017370"},
|
|
{revision: "", kb: "5018457"},
|
|
{revision: "", kb: "5020009"},
|
|
{revision: "", kb: "5021285"},
|
|
{revision: "", kb: "5022348"},
|
|
{revision: "", kb: "5022903"},
|
|
{revision: "", kb: "5023756"},
|
|
{revision: "", kb: "5025287"},
|
|
{revision: "", kb: "5026419"},
|
|
{revision: "", kb: "5027283"},
|
|
},
|
|
securityOnly: []string{
|
|
"3192393",
|
|
"3197876",
|
|
"3205408",
|
|
"4012214",
|
|
"4015548",
|
|
"4019214",
|
|
"4022718",
|
|
"4025343",
|
|
"4034666",
|
|
"4038786",
|
|
"4041679",
|
|
"4048962",
|
|
"4054523",
|
|
"4056899",
|
|
"4074589",
|
|
"4088880",
|
|
"4093122",
|
|
"4103726",
|
|
"4284846",
|
|
"4338820",
|
|
"4343896",
|
|
"4457140",
|
|
"4462931",
|
|
"4467678",
|
|
"4471326",
|
|
"4480972",
|
|
"4486993",
|
|
"4489884",
|
|
"4493450",
|
|
"4499158",
|
|
"4503263",
|
|
"4507464",
|
|
"4512482",
|
|
"4516062",
|
|
"4519985",
|
|
"4525253",
|
|
"4530698",
|
|
"4534288",
|
|
"4537794",
|
|
"4540694",
|
|
"4550971",
|
|
"4556852",
|
|
"4561674",
|
|
"4565535",
|
|
"4571702",
|
|
"4577048",
|
|
"4580353",
|
|
"4586808",
|
|
"4592497",
|
|
"4598297",
|
|
"4601357",
|
|
"5000840",
|
|
"5001383",
|
|
"5003203",
|
|
"5003696",
|
|
"5004960",
|
|
"5004302",
|
|
"5005094",
|
|
"5005607",
|
|
"5006732",
|
|
"5007245",
|
|
"5008255",
|
|
"5009619",
|
|
"5010412",
|
|
"5011527",
|
|
"5012666",
|
|
"5014018",
|
|
"5014741",
|
|
"5015875",
|
|
"5016684",
|
|
"5017377",
|
|
"5018478",
|
|
"5020003",
|
|
"5021303",
|
|
"5022343",
|
|
"5022895",
|
|
"5023752",
|
|
"5025272",
|
|
"5026411",
|
|
"5027281",
|
|
},
|
|
},
|
|
},
|
|
"2012 R2": {
|
|
// https://support.microsoft.com/en-us/topic/windows-8-1-and-windows-server-2012-r2-update-history-47d81dd2-6804-b6ae-4112-20089467c7a6
|
|
"": {
|
|
rollup: []windowsRelease{
|
|
{revision: "", kb: "3172614"},
|
|
{revision: "", kb: "3179574"},
|
|
{revision: "", kb: "3185279"},
|
|
{revision: "", kb: "3185331"},
|
|
{revision: "", kb: "3192404"},
|
|
{revision: "", kb: "3197874"},
|
|
{revision: "", kb: "3197875"},
|
|
{revision: "", kb: "3205401"},
|
|
{revision: "", kb: "4012216"},
|
|
{revision: "", kb: "4012219"},
|
|
{revision: "", kb: "4015550"},
|
|
{revision: "", kb: "4015553"},
|
|
{revision: "", kb: "4019215"},
|
|
{revision: "", kb: "4019217"},
|
|
{revision: "", kb: "4022726"},
|
|
{revision: "", kb: "4022720"},
|
|
{revision: "", kb: "4025336"},
|
|
{revision: "", kb: "4025335"},
|
|
{revision: "", kb: "4034681"},
|
|
{revision: "", kb: "4034663"},
|
|
{revision: "", kb: "4038792"},
|
|
{revision: "", kb: "4038774"},
|
|
{revision: "", kb: "4041693"},
|
|
{revision: "", kb: "4041685"},
|
|
{revision: "", kb: "4048958"},
|
|
{revision: "", kb: "4050946"},
|
|
{revision: "", kb: "4054519"},
|
|
{revision: "", kb: "4056895"},
|
|
{revision: "", kb: "4057401"},
|
|
{revision: "", kb: "4074594"},
|
|
{revision: "", kb: "4075212"},
|
|
{revision: "", kb: "4088876"},
|
|
{revision: "", kb: "4088882"},
|
|
{revision: "", kb: "4093114"},
|
|
{revision: "", kb: "4093121"},
|
|
{revision: "", kb: "4103725"},
|
|
{revision: "", kb: "4103724"},
|
|
{revision: "", kb: "4284815"},
|
|
{revision: "", kb: "4284863"},
|
|
{revision: "", kb: "4338815"},
|
|
{revision: "", kb: "4338831"},
|
|
{revision: "", kb: "4343898"},
|
|
{revision: "", kb: "4343891"},
|
|
{revision: "", kb: "4457129"},
|
|
{revision: "", kb: "4457133"},
|
|
{revision: "", kb: "4462926"},
|
|
{revision: "", kb: "4462921"},
|
|
{revision: "", kb: "4467697"},
|
|
{revision: "", kb: "4467695"},
|
|
{revision: "", kb: "4471320"},
|
|
{revision: "", kb: "4480963"},
|
|
{revision: "", kb: "4480969"},
|
|
{revision: "", kb: "4487000"},
|
|
{revision: "", kb: "4487016"},
|
|
{revision: "", kb: "4489881"},
|
|
{revision: "", kb: "4489893"},
|
|
{revision: "", kb: "4493446"},
|
|
{revision: "", kb: "4493443"},
|
|
{revision: "", kb: "4499151"},
|
|
{revision: "", kb: "4499182"},
|
|
{revision: "", kb: "4503276"},
|
|
{revision: "", kb: "4503283"},
|
|
{revision: "", kb: "4507448"},
|
|
{revision: "", kb: "4507463"},
|
|
{revision: "", kb: "4512488"},
|
|
{revision: "", kb: "4512478"},
|
|
{revision: "", kb: "4516067"},
|
|
{revision: "", kb: "4516041"},
|
|
{revision: "", kb: "4524156"},
|
|
{revision: "", kb: "4520005"},
|
|
{revision: "", kb: "4520012"},
|
|
{revision: "", kb: "4525243"},
|
|
{revision: "", kb: "4525252"},
|
|
{revision: "", kb: "4530702"},
|
|
{revision: "", kb: "4534297"},
|
|
{revision: "", kb: "4534324"},
|
|
{revision: "", kb: "4537821"},
|
|
{revision: "", kb: "4537819"},
|
|
{revision: "", kb: "4541509"},
|
|
{revision: "", kb: "4541334"},
|
|
{revision: "", kb: "4550961"},
|
|
{revision: "", kb: "4550958"},
|
|
{revision: "", kb: "4556846"},
|
|
{revision: "", kb: "4561666"},
|
|
{revision: "", kb: "4565541"},
|
|
{revision: "", kb: "4571703"},
|
|
{revision: "", kb: "4577066"},
|
|
{revision: "", kb: "4580347"},
|
|
{revision: "", kb: "4586845"},
|
|
{revision: "", kb: "4592484"},
|
|
{revision: "", kb: "4598285"},
|
|
{revision: "", kb: "4601384"},
|
|
{revision: "", kb: "5000848"},
|
|
{revision: "", kb: "5001382"},
|
|
{revision: "", kb: "5003209"},
|
|
{revision: "", kb: "5003671"},
|
|
{revision: "", kb: "5004954"},
|
|
{revision: "", kb: "5004298"},
|
|
{revision: "", kb: "5005076"},
|
|
{revision: "", kb: "5005613"},
|
|
{revision: "", kb: "5006714"},
|
|
{revision: "", kb: "5007247"},
|
|
{revision: "", kb: "5008263"},
|
|
{revision: "", kb: "5009624"},
|
|
{revision: "", kb: "5010419"},
|
|
{revision: "", kb: "5011564"},
|
|
{revision: "", kb: "5012670"},
|
|
{revision: "", kb: "5014011"},
|
|
{revision: "", kb: "5014738"},
|
|
{revision: "", kb: "5015874"},
|
|
{revision: "", kb: "5016681"},
|
|
{revision: "", kb: "5017367"},
|
|
{revision: "", kb: "5018474"},
|
|
{revision: "", kb: "5020023"},
|
|
{revision: "", kb: "5021294"},
|
|
{revision: "", kb: "5022352"},
|
|
{revision: "", kb: "5022899"},
|
|
{revision: "", kb: "5023765"},
|
|
{revision: "", kb: "5025285"},
|
|
{revision: "", kb: "5026415"},
|
|
{revision: "", kb: "5027271"},
|
|
},
|
|
securityOnly: []string{
|
|
"3192392",
|
|
"3197873",
|
|
"3205400",
|
|
"4012213",
|
|
"4015547",
|
|
"4019213",
|
|
"4022717",
|
|
"4025333",
|
|
"4034672",
|
|
"4038793",
|
|
"4041687",
|
|
"4048961",
|
|
"4054522",
|
|
"4056898",
|
|
"4074597",
|
|
"4088879",
|
|
"4093115",
|
|
"4103715",
|
|
"4284878",
|
|
"4338824",
|
|
"4343888",
|
|
"4457143",
|
|
"4462941",
|
|
"4467703",
|
|
"4471322",
|
|
"4480964",
|
|
"4487028",
|
|
"4489883",
|
|
"4493467",
|
|
"4499165",
|
|
"4503290",
|
|
"4507457",
|
|
"4512489",
|
|
"4516064",
|
|
"4519990",
|
|
"4525250",
|
|
"4530730",
|
|
"4534309",
|
|
"4537803",
|
|
"4541505",
|
|
"4550970",
|
|
"4556853",
|
|
"4561673",
|
|
"4565540",
|
|
"4571723",
|
|
"4577071",
|
|
"4580358",
|
|
"4586823",
|
|
"4592495",
|
|
"4598275",
|
|
"4601349",
|
|
"5000853",
|
|
"5001393",
|
|
"5003220",
|
|
"5003681",
|
|
"5004958",
|
|
"5004285",
|
|
"5005106",
|
|
"5005627",
|
|
"5006729",
|
|
"5007255",
|
|
"5008285",
|
|
"5009595",
|
|
"5010395",
|
|
"5011560",
|
|
"5012639",
|
|
"5014001",
|
|
"5014746",
|
|
"5015877",
|
|
"5016683",
|
|
"5017365",
|
|
"5018476",
|
|
"5020010",
|
|
"5021296",
|
|
"5022346",
|
|
"5022894",
|
|
"5023764",
|
|
"5025288",
|
|
"5026409",
|
|
"5027282",
|
|
},
|
|
},
|
|
},
|
|
"2016": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-2016-update-history-4acfbc84-a290-1b54-536a-1c0430e9f3fd
|
|
"14393": {
|
|
rollup: []windowsRelease{
|
|
{revision: "10", kb: "3176929"},
|
|
{revision: "51", kb: "3176495"},
|
|
{revision: "82", kb: "3176934"},
|
|
{revision: "105", kb: "3176938"},
|
|
{revision: "187", kb: "3189866"},
|
|
{revision: "187", kb: "3193494"},
|
|
{revision: "189", kb: "3193494"},
|
|
{revision: "222", kb: "3194496"},
|
|
{revision: "321", kb: "3194798"},
|
|
{revision: "351", kb: "3197954"},
|
|
{revision: "447", kb: "3200970"},
|
|
{revision: "448", kb: "3200970"},
|
|
{revision: "479", kb: "3201845"},
|
|
{revision: "571", kb: "3206632"},
|
|
{revision: "576", kb: "3206632"},
|
|
{revision: "693", kb: "3213986"},
|
|
{revision: "729", kb: "4010672"},
|
|
{revision: "953", kb: "4013429"},
|
|
{revision: "969", kb: "4015438"},
|
|
{revision: "970", kb: "4016635"},
|
|
{revision: "1066", kb: "4015217"},
|
|
{revision: "1083", kb: "4015217"},
|
|
{revision: "1198", kb: "4019472"},
|
|
{revision: "1230", kb: "4023680"},
|
|
{revision: "1358", kb: "4022715"},
|
|
{revision: "1378", kb: "4022723"},
|
|
{revision: "1480", kb: "4025339"},
|
|
{revision: "1532", kb: "4025334"},
|
|
{revision: "1537", kb: "4038220"},
|
|
{revision: "1593", kb: "4034658"},
|
|
{revision: "1613", kb: "4034661"},
|
|
{revision: "1670", kb: "4039396"},
|
|
{revision: "1715", kb: "4038782"},
|
|
{revision: "1737", kb: "4038801"},
|
|
{revision: "1770", kb: "4041691"},
|
|
{revision: "1794", kb: "4041688"},
|
|
{revision: "1797", kb: "4052231"},
|
|
{revision: "1884", kb: "4048953"},
|
|
{revision: "1914", kb: "4051033"},
|
|
{revision: "1944", kb: "4053579"},
|
|
{revision: "2007", kb: "4056890"},
|
|
{revision: "2034", kb: "4057142"},
|
|
{revision: "2035", kb: "4057142"},
|
|
{revision: "2068", kb: "4074590"},
|
|
{revision: "2097", kb: "4077525"},
|
|
{revision: "2125", kb: "4088787"},
|
|
{revision: "2126", kb: "4088787"},
|
|
{revision: "2155", kb: "4088889"},
|
|
{revision: "2156", kb: "4096309"},
|
|
{revision: "2189", kb: "4093119"},
|
|
{revision: "2214", kb: "4093120"},
|
|
{revision: "2248", kb: "4103723"},
|
|
{revision: "2273", kb: "4103720"},
|
|
{revision: "2312", kb: "4284880"},
|
|
{revision: "2339", kb: "4284833"},
|
|
{revision: "2363", kb: "4338814"},
|
|
{revision: "2368", kb: "4345418"},
|
|
{revision: "2395", kb: "4338822"},
|
|
{revision: "2396", kb: "4346877"},
|
|
{revision: "2430", kb: "4343887"},
|
|
{revision: "2457", kb: "4343884"},
|
|
{revision: "2485", kb: "4457131"},
|
|
{revision: "2515", kb: "4457127"},
|
|
{revision: "2551", kb: "4462917"},
|
|
{revision: "2580", kb: "4462928"},
|
|
{revision: "2608", kb: "4467691"},
|
|
{revision: "2639", kb: "4467684"},
|
|
{revision: "2641", kb: "4478877"},
|
|
{revision: "2665", kb: "4471321"},
|
|
{revision: "2670", kb: "4483229"},
|
|
{revision: "2724", kb: "4480961"},
|
|
{revision: "2759", kb: "4480977"},
|
|
{revision: "2791", kb: "4487026"},
|
|
{revision: "2828", kb: "4487006"},
|
|
{revision: "2848", kb: "4489882"},
|
|
{revision: "2879", kb: "4489889"},
|
|
{revision: "2906", kb: "4493470"},
|
|
{revision: "2908", kb: "4499418"},
|
|
{revision: "2941", kb: "4493473"},
|
|
{revision: "2969", kb: "4494440"},
|
|
{revision: "2972", kb: "4505052"},
|
|
{revision: "2999", kb: "4499177"},
|
|
{revision: "3025", kb: "4503267"},
|
|
{revision: "3053", kb: "4503294"},
|
|
{revision: "3056", kb: "4509475"},
|
|
{revision: "3085", kb: "4507460"},
|
|
{revision: "3115", kb: "4507459"},
|
|
{revision: "3144", kb: "4512517"},
|
|
{revision: "3181", kb: "4512495"},
|
|
{revision: "3204", kb: "4516044"},
|
|
{revision: "3206", kb: "4522010"},
|
|
{revision: "3242", kb: "4516061"},
|
|
{revision: "3243", kb: "4524152"},
|
|
{revision: "3274", kb: "4519998"},
|
|
{revision: "3300", kb: "4519979"},
|
|
{revision: "3326", kb: "4525236"},
|
|
{revision: "3384", kb: "4530689"},
|
|
{revision: "3443", kb: "4534271"},
|
|
{revision: "3474", kb: "4534307"},
|
|
{revision: "3504", kb: "4537764"},
|
|
{revision: "3542", kb: "4537806"},
|
|
{revision: "3564", kb: "4540670"},
|
|
{revision: "3595", kb: "4541329"},
|
|
{revision: "3630", kb: "4550929"},
|
|
{revision: "3659", kb: "4550947"},
|
|
{revision: "3686", kb: "4556813"},
|
|
{revision: "3750", kb: "4561616"},
|
|
{revision: "3755", kb: "4567517"},
|
|
{revision: "3808", kb: "4565511"},
|
|
{revision: "3866", kb: "4571694"},
|
|
{revision: "3930", kb: "4577015"},
|
|
{revision: "3986", kb: "4580346"},
|
|
{revision: "4046", kb: "4586830"},
|
|
{revision: "4048", kb: "4594441"},
|
|
{revision: "4104", kb: "4593226"},
|
|
{revision: "4169", kb: "4598243"},
|
|
{revision: "4225", kb: "4601318"},
|
|
{revision: "4283", kb: "5000803"},
|
|
{revision: "4288", kb: "5001633"},
|
|
{revision: "4350", kb: "5001347"},
|
|
{revision: "4402", kb: "5003197"},
|
|
{revision: "4467", kb: "5003638"},
|
|
{revision: "4470", kb: "5004948"},
|
|
{revision: "4530", kb: "5004238"},
|
|
{revision: "4532", kb: "5005393"},
|
|
{revision: "4583", kb: "5005043"},
|
|
{revision: "4651", kb: "5005573"},
|
|
{revision: "4704", kb: "5006669"},
|
|
{revision: "4770", kb: "5007192"},
|
|
{revision: "4771", kb: "5008601"},
|
|
{revision: "4825", kb: "5008207"},
|
|
{revision: "4827", kb: "5010195"},
|
|
{revision: "4886", kb: "5009546"},
|
|
{revision: "4889", kb: "5010790"},
|
|
{revision: "4946", kb: "5010359"},
|
|
{revision: "5006", kb: "5011495"},
|
|
{revision: "5066", kb: "5012596"},
|
|
{revision: "5125", kb: "5013952"},
|
|
{revision: "5127", kb: "5015019"},
|
|
{revision: "5192", kb: "5014702"},
|
|
{revision: "5246", kb: "5015808"},
|
|
{revision: "5291", kb: "5016622"},
|
|
{revision: "5356", kb: "5017305"},
|
|
{revision: "5427", kb: "5018411"},
|
|
{revision: "5429", kb: "5020439"},
|
|
{revision: "5501", kb: "5019964"},
|
|
{revision: "5502", kb: "5021654"},
|
|
{revision: "5582", kb: "5021235"},
|
|
{revision: "5648", kb: "5022289"},
|
|
{revision: "5717", kb: "5022838"},
|
|
{revision: "5786", kb: "5023697"},
|
|
{revision: "5850", kb: "5025228"},
|
|
{revision: "5921", kb: "5026363"},
|
|
{revision: "5989", kb: "5027219"},
|
|
{revision: "5996", kb: "5028623"},
|
|
},
|
|
},
|
|
},
|
|
"Version 1709": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-8127c2c6-6edf-4fdf-8b9f-0f7be1ef3562
|
|
"16299": {
|
|
rollup: []windowsRelease{
|
|
{revision: "19", kb: "4043961"},
|
|
{revision: "64", kb: "4048955"},
|
|
{revision: "98", kb: "4051963"},
|
|
{revision: "125", kb: "4054517"},
|
|
{revision: "192", kb: "4056892"},
|
|
{revision: "194", kb: "4073290"},
|
|
{revision: "201", kb: "4073291"},
|
|
{revision: "214", kb: "4058258"},
|
|
{revision: "248", kb: "4074588"},
|
|
{revision: "251", kb: "4090913"},
|
|
{revision: "309", kb: "4088776"},
|
|
{revision: "334", kb: "4089848"},
|
|
{revision: "371", kb: "4093112"},
|
|
{revision: "402", kb: "4093105"},
|
|
{revision: "431", kb: "4103727"},
|
|
{revision: "461", kb: "4103714"},
|
|
{revision: "492", kb: "4284819"},
|
|
{revision: "522", kb: "4284822"},
|
|
{revision: "547", kb: "4338825"},
|
|
{revision: "551", kb: "4345420"},
|
|
{revision: "579", kb: "4338817"},
|
|
{revision: "611", kb: "4343897"},
|
|
{revision: "637", kb: "4343893"},
|
|
{revision: "665", kb: "4457142"},
|
|
{revision: "666", kb: "4464217"},
|
|
{revision: "699", kb: "4457136"},
|
|
{revision: "726", kb: "4462918"},
|
|
{revision: "755", kb: "4462932"},
|
|
{revision: "785", kb: "4467686"},
|
|
{revision: "820", kb: "4467681"},
|
|
{revision: "846", kb: "4471329"},
|
|
{revision: "847", kb: "4483232"},
|
|
{revision: "904", kb: "4480978"},
|
|
{revision: "936", kb: "4480967"},
|
|
{revision: "967", kb: "4486996"},
|
|
{revision: "1004", kb: "4487021"},
|
|
{revision: "1029", kb: "4489886"},
|
|
{revision: "1059", kb: "4489890"},
|
|
{revision: "1087", kb: "4493441"},
|
|
{revision: "1127", kb: "4493440"},
|
|
{revision: "1146", kb: "4499179"},
|
|
{revision: "1150", kb: "4505062"},
|
|
{revision: "1182", kb: "4499147"},
|
|
{revision: "1217", kb: "4503284"},
|
|
{revision: "1237", kb: "4503281"},
|
|
{revision: "1239", kb: "4509477"},
|
|
{revision: "1268", kb: "4507455"},
|
|
{revision: "1296", kb: "4507465"},
|
|
{revision: "1331", kb: "4512516"},
|
|
{revision: "1365", kb: "4512494"},
|
|
{revision: "1387", kb: "4516066"},
|
|
{revision: "1392", kb: "4522012"},
|
|
{revision: "1420", kb: "4516071"},
|
|
{revision: "1421", kb: "4524150"},
|
|
{revision: "1451", kb: "4520004"},
|
|
{revision: "1481", kb: "4520006"},
|
|
{revision: "1508", kb: "4525241"},
|
|
{revision: "1565", kb: "4530714"},
|
|
{revision: "1625", kb: "4534276"},
|
|
{revision: "1654", kb: "4534318"},
|
|
{revision: "1686", kb: "4537789"},
|
|
{revision: "1717", kb: "4537816"},
|
|
{revision: "1747", kb: "4540681"},
|
|
{revision: "1775", kb: "4541330"},
|
|
{revision: "1776", kb: "4554342"},
|
|
{revision: "1806", kb: "4550927"},
|
|
{revision: "1868", kb: "4556812"},
|
|
{revision: "1932", kb: "4561602"},
|
|
{revision: "1937", kb: "4567515"},
|
|
{revision: "1992", kb: "4565508"},
|
|
{revision: "2045", kb: "4571741"},
|
|
{revision: "2107", kb: "4577041"},
|
|
{revision: "2166", kb: "4580328"},
|
|
},
|
|
},
|
|
},
|
|
"Version 1803": {
|
|
"17134": {
|
|
rollup: []windowsRelease{},
|
|
},
|
|
},
|
|
"Version 1809": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-2019-update-history-725fc2e1-4443-6831-a5ca-51ff5cbcb059
|
|
"17763": {
|
|
rollup: []windowsRelease{
|
|
{revision: "1", kb: ""},
|
|
{revision: "55", kb: "4464330"},
|
|
{revision: "107", kb: "4464455"},
|
|
{revision: "134", kb: "4467708"},
|
|
{revision: "168", kb: "4469342"},
|
|
{revision: "194", kb: "4471332"},
|
|
{revision: "195", kb: "4483235"},
|
|
{revision: "253", kb: "4480116"},
|
|
{revision: "292", kb: "4476976"},
|
|
{revision: "316", kb: "4487044"},
|
|
{revision: "348", kb: "4482887"},
|
|
{revision: "379", kb: "4489899"},
|
|
{revision: "402", kb: "4490481"},
|
|
{revision: "404", kb: "4490481"},
|
|
{revision: "437", kb: "4493509"},
|
|
{revision: "439", kb: "4501835"},
|
|
{revision: "475", kb: "4495667"},
|
|
{revision: "503", kb: "4494441"},
|
|
{revision: "504", kb: "4505056"},
|
|
{revision: "529", kb: "4497934"},
|
|
{revision: "557", kb: "4503327"},
|
|
{revision: "592", kb: "4501371"},
|
|
{revision: "593", kb: "4509479"},
|
|
{revision: "615", kb: "4507469"},
|
|
{revision: "652", kb: "4505658"},
|
|
{revision: "678", kb: "4511553"},
|
|
{revision: "720", kb: "4512534"},
|
|
{revision: "737", kb: "4512578"},
|
|
{revision: "740", kb: "4522015"},
|
|
{revision: "774", kb: "4516077"},
|
|
{revision: "775", kb: "4524148"},
|
|
{revision: "805", kb: "4519338"},
|
|
{revision: "832", kb: "4520062"},
|
|
{revision: "864", kb: "4523205"},
|
|
{revision: "914", kb: "4530715"},
|
|
{revision: "973", kb: "4534273"},
|
|
{revision: "1012", kb: "4534321"},
|
|
{revision: "1039", kb: "4532691"},
|
|
{revision: "1075", kb: "4537818"},
|
|
{revision: "1098", kb: "4538461"},
|
|
{revision: "1131", kb: "4541331"},
|
|
{revision: "1132", kb: "4554354"},
|
|
{revision: "1158", kb: "4549949"},
|
|
{revision: "1192", kb: "4550969"},
|
|
{revision: "1217", kb: "4551853"},
|
|
{revision: "1282", kb: "4561608"},
|
|
{revision: "1294", kb: "4567513"},
|
|
{revision: "1339", kb: "4558998"},
|
|
{revision: "1369", kb: "4559003"},
|
|
{revision: "1397", kb: "4565349"},
|
|
{revision: "1432", kb: "4571748"},
|
|
{revision: "1457", kb: "4570333"},
|
|
{revision: "1490", kb: "4577069"},
|
|
{revision: "1518", kb: "4577668"},
|
|
{revision: "1554", kb: "4580390"},
|
|
{revision: "1577", kb: "4586793"},
|
|
{revision: "1579", kb: "4594442"},
|
|
{revision: "1613", kb: "4586839"},
|
|
{revision: "1637", kb: "4592440"},
|
|
{revision: "1697", kb: "4598230"},
|
|
{revision: "1728", kb: "4598296"},
|
|
{revision: "1757", kb: "4601345"},
|
|
{revision: "1790", kb: "4601383"},
|
|
{revision: "1817", kb: "5000822"},
|
|
{revision: "1821", kb: "5001568"},
|
|
{revision: "1823", kb: "5001638"},
|
|
{revision: "1852", kb: "5000854"},
|
|
{revision: "1879", kb: "5001342"},
|
|
{revision: "1911", kb: "5001384"},
|
|
{revision: "1935", kb: "5003171"},
|
|
{revision: "1971", kb: "5003217"},
|
|
{revision: "1999", kb: "5003646"},
|
|
{revision: "2028", kb: "5003703"},
|
|
{revision: "2029", kb: "5004947"},
|
|
{revision: "2061", kb: "5004244"},
|
|
{revision: "2090", kb: "5004308"},
|
|
{revision: "2091", kb: "5005394"},
|
|
{revision: "2114", kb: "5005030"},
|
|
{revision: "2145", kb: "5005102"},
|
|
{revision: "2183", kb: "5005568"},
|
|
{revision: "2210", kb: "5005625"},
|
|
{revision: "2213", kb: "5005625"},
|
|
{revision: "2237", kb: "5006672"},
|
|
{revision: "2268", kb: "5006744"},
|
|
{revision: "2300", kb: "5007206"},
|
|
{revision: "2305", kb: "5008602"},
|
|
{revision: "2330", kb: "5007266"},
|
|
{revision: "2366", kb: "5008218"},
|
|
{revision: "2369", kb: "5010196"},
|
|
{revision: "2452", kb: "5009557"},
|
|
{revision: "2458", kb: "5010791"},
|
|
{revision: "2510", kb: "5009616"},
|
|
{revision: "2565", kb: "5010351"},
|
|
{revision: "2628", kb: "5010427"},
|
|
{revision: "2686", kb: "5011503"},
|
|
{revision: "2746", kb: "5011551"},
|
|
{revision: "2803", kb: "5012647"},
|
|
{revision: "2867", kb: "5012636"},
|
|
{revision: "2928", kb: "5013941"},
|
|
{revision: "2931", kb: "5015018"},
|
|
{revision: "2989", kb: "5014022"},
|
|
{revision: "3046", kb: "5014692"},
|
|
{revision: "3113", kb: "5014669"},
|
|
{revision: "3165", kb: "5015811"},
|
|
{revision: "3232", kb: "5015880"},
|
|
{revision: "3287", kb: "5016623"},
|
|
{revision: "3346", kb: "5016690"},
|
|
{revision: "3406", kb: "5017315"},
|
|
{revision: "3469", kb: "5017379"},
|
|
{revision: "3532", kb: "5018419"},
|
|
{revision: "3534", kb: "5020438"},
|
|
{revision: "3650", kb: "5019966"},
|
|
{revision: "3653", kb: "5021655"},
|
|
{revision: "3770", kb: "5021237"},
|
|
{revision: "3772", kb: "5022554"},
|
|
{revision: "3887", kb: "5022286"},
|
|
{revision: "4010", kb: "5022840"},
|
|
},
|
|
},
|
|
},
|
|
"2019": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-and-windows-server-2019-update-history-725fc2e1-4443-6831-a5ca-51ff5cbcb059
|
|
"17763": {
|
|
rollup: []windowsRelease{
|
|
{revision: "1", kb: ""},
|
|
{revision: "55", kb: "4464330"},
|
|
{revision: "107", kb: "4464455"},
|
|
{revision: "134", kb: "4467708"},
|
|
{revision: "168", kb: "4469342"},
|
|
{revision: "194", kb: "4471332"},
|
|
{revision: "195", kb: "4483235"},
|
|
{revision: "253", kb: "4480116"},
|
|
{revision: "292", kb: "4476976"},
|
|
{revision: "316", kb: "4487044"},
|
|
{revision: "348", kb: "4482887"},
|
|
{revision: "379", kb: "4489899"},
|
|
{revision: "402", kb: "4490481"},
|
|
{revision: "404", kb: "4490481"},
|
|
{revision: "437", kb: "4493509"},
|
|
{revision: "439", kb: "4501835"},
|
|
{revision: "475", kb: "4495667"},
|
|
{revision: "503", kb: "4494441"},
|
|
{revision: "504", kb: "4505056"},
|
|
{revision: "529", kb: "4497934"},
|
|
{revision: "557", kb: "4503327"},
|
|
{revision: "592", kb: "4501371"},
|
|
{revision: "593", kb: "4509479"},
|
|
{revision: "615", kb: "4507469"},
|
|
{revision: "652", kb: "4505658"},
|
|
{revision: "678", kb: "4511553"},
|
|
{revision: "720", kb: "4512534"},
|
|
{revision: "737", kb: "4512578"},
|
|
{revision: "740", kb: "4522015"},
|
|
{revision: "774", kb: "4516077"},
|
|
{revision: "775", kb: "4524148"},
|
|
{revision: "805", kb: "4519338"},
|
|
{revision: "832", kb: "4520062"},
|
|
{revision: "864", kb: "4523205"},
|
|
{revision: "914", kb: "4530715"},
|
|
{revision: "973", kb: "4534273"},
|
|
{revision: "1012", kb: "4534321"},
|
|
{revision: "1039", kb: "4532691"},
|
|
{revision: "1075", kb: "4537818"},
|
|
{revision: "1098", kb: "4538461"},
|
|
{revision: "1131", kb: "4541331"},
|
|
{revision: "1132", kb: "4554354"},
|
|
{revision: "1158", kb: "4549949"},
|
|
{revision: "1192", kb: "4550969"},
|
|
{revision: "1217", kb: "4551853"},
|
|
{revision: "1282", kb: "4561608"},
|
|
{revision: "1294", kb: "4567513"},
|
|
{revision: "1339", kb: "4558998"},
|
|
{revision: "1369", kb: "4559003"},
|
|
{revision: "1397", kb: "4565349"},
|
|
{revision: "1432", kb: "4571748"},
|
|
{revision: "1457", kb: "4570333"},
|
|
{revision: "1490", kb: "4577069"},
|
|
{revision: "1518", kb: "4577668"},
|
|
{revision: "1554", kb: "4580390"},
|
|
{revision: "1577", kb: "4586793"},
|
|
{revision: "1579", kb: "4594442"},
|
|
{revision: "1613", kb: "4586839"},
|
|
{revision: "1637", kb: "4592440"},
|
|
{revision: "1697", kb: "4598230"},
|
|
{revision: "1728", kb: "4598296"},
|
|
{revision: "1757", kb: "4601345"},
|
|
{revision: "1790", kb: "4601383"},
|
|
{revision: "1817", kb: "5000822"},
|
|
{revision: "1821", kb: "5001568"},
|
|
{revision: "1823", kb: "5001638"},
|
|
{revision: "1852", kb: "5000854"},
|
|
{revision: "1879", kb: "5001342"},
|
|
{revision: "1911", kb: "5001384"},
|
|
{revision: "1935", kb: "5003171"},
|
|
{revision: "1971", kb: "5003217"},
|
|
{revision: "1999", kb: "5003646"},
|
|
{revision: "2028", kb: "5003703"},
|
|
{revision: "2029", kb: "5004947"},
|
|
{revision: "2061", kb: "5004244"},
|
|
{revision: "2090", kb: "5004308"},
|
|
{revision: "2091", kb: "5005394"},
|
|
{revision: "2114", kb: "5005030"},
|
|
{revision: "2145", kb: "5005102"},
|
|
{revision: "2183", kb: "5005568"},
|
|
{revision: "2210", kb: "5005625"},
|
|
{revision: "2213", kb: "5005625"},
|
|
{revision: "2237", kb: "5006672"},
|
|
{revision: "2268", kb: "5006744"},
|
|
{revision: "2300", kb: "5007206"},
|
|
{revision: "2305", kb: "5008602"},
|
|
{revision: "2330", kb: "5007266"},
|
|
{revision: "2366", kb: "5008218"},
|
|
{revision: "2369", kb: "5010196"},
|
|
{revision: "2452", kb: "5009557"},
|
|
{revision: "2458", kb: "5010791"},
|
|
{revision: "2510", kb: "5009616"},
|
|
{revision: "2565", kb: "5010351"},
|
|
{revision: "2628", kb: "5010427"},
|
|
{revision: "2686", kb: "5011503"},
|
|
{revision: "2746", kb: "5011551"},
|
|
{revision: "2803", kb: "5012647"},
|
|
{revision: "2867", kb: "5012636"},
|
|
{revision: "2928", kb: "5013941"},
|
|
{revision: "2931", kb: "5015018"},
|
|
{revision: "2989", kb: "5014022"},
|
|
{revision: "3046", kb: "5014692"},
|
|
{revision: "3113", kb: "5014669"},
|
|
{revision: "3165", kb: "5015811"},
|
|
{revision: "3232", kb: "5015880"},
|
|
{revision: "3287", kb: "5016623"},
|
|
{revision: "3346", kb: "5016690"},
|
|
{revision: "3406", kb: "5017315"},
|
|
{revision: "3469", kb: "5017379"},
|
|
{revision: "3532", kb: "5018419"},
|
|
{revision: "3534", kb: "5020438"},
|
|
{revision: "3650", kb: "5019966"},
|
|
{revision: "3653", kb: "5021655"},
|
|
{revision: "3770", kb: "5021237"},
|
|
{revision: "3772", kb: "5022554"},
|
|
{revision: "3887", kb: "5022286"},
|
|
{revision: "4010", kb: "5022840"},
|
|
{revision: "4131", kb: "5023702"},
|
|
{revision: "4252", kb: "5025229"},
|
|
{revision: "4377", kb: "5026362"},
|
|
{revision: "4499", kb: "5027222"},
|
|
},
|
|
},
|
|
},
|
|
"Version 1903": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-e6058e7c-4116-38f1-b984-4fcacfba5e5d
|
|
"18362": {
|
|
rollup: []windowsRelease{
|
|
{revision: "116", kb: "4505057"},
|
|
{revision: "145", kb: "4497935"},
|
|
{revision: "175", kb: "4503293"},
|
|
{revision: "207", kb: "4501375"},
|
|
{revision: "239", kb: "4507453"},
|
|
{revision: "267", kb: "4505903"},
|
|
{revision: "295", kb: "4512508"},
|
|
{revision: "329", kb: "4512941"},
|
|
{revision: "356", kb: "4515384"},
|
|
{revision: "357", kb: "4522016"},
|
|
{revision: "387", kb: "4517211"},
|
|
{revision: "388", kb: "4524147"},
|
|
{revision: "418", kb: "4517389"},
|
|
{revision: "449", kb: "4522355"},
|
|
{revision: "476", kb: "4524570"},
|
|
{revision: "535", kb: "4530684"},
|
|
{revision: "592", kb: "4528760"},
|
|
{revision: "628", kb: "4532695"},
|
|
{revision: "657", kb: "4532693"},
|
|
{revision: "693", kb: "4535996"},
|
|
{revision: "719", kb: "4540673"},
|
|
{revision: "720", kb: "4551762"},
|
|
{revision: "752", kb: "4541335"},
|
|
{revision: "753", kb: "4554364"},
|
|
{revision: "778", kb: "4549951"},
|
|
{revision: "815", kb: "4550945"},
|
|
{revision: "836", kb: "4556799"},
|
|
{revision: "900", kb: "4560960"},
|
|
{revision: "904", kb: "4567512"},
|
|
{revision: "959", kb: "4565483"},
|
|
{revision: "997", kb: "4559004"},
|
|
{revision: "1016", kb: "4565351"},
|
|
{revision: "1049", kb: "4566116"},
|
|
{revision: "1082", kb: "4574727"},
|
|
{revision: "1110", kb: "4577062"},
|
|
{revision: "1139", kb: "4577671"},
|
|
{revision: "1171", kb: "4580386"},
|
|
{revision: "1198", kb: "4586786"},
|
|
{revision: "1199", kb: "4594443"},
|
|
{revision: "1237", kb: "4586819"},
|
|
{revision: "1256", kb: "4592449"},
|
|
},
|
|
},
|
|
},
|
|
"Version 1909": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-53c270dc-954f-41f7-7ced-488578904dfe
|
|
"18363": {
|
|
rollup: []windowsRelease{
|
|
{revision: "476", kb: "4524570"},
|
|
{revision: "535", kb: "4530684"},
|
|
{revision: "592", kb: "4528760"},
|
|
{revision: "628", kb: "4532695"},
|
|
{revision: "657", kb: "4532693"},
|
|
{revision: "693", kb: "4535996"},
|
|
{revision: "719", kb: "4540673"},
|
|
{revision: "720", kb: "4551762"},
|
|
{revision: "752", kb: "4541335"},
|
|
{revision: "753", kb: "4554364"},
|
|
{revision: "778", kb: "4549951"},
|
|
{revision: "815", kb: "4550945"},
|
|
{revision: "836", kb: "4556799"},
|
|
{revision: "900", kb: "4560960"},
|
|
{revision: "904", kb: "4567512"},
|
|
{revision: "959", kb: "4565483"},
|
|
{revision: "997", kb: "4559004"},
|
|
{revision: "1016", kb: "4565351"},
|
|
{revision: "1049", kb: "4566116"},
|
|
{revision: "1082", kb: "4574727"},
|
|
{revision: "1110", kb: "4577062"},
|
|
{revision: "1139", kb: "4577671"},
|
|
{revision: "1171", kb: "4580386"},
|
|
{revision: "1198", kb: "4586786"},
|
|
{revision: "1199", kb: "4594443"},
|
|
{revision: "1237", kb: "4586819"},
|
|
{revision: "1256", kb: "4592449"},
|
|
{revision: "1316", kb: "4598229"},
|
|
{revision: "1350", kb: "4598298"},
|
|
{revision: "1377", kb: "4601315"},
|
|
{revision: "1379", kb: "5001028"},
|
|
{revision: "1411", kb: "4601380"},
|
|
{revision: "1440", kb: "5000808"},
|
|
{revision: "1441", kb: "5001566"},
|
|
{revision: "1443", kb: "5001648"},
|
|
{revision: "1474", kb: "5000850"},
|
|
{revision: "1500", kb: "5001337"},
|
|
{revision: "1533", kb: "5001396"},
|
|
{revision: "1556", kb: "5003169"},
|
|
{revision: "1593", kb: "5003212"},
|
|
{revision: "1621", kb: "5003635"},
|
|
{revision: "1645", kb: "5003698"},
|
|
{revision: "1646", kb: "5004946"},
|
|
{revision: "1679", kb: "5004245"},
|
|
{revision: "1714", kb: "5004293"},
|
|
{revision: "1734", kb: "5005031"},
|
|
{revision: "1766", kb: "5005103"},
|
|
{revision: "1801", kb: "5005566"},
|
|
{revision: "1830", kb: "5005624"},
|
|
{revision: "1832", kb: "5005624"},
|
|
{revision: "1854", kb: "5006667"},
|
|
{revision: "1916", kb: "5007189"},
|
|
{revision: "1977", kb: "5008206"},
|
|
{revision: "2037", kb: "5009545"},
|
|
{revision: "2039", kb: "5010792"},
|
|
{revision: "2094", kb: "5010345"},
|
|
{revision: "2158", kb: "5011485"},
|
|
{revision: "2212", kb: "5012591"},
|
|
{revision: "2274", kb: "5013945"},
|
|
},
|
|
},
|
|
},
|
|
"Version 2004": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-24ea91f4-36e7-d8fd-0ddb-d79d9d0cdbda
|
|
"19041": {
|
|
rollup: []windowsRelease{
|
|
{revision: "264", kb: ""},
|
|
{revision: "329", kb: "4557957"},
|
|
{revision: "331", kb: "4567523"},
|
|
{revision: "388", kb: "4565503"},
|
|
{revision: "423", kb: "4568831"},
|
|
{revision: "450", kb: "4566782"},
|
|
{revision: "488", kb: "4571744"},
|
|
{revision: "508", kb: "4571756"},
|
|
{revision: "546", kb: "4577063"},
|
|
{revision: "572", kb: "4579311"},
|
|
{revision: "610", kb: "4580364"},
|
|
{revision: "630", kb: "4586781"},
|
|
{revision: "631", kb: "4594440"},
|
|
{revision: "662", kb: "4586853"},
|
|
{revision: "685", kb: "4592438"},
|
|
{revision: "746", kb: "4598242"},
|
|
{revision: "789", kb: "4598291"},
|
|
{revision: "804", kb: "4601319"},
|
|
{revision: "844", kb: "4601382"},
|
|
{revision: "867", kb: "5000802"},
|
|
{revision: "868", kb: "5001567"},
|
|
{revision: "870", kb: "5001649"},
|
|
{revision: "906", kb: "5000842"},
|
|
{revision: "928", kb: "5001330"},
|
|
{revision: "964", kb: "5001391"},
|
|
{revision: "985", kb: "5003173"},
|
|
{revision: "1023", kb: "5003214"},
|
|
{revision: "1052", kb: "5003637"},
|
|
{revision: "1055", kb: "5004476"},
|
|
{revision: "1081", kb: "5003690"},
|
|
{revision: "1082", kb: "5004760"},
|
|
{revision: "1083", kb: "5004945"},
|
|
{revision: "1110", kb: "5004237"},
|
|
{revision: "1151", kb: "5004296"},
|
|
{revision: "1165", kb: "5005033"},
|
|
{revision: "1202", kb: "5005101"},
|
|
{revision: "1237", kb: "5005565"},
|
|
{revision: "1266", kb: "5005611"},
|
|
{revision: "1288", kb: "5006670"},
|
|
{revision: "1320", kb: "5006738"},
|
|
{revision: "1348", kb: "5007186"},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
},
|
|
},
|
|
},
|
|
"Version 20H2": {
|
|
// https://support.microsoft.com/en-us/topic/windows-10-update-history-7dd3071a-3906-fa2c-c342-f7f86728a6e3
|
|
"19042": {
|
|
rollup: []windowsRelease{
|
|
{revision: "572", kb: ""},
|
|
{revision: "610", kb: "4580364"},
|
|
{revision: "630", kb: "4586781"},
|
|
{revision: "631", kb: "4594440"},
|
|
{revision: "662", kb: "4586853"},
|
|
{revision: "685", kb: "4592438"},
|
|
{revision: "746", kb: "4598242"},
|
|
{revision: "789", kb: "4598291"},
|
|
{revision: "804", kb: "4601319"},
|
|
{revision: "844", kb: "4601382"},
|
|
{revision: "867", kb: "5000802"},
|
|
{revision: "868", kb: "5001567"},
|
|
{revision: "870", kb: "5001649"},
|
|
{revision: "906", kb: "5000842"},
|
|
{revision: "928", kb: "5001330"},
|
|
{revision: "964", kb: "5001391"},
|
|
{revision: "985", kb: "5003173"},
|
|
{revision: "1023", kb: "5003214"},
|
|
{revision: "1052", kb: "5003637"},
|
|
{revision: "1055", kb: "5004476"},
|
|
{revision: "1081", kb: "5003690"},
|
|
{revision: "1082", kb: "5004760"},
|
|
{revision: "1083", kb: "5004945"},
|
|
{revision: "1110", kb: "5004237"},
|
|
{revision: "1151", kb: "5004296"},
|
|
{revision: "1165", kb: "5005033"},
|
|
{revision: "1202", kb: "5005101"},
|
|
{revision: "1237", kb: "5005565"},
|
|
{revision: "1266", kb: "5005611"},
|
|
{revision: "1288", kb: "5006670"},
|
|
{revision: "1320", kb: "5006738"},
|
|
{revision: "1348", kb: "5007186"},
|
|
{revision: "1387", kb: "5007253"},
|
|
{revision: "1415", kb: "5008212"},
|
|
{revision: "1466", kb: "5009543"},
|
|
{revision: "1469", kb: "5010793"},
|
|
{revision: "1503", kb: "5009596"},
|
|
{revision: "1526", kb: "5010342"},
|
|
{revision: "1566", kb: "5010415"},
|
|
{revision: "1586", kb: "5011487"},
|
|
{revision: "1620", kb: "5011543"},
|
|
{revision: "1645", kb: "5012599"},
|
|
{revision: "1682", kb: "5011831"},
|
|
{revision: "1706", kb: "5013942"},
|
|
{revision: "1708", kb: "5015020"},
|
|
{revision: "1741", kb: "5014023"},
|
|
{revision: "1766", kb: "5014699"},
|
|
{revision: "1767", kb: "5016139"},
|
|
{revision: "1806", kb: "5014666"},
|
|
{revision: "1826", kb: "5015807"},
|
|
{revision: "1865", kb: "5015878"},
|
|
{revision: "1889", kb: "5016616"},
|
|
{revision: "1949", kb: "5016688"},
|
|
{revision: "2006", kb: "5017308"},
|
|
{revision: "2075", kb: "5017380"},
|
|
{revision: "2130", kb: "5018410"},
|
|
{revision: "2132", kb: "5020435"},
|
|
{revision: "2193", kb: "5018482"},
|
|
{revision: "2194", kb: "5020953"},
|
|
{revision: "2251", kb: "5019959"},
|
|
{revision: "2311", kb: "5020030"},
|
|
{revision: "2364", kb: "5021233"},
|
|
{revision: "2486", kb: "5022282"},
|
|
{revision: "2546", kb: "5019275"},
|
|
{revision: "2604", kb: "5022834"},
|
|
{revision: "2673", kb: "5022906"},
|
|
{revision: "2728", kb: "5023696"},
|
|
{revision: "2788", kb: "5023773"},
|
|
{revision: "2846", kb: "5025221"},
|
|
{revision: "2965", kb: "5026361"},
|
|
},
|
|
},
|
|
},
|
|
"2022": {
|
|
// https://support.microsoft.com/en-us/topic/windows-server-2022-update-history-e1caa597-00c5-4ab9-9f3e-8212fe80b2ee
|
|
"20348": {
|
|
rollup: []windowsRelease{
|
|
{revision: "230", kb: "5005575"},
|
|
{revision: "261", kb: "5005619"},
|
|
{revision: "288", kb: "5006699"},
|
|
{revision: "320", kb: "5006745"},
|
|
{revision: "350", kb: "5007205"},
|
|
{revision: "380", kb: "5007254"},
|
|
{revision: "405", kb: "5008223"},
|
|
{revision: "407", kb: "5010197"},
|
|
{revision: "469", kb: "5009555"},
|
|
{revision: "473", kb: "5010796"},
|
|
{revision: "502", kb: "5009608"},
|
|
{revision: "524", kb: "5010354"},
|
|
{revision: "558", kb: "5010421"},
|
|
{revision: "587", kb: "5011497"},
|
|
{revision: "617", kb: "5011558"},
|
|
{revision: "643", kb: "5012604"},
|
|
{revision: "681", kb: "5012637"},
|
|
{revision: "707", kb: "5013944"},
|
|
{revision: "709", kb: "5015013"},
|
|
{revision: "740", kb: "5014021"},
|
|
{revision: "768", kb: "5014678"},
|
|
{revision: "803", kb: "5014665"},
|
|
{revision: "825", kb: "5015827"},
|
|
{revision: "859", kb: "5015879"},
|
|
{revision: "887", kb: "5016627"},
|
|
{revision: "946", kb: "5016693"},
|
|
{revision: "1006", kb: "5017316"},
|
|
{revision: "1070", kb: "5017381"},
|
|
{revision: "1129", kb: "5018421"},
|
|
{revision: "1131", kb: "5020436"},
|
|
{revision: "1194", kb: "5018485"},
|
|
{revision: "1249", kb: "5019081"},
|
|
{revision: "1251", kb: "5021656"},
|
|
{revision: "1311", kb: "5020032"},
|
|
{revision: "1366", kb: "5021249"},
|
|
{revision: "1368", kb: "5022553"},
|
|
{revision: "1487", kb: "5022291"},
|
|
{revision: "1547", kb: "5022842"},
|
|
{revision: "1607", kb: "5023705"},
|
|
{revision: "1668", kb: "5025230"},
|
|
{revision: "1726", kb: "5026370"},
|
|
{revision: "1787", kb: "5027225"},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
func (o *windows) detectKBsFromKernelVersion() (models.WindowsKB, error) {
|
|
switch ss := strings.Split(o.Kernel.Version, "."); len(ss) {
|
|
case 3:
|
|
return models.WindowsKB{}, nil
|
|
case 4:
|
|
switch {
|
|
case strings.HasPrefix(o.getDistro().Release, "Windows 10 "), strings.HasPrefix(o.getDistro().Release, "Windows 11 "):
|
|
osver := strings.Split(o.getDistro().Release, " ")[1]
|
|
|
|
verReleases, ok := windowsReleases["Client"][osver]
|
|
if !ok {
|
|
return models.WindowsKB{}, nil
|
|
}
|
|
|
|
rels, ok := verReleases[ss[2]]
|
|
if !ok {
|
|
return models.WindowsKB{}, nil
|
|
}
|
|
|
|
nMyRevision, err := strconv.Atoi(ss[3])
|
|
if err != nil {
|
|
return models.WindowsKB{}, xerrors.Errorf("Failed to parse revision number. err: %w", err)
|
|
}
|
|
|
|
var index int
|
|
for i, r := range rels.rollup {
|
|
nRevision, err := strconv.Atoi(r.revision)
|
|
if err != nil {
|
|
return models.WindowsKB{}, xerrors.Errorf("Failed to parse revision number. err: %w", err)
|
|
}
|
|
if nMyRevision < nRevision {
|
|
break
|
|
}
|
|
index = i
|
|
}
|
|
|
|
var kbs models.WindowsKB
|
|
for _, r := range rels.rollup[:index+1] {
|
|
if r.kb != "" {
|
|
kbs.Applied = append(kbs.Applied, r.kb)
|
|
}
|
|
}
|
|
for _, r := range rels.rollup[index+1:] {
|
|
if r.kb != "" {
|
|
kbs.Unapplied = append(kbs.Unapplied, r.kb)
|
|
}
|
|
}
|
|
|
|
return kbs, nil
|
|
case strings.HasPrefix(o.getDistro().Release, "Windows Server 2016"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 1709"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 1809"), strings.HasPrefix(o.getDistro().Release, "Windows Server 2019"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 1903"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 1909"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 2004"), strings.HasPrefix(o.getDistro().Release, "Windows Server, Version 20H2"), strings.HasPrefix(o.getDistro().Release, "Windows Server 2022"):
|
|
osver := strings.TrimSpace(strings.NewReplacer("Windows Server", "", ",", "", "(Server Core installation)", "").Replace(o.getDistro().Release))
|
|
|
|
verReleases, ok := windowsReleases["Server"][osver]
|
|
if !ok {
|
|
return models.WindowsKB{}, nil
|
|
}
|
|
|
|
rels, ok := verReleases[ss[2]]
|
|
if !ok {
|
|
return models.WindowsKB{}, nil
|
|
}
|
|
|
|
nMyRevision, err := strconv.Atoi(ss[3])
|
|
if err != nil {
|
|
return models.WindowsKB{}, xerrors.Errorf("Failed to parse revision number. err: %w", err)
|
|
}
|
|
|
|
var index int
|
|
for i, r := range rels.rollup {
|
|
nRevision, err := strconv.Atoi(r.revision)
|
|
if err != nil {
|
|
return models.WindowsKB{}, xerrors.Errorf("Failed to parse revision number. err: %w", err)
|
|
}
|
|
if nMyRevision < nRevision {
|
|
break
|
|
}
|
|
index = i
|
|
}
|
|
|
|
var kbs models.WindowsKB
|
|
for _, r := range rels.rollup[:index+1] {
|
|
if r.kb != "" {
|
|
kbs.Applied = append(kbs.Applied, r.kb)
|
|
}
|
|
}
|
|
for _, r := range rels.rollup[index+1:] {
|
|
if r.kb != "" {
|
|
kbs.Unapplied = append(kbs.Unapplied, r.kb)
|
|
}
|
|
}
|
|
|
|
return kbs, nil
|
|
default:
|
|
return models.WindowsKB{}, nil
|
|
}
|
|
default:
|
|
return models.WindowsKB{}, xerrors.Errorf("unexpected kernel version. expected: <major version>.<minor version>.<build>(.<revision>), actual: %s", o.Kernel.Version)
|
|
}
|
|
}
|
|
|
|
func (o *windows) detectPlatform() {
|
|
if o.getServerInfo().Mode.IsOffline() {
|
|
o.setPlatform(models.Platform{Name: "unknown"})
|
|
return
|
|
}
|
|
|
|
ok, instanceID, err := o.detectRunningOnAws()
|
|
if err != nil {
|
|
o.setPlatform(models.Platform{Name: "other"})
|
|
return
|
|
}
|
|
if ok {
|
|
o.setPlatform(models.Platform{
|
|
Name: "aws",
|
|
InstanceID: instanceID,
|
|
})
|
|
return
|
|
}
|
|
|
|
//TODO Azure, GCP...
|
|
o.setPlatform(models.Platform{Name: "other"})
|
|
}
|
|
|
|
func (o *windows) detectRunningOnAws() (bool, string, error) {
|
|
if r := o.exec("Invoke-WebRequest -MaximumRetryCount 3 -TimeoutSec 1 -NoProxy http://169.254.169.254/latest/meta-data/instance-id", noSudo); r.isSuccess() {
|
|
id := strings.TrimSpace(r.Stdout)
|
|
if o.isAwsInstanceID(id) {
|
|
return true, id, nil
|
|
}
|
|
}
|
|
|
|
if r := o.exec("Invoke-WebRequest -Method Put -MaximumRetryCount 3 -TimeoutSec 1 -NoProxy -Headers @{\"X-aws-ec2-metadata-token-ttl-seconds\"=\"300\"} http://169.254.169.254/latest/api/token", noSudo); r.isSuccess() {
|
|
r := o.exec(fmt.Sprintf("Invoke-WebRequest -MaximumRetryCount 3 -TimeoutSec 1 -NoProxy -Headers @{\"X-aws-ec2-metadata-token\"=\"%s\"} http://169.254.169.254/latest/meta-data/instance-id", strings.TrimSpace(r.Stdout)), noSudo)
|
|
if r.isSuccess() {
|
|
id := strings.TrimSpace(r.Stdout)
|
|
if !o.isAwsInstanceID(id) {
|
|
return false, "", nil
|
|
}
|
|
return true, id, nil
|
|
}
|
|
}
|
|
|
|
if r := o.exec("where.exe curl.exe", noSudo); r.isSuccess() {
|
|
if r := o.exec("curl.exe --max-time 1 --noproxy 169.254.169.254 http://169.254.169.254/latest/meta-data/instance-id", noSudo); r.isSuccess() {
|
|
id := strings.TrimSpace(r.Stdout)
|
|
if o.isAwsInstanceID(id) {
|
|
return true, id, nil
|
|
}
|
|
}
|
|
|
|
if r := o.exec("curl.exe -X PUT --max-time 1 --noproxy 169.254.169.254 -H \"X-aws-ec2-metadata-token-ttl-seconds: 300\" http://169.254.169.254/latest/api/token", noSudo); r.isSuccess() {
|
|
if r := o.exec(fmt.Sprintf("curl.exe -H \"X-aws-ec2-metadata-token: %s\" --max-time 1 --noproxy 169.254.169.254 http://169.254.169.254/latest/meta-data/instance-id", strings.TrimSpace(r.Stdout)), noSudo); r.isSuccess() {
|
|
id := strings.TrimSpace(r.Stdout)
|
|
if !o.isAwsInstanceID(id) {
|
|
return false, "", nil
|
|
}
|
|
return true, id, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
return false, "", xerrors.Errorf("Failed to Invoke-WebRequest or curl.exe to AWS instance metadata on %s. container: %s", o.ServerInfo.ServerName, o.ServerInfo.Container.Name)
|
|
}
|