2014-12-06 13 views
9

Tôi đang làm việc trên tập lệnh PowerShell để thực hiện một số tác vụ Windows Update. Hầu hết các nhiệm vụ tập trung vào việc thu thập các bản cập nhật Windows chưa được áp dụng, sử dụng đoạn mã bên dưới. Khi bộ sưu tập đó được trả về, tôi lặp lại thông qua nó và thực hiện các tác vụ như ẩn, tải xuống hoặc cài đặt các bản cập nhật.Slow WUA (API cập nhật Windows)

Tôi nhận thấy rằng mã này có thể mất từ ​​6 đến 115 giây để chạy. Thông thường, các lần chạy dài hơn sau khi máy đã khởi động lại hoặc không hoạt động trong hơn 15 phút.

Nhưng nếu tôi mở mục bảng điều khiển Windows Update, nó ngay lập tức biết số lượng cập nhật là nổi bật và có thể cung cấp cho tôi danh sách (bộ sưu tập) của những cập nhật chưa cập nhật đó. Nếu tôi nhấp vào liên kết "kiểm tra cập nhật" của WU, sẽ mất> 10 giây để kiểm tra lại và đôi khi việc kiểm tra đó sẽ mang lại kết quả khác với kết quả "biết" ngay lập tức khi tôi mở nó.

Vì vậy, tôi giả định rằng WUA duy trì bộ sưu tập các bản cập nhật được lưu trong bộ nhớ cache ở đâu đó, có thể được cập nhật tự động một lần mỗi ngày. Câu hỏi của tôi: làm cách nào để mã của tôi truy cập bộ nhớ cache đó, thay vì chạy mã "kiểm tra cập nhật" dài hơn được hiển thị bên dưới? Cụ thể, tôi hy vọng sẽ nhanh chóng có được một IUpdateCollection để làm việc.

$Session = New-Object -ComObject Microsoft.Update.Session    
$Searcher = $Session.CreateUpdateSearcher() 
$Searcher.Online = $false #tested $true and $false; $true slightly slower 
$Criteria = "IsInstalled=0 and Type='Software'" 
$SearchResult = $Searcher.Search($Criteria)   
$SearchResult.Updates 

Lưu ý rằng tất cả điều này đang xảy ra trên hệ thống Windows2012R2 hiện tại.

+0

Bạn đã kiểm tra các WindowsUpdate.log để xem những gì đang xảy ra? '$ Searcher.GetTotalHistoryCount()' hiển thị trước khi bạn chạy cái này? – xXhRQ8sD2L7Z

+0

ST8Z6FR57ABE6A8RE9UF - không có gì bất thường trong WindowsUpdate.log. Tôi thấy $ Searcher.GetTotalHistoryCount() bắt đầu và hoàn thành ngay lập tức (trở về "46"); $ Searcher.Search ($ Criteria) mất hơn sáu giây để hoàn thành. Không có lỗi. – quux

+0

Thật thú vị, tôi biết bạn có thể lấy số từ sổ đăng ký nhưng tất cả thông tin đó không có trong đó. Có thể tệp kê khai đọc của nó từ thư mục SoftwareDistribution? – xXhRQ8sD2L7Z

Trả lời

3

Dường như bộ nhớ cache là tệp CAB có tên wsusscn2.cab được tải xuống thường xuyên từ MSFT. Có một liên kết trực tiếp đến nó trong liên kết msdn mà tôi đã đăng bên dưới. Có lẽ viết một kịch bản tải xuống một lần mỗi ngày/tuần (có thể chia sẻ mạng nếu đây là một kịch bản được triển khai rộng rãi), và sau đó thay đổi tập lệnh của bạn để buộc nó luôn xem tệp CAB thay vì trực tuyến. Như thế này:

$Session = New-Object -ComObject Microsoft.Update.Session  
$UServiceManager = New-Object -ComObject Microsoft.Update.ServiceManager 
$UService = $UServiceManager.AddScanPackageService("Offline Sync Service", "c:\wsusscn2.cab") 
$Searcher = $Session.CreateUpdateSearcher() 
$Searcher.ServerSelection = 3 
$Searcher.ServiceID = $UService.ServiceID 
$Criteria = "IsInstalled=0 and Type='Software'" 
$SearchResult = $Searcher.Search($Criteria)   
$SearchResult.Updates 

msdn

+0

Điều này có vẻ khó xảy ra. 1) Một tìm kiếm của máy tính của tôi không tìm thấy bản sao của wsusscan2.cab 2) Trong tất cả các tài liệu tôi có thể tìm thấy, nó nói rằng tập tin này phải được tải xuống trước khi sử dụng. Vì vậy, trong khi đó là một cách để tiếp cận mọi thứ, có vẻ như đó không phải là bộ nhớ cache mà hệ thống sử dụng. – quux

+0

Ngoài ra: sử dụng Invoke-Webrequest, tải xuống tệp (hiện tại là 103 MB) mất nhiều thời gian hơn so với phương thức gốc của tôi! – quux

+0

việc sử dụng bộ nhớ cache ngoại tuyến 'Wsusscn2.cab' là chính thức và được ghi lại - https://msdn.microsoft.com/en-us/library/ff647642.aspx - mbsa fyi tạo, các kết quả tương tự với phương pháp powershell – Patrick

Các vấn đề liên quan