รายละเอียดระบบ:
Edition = Windows Server 2019 มาตรฐาน
รุ่น = 1809,
OS บิลด์ = 17763.2114
รหัสของฉัน:
- $UpdateSession = New-Object -ComObject Microsoft.Update.Session
- $UpdateServiceManager = New-Object -ComObject Microsoft.Update.ServiceManager
- $UpdateService = $UpdateServiceManager.AddScanPackageService("บริการซิงค์ออฟไลน์", $CabPath, 1)
- $UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
- $UpdateSearcher.ServerSelection = 3
- $UpdateSearcher.ServiceID = $UpdateService.ServiceID.ToString()
*แขวนที่นี่* - $Missing = $UpdateSearcher.Search("IsInstalled=0")
สคริปต์ PS ทำงานได้ดีบนเซิร์ฟเวอร์อื่น ๆ ที่มี 2012 R2, 2016 และ 2019; แต่อันนี้ทำให้ฉันปวดหัว เมื่อเริ่มค้นหา -Verbose จะหยุดให้เอาต์พุต (ด้วย Set-PSDebug -Trace 2)วิธีการค้นหานี้ใช้เวลาตั้งแต่ 3 - 15 นาทีในระบบอื่น แต่แม้จะผ่านไปแล้ว 24 ชั่วโมงก็ยังอยู่ในบรรทัดนี้
ในหัวข้ออื่น snip ด้านล่าง ฉันพบสิ่งที่อาจเป็นวิธีแก้ปัญหา แต่จำเป็นต้องรู้วิธีเปลี่ยนฟังก์ชันการค้นหาเป็น async ขณะค้นหา หรือมีวิธีอื่นในการดีบักเมธอดของ API นี้หรือไม่ WSUS ไม่สามารถรับการอัปเดตจากเซิร์ฟเวอร์ และบางเซิร์ฟเวอร์ไม่ได้รับการยอมรับจาก AD หรือ DNS ดังนั้นฉันจึงใช้สคริปต์ WUA api เพื่อค้นหาแบบออฟไลน์
โพสต์ก่อนหน้าโดย Elliot Labs LLC >>
ฉันได้พูดคุยกับผู้จัดการของ Microsoft ที่รับผิดชอบ Windows Update
(Dave Roth) และเขาบอกว่าคุณไม่ควรพยายามที่จะได้รับ
สถานะของ Windows Update ผ่านรีจิสตรี เค้าบอกว่าให้ใช้
COM API เพื่อรับสถานะโดยดำเนินการค้นหาและใช้
ผลลัพธ์ที่ส่งคืนสำหรับสถานะการอัปเดตของคอมพิวเตอร์ของคุณ
เขายังให้คำแนะนำนี้กับฉัน:
ในฐานะที่เป็น FYI ง่าย ๆ สำหรับการตรวจสอบว่ามีการติดตั้งการอัปเดตใดบ้าง
IUpdateSearcher::Search ด้วย IsInstalled=1 จะสร้าง
วัตถุ updatecollection ที่มีการปรับปรุงที่ติดตั้งทั้งหมด คุณสามารถเดิน
ผ่านมันเพื่อดูว่ามีการติดตั้งอะไรบ้าง
การขยายคำแนะนำของเขาคุณอาจเรียกวิธีการนั้นด้วย
IsInstalled=0 เพื่อดูว่าโปรแกรมปรับปรุงใดไม่ได้ติดตั้งไว้ (ดู
ตัวอย่าง PowerShell ด้านล่าง)
COM API
COM API เป็นวิธีที่ดีในการเข้าถึง Windows Update ได้โดยตรงโดยไม่ต้องใช้
ต้องแยกวิเคราะห์บันทึก การประยุกต์ใช้ API นี้มีตั้งแต่การค้นหา
การอัปเดตที่มีอยู่ในคอมพิวเตอร์เพื่อติดตั้งและถอนการติดตั้ง
การปรับปรุง
คุณสามารถใช้คลาส Microsoft.Update.Session เพื่อเรียกใช้การอัปเดต
ค้นหาแล้วนับจำนวนการอัปเดตที่มีเพื่อดูว่ามีหรือไม่
เป็นการปรับปรุงใด ๆ สำหรับคอมพิวเตอร์
ตัวอย่าง PowerShell:
$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "สคริปต์ตัวอย่างความผิดพลาดของเซิร์ฟเวอร์"
$updateSearcher = $updateObject.CreateUpdateSearcher() $searchResults
= $updateSearcher.Search("IsInstalled=0") เขียน-โฮสต์ $searchResults.Updates.Count หากผลลัพธ์ที่ส่งคืนมากกว่า 0
จากนั้นมีการอัปเดตสำหรับคอมพิวเตอร์ที่จำเป็นต้องติดตั้ง
และ/หรือดาวน์โหลด คุณสามารถอัปเดตสคริปต์ PowerShell ให้พอดีได้อย่างง่ายดาย
ใบสมัครของคุณ.
โปรดทราบว่าฟังก์ชันการค้นหาไม่ตรงกัน ดังนั้นจะทำให้แอปพลิเคชันของคุณหยุดทำงานขณะค้นหา ในกรณีที่คุณ
จะต้องการทำ async