Chi tiết HỆ THỐNG:
Phiên bản = Windows Server 2019 Standard,
Phiên bản = 1809,
Bản dựng hệ điều hành = 17763.2114
Mã của tôi:
- $UpdateSession = New-Object -ComObject Microsoft.Update.Session
- $UpdateServiceManager = New-Object -ComObject Microsoft.Update.ServiceManager
- $UpdateService = $UpdateServiceManager.AddScanPackageService("Dịch vụ đồng bộ hóa ngoại tuyến", $CabPath, 1)
- $UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
- $UpdateSearcher.ServerSelection = 3
- $UpdateSearcher.ServiceID = $UpdateService.ServiceID.ToString()
*TREO TẠI ĐÂY* - $Missing = $UpdateSearcher.Search("IsInstalled=0")
Tập lệnh PS chạy tốt trên một số máy chủ khác với 2012 R2, 2016 và 2019; nhưng, cái này làm tôi đau đầu. Sau khi bắt đầu tìm kiếm, -Verbose ngừng cung cấp đầu ra (với Set-PSDebug -Trace 2).Phương pháp tìm kiếm này đã mất từ 3 - 15 phút trên các hệ thống khác, nhưng thậm chí sau 24 giờ, nó vẫn ở trên một dòng này.
Trên một chủ đề khác, snip được cung cấp bên dưới, tôi đã tìm thấy giải pháp có thể là gì, nhưng cần biết cách chuyển chức năng tìm kiếm thành không đồng bộ trong khi tìm kiếm. Hoặc có cách nào khác để gỡ lỗi phương thức của API này không? WSUS không nhận được các bản cập nhật từ máy chủ và một số máy chủ không được AD hoặc DNS nhận dạng, vì vậy tôi đã sử dụng tập lệnh api WUA để tìm kiếm ngoại tuyến.
Bài trước của Elliot Labs LLC >>
Tôi đã nói chuyện với người quản lý tại Microsoft phụ trách Windows Update
(Dave Roth) và ông ấy nói rằng bạn tuyệt đối không nên cố lấy
trạng thái của Windows Update thông qua sổ đăng ký. Ông nói rằng bạn nên sử dụng
API COM để nhận trạng thái bằng cách thực hiện phương thức tìm kiếm và sử dụng
kết quả trả về cho trạng thái cập nhật của máy tính của bạn.
Anh ấy cũng cho tôi mẹo này:
Là một FYI đơn giản, để kiểm tra những bản cập nhật nào được cài đặt, hãy gọi
IUpdateSearcher::Search with IsInstalled=1 sẽ tạo ra một
đối tượng updatecollection chứa tất cả các bản cập nhật đã cài đặt. Bạn có thể đi
thông qua nó để xem những gì đã được cài đặt.
Mở rộng mẹo của anh ấy, bạn có thể gọi phương thức đó bằng
IsInstalled=0 để xem bản cập nhật nào chưa được cài đặt. (xem
ví dụ powershell bên dưới).
API COM
API COM là một cách tốt để truy cập trực tiếp Windows Update mà không cần
phải phân tích nhật ký. Các ứng dụng của phạm vi API này từ việc tìm kiếm
các bản cập nhật có sẵn trên máy tính để cài đặt và gỡ cài đặt
cập nhật.
Bạn có thể sử dụng lớp Microsoft.Update.Session để chạy bản cập nhật
tìm kiếm và sau đó đếm số lượng bản cập nhật có sẵn để xem có
là bất kỳ bản cập nhật nào cho máy tính.
Ví dụ PowerShell:
$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Tập lệnh ví dụ lỗi máy chủ"
$updateSearcher = $updateObject.CreateUpdateSearcher() $searchResults
= $updateSearcher.Search("IsInstalled=0") Write-Host $searchResults.Updates.Count Nếu kết quả trả về lớn hơn 0
sau đó có các bản cập nhật cho máy tính cần được cài đặt
và/hoặc đã tải xuống. Bạn có thể dễ dàng cập nhật tập lệnh powershell để phù hợp với
ứng dụng của bạn.
Xin lưu ý, có vẻ như chức năng tìm kiếm không đồng bộ nên nó sẽ đóng băng ứng dụng của bạn trong khi tìm kiếm. Trong trường hợp đó bạn
sẽ muốn làm cho nó không đồng bộ.