5 PowerShell Script จัดการ License Microsoft 365 อัตโนมัติที่ Admin ต้องมี

บทนำ: ทำไม Admin ถึงต้องจัดการ License อัตโนมัติ?

ในยุคที่องค์กรส่วนใหญ่ย้ายมาใช้ Microsoft 365 เป็นแพลตฟอร์มหลักสำหรับการทำงาน การจัดการ License ให้มีประสิทธิภาพถือเป็นหนึ่งในภารกิจที่สำคัญที่สุดของ IT Admin ปัญหาคลาสสิกที่พบบ่อย ได้แก่ License ที่ถูกจัดสรรให้กับ User ที่ออกจากองค์กรไปแล้วแต่ยังไม่ถูก Revoke, User ใหม่รอ License นานเกินไป หรือแม้แต่ทีม Finance ที่ต้องการรายงาน License ใช้งานจริงทุกเดือน สิ่งเหล่านี้กินเวลา Admin ไปอย่างน่าเสียดาย

การใช้ PowerShell ร่วมกับ Microsoft Graph API หรือโมดูล MSOnline / ExchangeOnlineManagement ช่วยให้ Admin สามารถ Automate งานที่ซ้ำซากเหล่านี้ได้อย่างสมบูรณ์แบบ ไม่ว่าจะเป็นการ Assign License, ดึงรายงาน, หรือแม้แต่ตรวจสอบ License ที่ไม่ได้ใช้งาน ทั้งหมดนี้ทำได้ผ่าน Script เพียงไม่กี่บรรทัด

บทความนี้รวบรวม 5 PowerShell Script ที่ IT Admin ในไทยควรมีติดมือไว้ประจำ พร้อมคำอธิบายการทำงานและเคล็ดลับจากประสบการณ์จริง เพื่อให้คุณสามารถนำไปปรับใช้ได้ทันทีในสภาพแวดล้อมของคุณ

เนื้อหาหลัก: 5 Script ที่ Admin ต้องมี

1. Script ดึงรายงาน License ทั้งหมดในองค์กร

ก่อนจะจัดการอะไร Admin ต้องรู้ก่อนว่าปัจจุบันองค์กรมี License อะไรบ้าง และถูกใช้งานไปเท่าไหร่แล้ว Script ด้านล่างใช้ Microsoft Graph PowerShell SDK เพื่อดึงข้อมูล SKU ทั้งหมด:

  • เชื่อมต่อด้วยคำสั่ง Connect-MgGraph -Scopes "Organization.Read.All"
  • ใช้ Get-MgSubscribedSku เพื่อดูรายการ License ทั้งหมด
  • Export ผลลัพธ์เป็น CSV ด้วย Export-Csv -Path "LicenseReport.csv" -NoTypeInformation
  • แสดงผลข้อมูล SkuPartNumber, ConsumedUnits, และ PrepaidUnits เพื่อคำนวณ License คงเหลือ

Script นี้เหมาะสำหรับรันเป็น Scheduled Task ทุกต้นเดือน เพื่อส่งรายงานให้ทีม Finance โดยอัตโนมัติ

2. Script Assign License ให้ User ใหม่จำนวนมาก (Bulk Assignment)

เมื่อมีพนักงานใหม่เข้ามาพร้อมกันหลายคน การ Assign License ทีละคนผ่าน Admin Center เป็นเรื่องน่าปวดหัวมาก Script นี้ช่วยให้คุณ Assign License แบบ Bulk ได้จากไฟล์ CSV:

  • เตรียมไฟล์ CSV ที่มีคอลัมน์ UserPrincipalName และ LicenseSku
  • ใช้ Import-Csv อ่านรายชื่อ User และวนลูปด้วย ForEach-Object
  • กำหนด UsageLocation ด้วย Update-MgUser ก่อน Assign เสมอ (ขั้นตอนที่คนมักลืม)
  • ใช้ Set-MgUserLicense พร้อม Parameter -AddLicenses เพื่อกำหนด SKU ที่ต้องการ
  • บันทึก Log ผลลัพธ์ทั้ง Success และ Error แยกออกมาเป็นไฟล์ต่างหาก

3. Script ตรวจหาและ Revoke License จาก Inactive User

License ที่จ่ายค่าใช้จ่ายอยู่ทุกเดือนแต่ไม่มีใครใช้งาน คือ "เงินที่หายไปเปล่า" Script นี้ตรวจสอบ User ที่ไม่ได้ Login มานานกว่า 90 วัน และ Revoke License โดยอัตโนมัติ:

  • ใช้ Get-MgAuditLogSignIn หรือดึงข้อมูล LastSignInDateTime จาก User Object
  • กรอง User ที่ AccountEnabled = $true แต่ไม่มีกิจกรรมในช่วง 90 วันที่ผ่านมา
  • ส่ง Email แจ้งเตือน User และ Manager ก่อน Revoke ล่วงหน้า 7 วัน ผ่าน Send-MgUserMail
  • ใช้ Set-MgUserLicense -RemoveLicenses เพื่อถอด License ออก
  • สร้าง Report สรุปว่าประหยัดเงินได้เท่าไหร่ต่อเดือน เพื่อรายงานผู้บริหาร

4. Script ตรวจสอบ License Service Plan ที่ถูก Disable

บางองค์กรซื้อ License แบบ E3 หรือ E5 แต่ต้องการ Disable Service Plan บางตัว เช่น ปิด Yammer หรือ Sway ตาม Policy ขององค์กร Script นี้ช่วยตรวจสอบว่า Service Plan ถูก Disable ตรงตาม Policy หรือไม่:

  • ดึงรายการ Assigned License และ Disabled Plan ของ User ทุกคน
  • เปรียบเทียบกับ Policy Template ที่กำหนดไว้ใน Script
  • สร้างรายงาน User ที่มีการตั้งค่าผิดไปจาก Standard
  • แก้ไขอัตโนมัติสำหรับ User ที่ไม่ตรงกับ Policy โดยใช้ Set-MgUserLicense พร้อม DisabledPlans

5. Script แจ้งเตือนเมื่อ License ใกล้หมด

ไม่มีอะไรแย่ไปกว่าการที่ User ใหม่รอ Account ไม่ได้เพราะ License หมด Script นี้ตรวจสอบจำนวน License คงเหลือและส่ง Alert ทาง Microsoft Teams หรือ Email โดยอัตโนมัติ:

  • คำนวณ Available Units จากผลต่างของ PrepaidUnits และ ConsumedUnits
  • กำหนด Threshold เช่น หาก License เหลือน้อยกว่า 10% ให้ส่ง Alert
  • ส่ง Notification ผ่าน Teams Webhook โดยใช้ Invoke-RestMethod พร้อม Adaptive Card
  • รันเป็น Azure Automation Runbook เพื่อตรวจสอบทุกวันโดยไม่ต้องมี Server On-premises

เคล็ดลับจากประสบการณ์จริง (Practical Tips)

  • ใช้ Microsoft Graph แทน MSOnline Module: Microsoft ประกาศ Deprecate MSOnline และ AzureAD Module แล้ว ควรเปลี่ยนมาใช้ Microsoft.Graph PowerShell SDK เพื่อความยั่งยืนในระยะยาว
  • ใช้ Service Principal แทน User Account: สำหรับ Script ที่รันแบบ Automated ควรสร้าง App Registration ใน Azure AD และใช้ Client Secret หรือ Certificate แทนการ Login ด้วย User Account เพื่อหลีกเลี่ยงปัญหา MFA
  • ทดสอบด้วย -WhatIf เสมอ: ก่อนรัน Script จริงบน Production ให้ใส่ Logic จำลอง WhatIf เพื่อดูว่า Script จะทำอะไรบ้าง โดยไม่ต้องแก้ไขข้อมูลจริง
  • เก็บ Log ทุกครั้ง: ทุก Script ควรมีการ Write-Log บันทึกการทำงานพร้อม Timestamp เพื่อใช้ Troubleshoot เมื่อเกิดปัญหา และเพื่อ Compliance Audit
  • เก็บ Secret ใน Azure Key Vault: ห้ามเขียน Password หรือ Client Secret ลงใน Script โดยตรง ให้ดึงจาก Azure Key Vault ผ่าน Get-AzKeyVaultSecret แทน
  • ระวัง API Throttling: หากองค์กรมี User จำนวนมาก การเรียก API ติดต่อกันเร็วเกินไปอาจโดน Throttle ให้เพิ่ม Start-Sleep -Milliseconds 100 ระหว่าง Loop หรือใช้ Batch Request

สรุปและ Call to Action

การจัดการ Microsoft 365 License ด้วย PowerShell ไม่ใช่เรื่องของการประหยัดเวลาเท่านั้น แต่ยังช่วยลดต้นทุน, เพิ่มความถูกต้องแม่นยำ, และช่วยให้องค์กรสามารถ Audit ได้ตลอดเวลา ทั้ง 5 Script ที่นำเสนอในบทความนี้ครอบคลุมทุก Lifecycle ของ License ตั้งแต่การรายงาน, การ Assign, การ Revoke, การตรวจสอบ Policy จนถึงการแจ้งเตือน

สำหรับ IT Admin ที่เพิ่งเริ่มต้นกับ PowerShell และ Microsoft Graph แนะนำให้เริ่มจาก Script ที่ 1 (รายงาน License) ก่อน เพราะเป็น Read-Only และปลอดภัยที่สุด จากนั้นค่อยๆ ศึกษา Script ที่มีการแก้ไขข้อมูลในลำดับถัดไป อย่าลืมทดสอบใน Test Tenant ก่อนนำไปใช้งานจริงเสมอ

คุณใช้ PowerShell จัดการ License อยู่แล้วหรือยัง? หากมีคำถามเพิ่มเติมหรืออยากแชร์ Script ที่ใช้งานในองค์กรของคุณ ฝากคอมเมนต์ไว้ด้านล่างได้เลย และอย่าลืม Subscribe เพื่อติดตามบทความ IT Pro ภาษาไทยใหม่ๆ ทุกสัปดาห์!

Comments

Popular posts from this blog

Microsoft Sentinel: SIEM บน Azure ที่ IT Admin ไทยควรรู้จักในปี 2026

Azure Active Directory / Entra ID — แนวทางการจัดการ Identity อย่างมืออาชีพสำหรับองค์กรไทย

ปลดล็อกพลัง Microsoft Defender for Endpoint: 5 Tips & Tricks ที่ Admin สายลุยต้องรู้! (ฉบับปี 2026)