วิธีสร้างรายงานการอัปเดต Windows PowerShell ขั้นพื้นฐาน
หากคุณเคยปรับใช้ Windows Updates กับไคลเอนต์บนเครือข่ายของคุณ ผู้จัดการของคุณอาจถามคุณว่าใช้งาน KB ใดบ้าง และเมื่อใดหากเกิดปัญหาบนเวิร์กสเตชันหรือเซิร์ฟเวอร์ น่าเสียดายที่บางครั้งเครื่องมือการรายงานเซิร์ฟเวอร์ WSUS ในตัวอาจทำให้คุณหงุดหงิดและไม่มีฟังก์ชันที่ยอดเยี่ยมสำหรับการสร้างสิ่งเหล่านี้นอก GUI การจัดการ WSUS คุณมีทางเลือกอื่น รายงาน PowerShell Windows Update!
จะบอกได้อย่างไรเมื่อจำเป็นต้องมีรายงาน PowerShell
เมื่อเร็วๆ นี้กลุ่มผู้จัดการถามฉันว่ากำลังตรวจสอบการสแกนช่องโหว่ด้านความปลอดภัยเพื่อขอความช่วยเหลือบางอย่าง การสแกนช่องโหว่นี้อ้างว่าชุดของระบบขาด Microsoft KB's, KB's ที่เพิ่งได้รับการอนุมัติ กำหนดเวลา และแสดงเป็นติดตั้งในคอนโซลการจัดการ WSUS
ฉันส่งภาพหน้าจอสถานะคอนโซลบางส่วนไปพร้อมกับการตอบกลับของผู้ดูแลระบบ ตอนนั้นฉันไม่ได้คิดมากเพราะฉันยุ่งกับโปรเจ็กต์อื่นและนี่เป็นคำขอประจำ
ผ่านไปประมาณหนึ่งวัน และมีการสแกนช่องโหว่อีกครั้ง ซึ่งผลลัพธ์ก็เหมือนเดิม ฝ่ายบริหารไม่มั่นใจว่ามีการติดตั้งโปรแกรมปรับปรุงแล้ว เมื่อมีปัญหากับ WSUS เป็นครั้งคราว ฉันเริ่มไม่ไว้วางใจรายงานในตัวและคอนโซลการจัดการ ฉันไม่รู้ว่าการอัปเดต Windows ยากขนาดนี้!
เพื่อเป็นความระมัดระวังและขยันมากขึ้นอีกหน่อย ฉันจึงตัดสินใจข้ามคอนโซลการจัดการ WSUS และตรงไปยังเวิร์กสเตชันและเซิร์ฟเวอร์ที่แสดงขึ้นมาในการสแกนช่องโหว่ด้านความปลอดภัย
ระดมความคิดรายงาน Windows Update
โชคดีที่การสแกนช่องโหว่ด้านความปลอดภัยพบเพียงประมาณ 4 เวิร์กสเตชันและ 12 เซิร์ฟเวอร์โดยที่คาดว่า KB เหล่านี้หายไป ดังนั้นฉันจึงสร้างรายการง่ายๆ ในไฟล์ข้อความโดยใช้ชื่อโดเมนแบบเต็ม (FQDN) ของแต่ละโฮสต์ ฉันรู้ด้วยว่า KB ที่หายไปนั้นจะถูกติดตั้งในช่วง 30 วันที่ผ่านมา ในขณะที่ฉันเพิ่งเสร็จสิ้นรอบการบำรุงรักษา
ด้วยความรู้นี้ในมือ ฉันจึงจดรหัสหลอกเพื่อช่วยฉันในการเริ่มต้น นี่คือสิ่งที่ฉันสรุปไว้:
- เก็บไฟล์ข้อความของฉันที่มีรายชื่อโฮสต์
- สำหรับแต่ละโฮสต์ในไฟล์นั้น ให้รันคำสั่ง
- คำสั่งจะต้องรวบรวม KB ที่ติดตั้งไว้ในช่วง 30 วันที่ผ่านมา
- ผลลัพธ์จะต้องมีชื่อโฮสต์, KB/HotFix ID และวันที่ติดตั้งเท่านั้น
- ผลลัพธ์จะต้องสามารถอ่านได้ และต้องเป็นไฟล์ธรรมดาเท่านั้น
- ไม่จำเป็นต้องมีการเขียนโค้ดที่หรูหรา เพียงเปรียบเทียบด้วยภาพกับสิ่งที่รายงาน WSUS แสดงอยู่
จากบันทึกของฉัน ฉันมีความคิดที่ดีว่ากำลังมองหาอะไรและ cmdlets ใดที่ฉันอาจต้องใช้ โฟกัสหลักอยู่ที่ cmdlet Get-HotFix cmdlet นี้สอบถามโปรแกรมแก้ไขด่วนทั้งหมด (โดยทั่วไปเรียกว่าการปรับปรุงความปลอดภัย) ที่ถูกนำไปใช้กับโฮสต์ Windows สามารถค้นหาการอัพเดตทั้งหมดหรือเฉพาะเจาะจงบนเครื่อง Windows คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ cmdlet นี้และวิธีการใช้งานได้ที่นี่
Get-HotFix ไม่รองรับการทำงานระยะไกลโดยนัย ดังนั้นฉันจึงจำเป็นต้องคิดวิธีการเรียกใช้ cmdlet นี้บนระบบที่ฉันต้องการรายงาน Inrigger-Command ทำและคุณสามารถส่งค่าหลายค่าไปยังพารามิเตอร์ ComputerName ได้
ฉันได้บันทึกรายชื่อโฮสต์ที่ฉันกำหนดเป้าหมายไว้แล้ว ดังนั้นฉันจะบันทึกตัวเองในการพิมพ์และจัดเก็บโฮสต์เหล่านั้นเป็นตัวแปร ในการทำเช่นนั้น ฉันจะต้องกำหนดชื่อตัวแปรและทำให้ค่าเป็นรายการโฮสต์
Get-Content จะอ่านเนื้อหาของไฟล์ข้อความทีละบรรทัดเพื่อสร้างอาร์เรย์ประเภทต่างๆ ลองเรียกอาร์เรย์นี้ว่า $Hosts ตอนนี้ฉันมีคำสั่ง ข้อมูลบางส่วนที่จะป้อนให้กับคำสั่งชุดถัดไป แต่ฉันต้องทำให้ข้อมูลผลลัพธ์สามารถอ่านได้และกระชับ
ฉันอยากจะใช้เวลาสักครู่เพื่อเน้นที่ “กรองก่อน จัดรูปแบบสุดท้าย” การจดจำสิ่งนี้จะช่วยคุณเมื่อทำงานกับสคริปต์ประเภทนี้ การเปิดเซสชัน PowerShell และเรียกใช้ cmdlet Get-Hotfix ด้วยตัวเองโดยทั่วไปจะส่งผลให้มีรายการอัปเดตจำนวนมากที่ถูกนำไปใช้กับโฮสต์
PS51> Get-HotFix
Source Description HotFixID InstalledBy InstalledOn
------ ----------- -------- ----------- -----------
MACWINVM Update KB2693643 MACWINVM\Administ... 3/14/2019 12:00:00 AM
MACWINVM Update KB4100347 NT AUTHORITY\SYSTEM 2/17/2019 12:00:00 AM
MACWINVM Update KB4230204 NT AUTHORITY\SYSTEM 7/6/2018 12:00:00 AM
MACWINVM Security Update KB4287903 NT AUTHORITY\SYSTEM 7/8/2018 12:00:00 AM
MACWINVM Security Update KB4338832 NT AUTHORITY\SYSTEM 7/21/2018 12:00:00 AM
MACWINVM Update KB4338853 NT AUTHORITY\SYSTEM 7/6/2018 12:00:00 AM
MACWINVM Update KB4343669 NT AUTHORITY\SYSTEM 7/19/2018 12:00:00 AM
MACWINVM Security Update KB4343902 NT AUTHORITY\SYSTEM 8/15/2018 12:00:00 AM
MACWINVM Update KB4346084 NT AUTHORITY\SYSTEM 5/11/2019 12:00:00 AM
MACWINVM Update KB4456655 NT AUTHORITY\SYSTEM 9/12/2018 12:00:00 AM
--snip--การกรองช่วยรวบรวมข้อมูลที่คุณต้องการ
หากไม่มีข้อมูลที่กรอง การจัดรูปแบบจะไม่มีประโยชน์ในตอนนี้ ลองนึกถึงการกรองเป็นข้อกำหนดประเภทข้อมูลของคุณ และจัดรูปแบบตามที่คุณต้องการให้แสดงข้อมูล เพื่อจุดประสงค์ของฉัน ฉันได้คิดข้อกำหนดต่างๆ ไว้แล้ว ฉันจำเป็นต้องติดตั้งการอัปเดตในช่วง 30 วันที่ผ่านมา
ในการกรอง ฉันจะต้องใช้ cmdlet Where-Object จากนั้นส่งต่อคุณสมบัติของสมาชิกบางส่วนและตัวดำเนินการเปรียบเทียบด้วยเส้นประทางคณิตศาสตร์ ในการดำเนินการนี้ ฉันจะนำทุกออบเจ็กต์ที่ส่งคืน ($_) จาก Get-HotFix และส่งสิ่งเหล่านั้นไปยัง Where-Object เพื่อค้นหาการอัปเดตทั้งหมด ติดตั้งในวันที่มากกว่า (-gt) วันที่วันนี้ (หรือเมื่อใดก็ตามที่ฉันเรียกใช้สคริปต์) ลบ (-30) วันที่แล้ว นั่นจะได้รับข้อมูลเริ่มต้นที่ฉันกำลังมองหา
Get-HotFix | Where-Object { $_.InstalledOn -gt ((Get-Date).AddDays(-30)) }
แต่ฉันต้องการกรองวัตถุที่ส่งคืนและคุณสมบัติเพิ่มเติมอีกเล็กน้อย นี่คือจุดที่ Select-Object จะช่วยได้ ช่วยให้ฉันสามารถลดจำนวนข้อมูลที่จะแสดงเป็นคุณสมบัติที่สำคัญเพียงไม่กี่อย่างเพิ่มเติมได้
Get-HotFix | Where-Object { $_.InstalledOn -gt ((Get-Date).AddDays(-30)) } |
Select-Object -Property PSComputerName, Description, HotFixID, InstalledOnตอนนี้ฉันได้กรองข้อมูลอย่างถูกต้องแล้ว ตอนนี้ฉันสามารถไปยังการจัดรูปแบบผลลัพธ์ให้อยู่ในรูปแบบที่ใช้งานได้ ในการทำเช่นนั้น ฉันจะไพพ์ ( | ) ผลลัพธ์จากการกรองครั้งก่อนของฉันไปที่ Format-Table -Autosize และส่งออกเป็นประเภทไฟล์ที่ฉันเลือก ฉันจะต้องใช้พารามิเตอร์ ผนวก และ -ErrorAction SilentlyContinue เพื่อให้แน่ใจว่าผลลัพธ์แต่ละรายการจะถูกเขียนลงในบรรทัดถัดไปในไฟล์เอาต์พุต และหากเกิดข้อผิดพลาด ผลลัพธ์จะไม่เกิดขึ้น' ไม่ทำให้โฮสต์ที่เหลือไม่ได้รับการติดต่อ
Format-Table -AutoSize |
Out-File -Encoding utf8 -FilePath '.\Recent_OS_Updates.txt' -Append -ErrorAction SilentlyContinueฉันเลือกที่จะใช้ไฟล์ข้อความเพราะฉันไม่ต้องการอะไรพิเศษ คุณสามารถเปลี่ยนเอาต์พุตให้ตรงกับความต้องการของคุณได้ ผลลัพธ์ของฉันดูคล้ายกับสิ่งนี้:
นี่คือสคริปต์สุดท้ายที่เกิดขึ้นและใช้งาน:
$Hosts = Get-Content -Path '.\hosts.txt'
Invoke-Command -ComputerName $Hosts -ScriptBlock {
Get-HotFix | Where-Object {
$_.InstalledOn -gt ((Get-Date).AddDays(-30))
} | Select-Object -Property PSComputerName, Description, HotFixID, InstalledOn
} | Format-Table -AutoSize |
Out-File -Encoding utf8 -FilePath '.\Recent_OS_Updates.txt' -Append -ErrorAction SilentlyContinueสำหรับฉัน สิ่งนี้เรียบง่าย กระชับ และเป็นข้อพิสูจน์ว่า KB ได้รับการติดตั้งจริงแล้ว โดยฝ่ายบริหารได้รับการตอบรับอย่างดีและอยู่ในรูปแบบที่อ่านง่าย
