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

บทนำ: ทำไม License Management ถึงเป็นเรื่องที่ Admin ต้องจริงจัง

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

PowerShell คือคำตอบที่ช่วยให้ Admin สามารถทำสิ่งเหล่านี้ได้ในไม่กี่วินาที ด้วย Microsoft Graph PowerShell SDK ที่เป็น Standard ในปัจจุบัน (แทนที่ MSOnline และ AzureAD Module เดิมที่ถูก Deprecate ไปแล้ว) เราสามารถเขียน Script อัตโนมัติเพื่อจัดการ License ได้อย่างแม่นยำและปลอดภัย

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

เตรียมความพร้อมก่อนเริ่มใช้งาน

ก่อนรัน Script ทุกตัวในบทความนี้ ให้ตรวจสอบว่าได้ติดตั้งและเชื่อมต่อด้วย Microsoft Graph PowerShell เรียบร้อยแล้ว:

  • ติดตั้ง Module: Install-Module Microsoft.Graph -Scope CurrentUser
  • เชื่อมต่อด้วย Permission ที่เหมาะสม: Connect-MgGraph -Scopes "User.ReadWrite.All", "Organization.Read.All"
  • ตรวจสอบว่า Account ที่ใช้มีสิทธิ์ License Administrator หรือ Global Administrator
  • แนะนำให้ทดสอบใน Test Tenant ก่อนนำไปใช้จริงเสมอ

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

Script แรกนี้ใช้สำหรับดูภาพรวม License ขององค์กรว่ามีกี่ที่นั่ง, ใช้ไปแล้วกี่ที่นั่ง และเหลืออีกเท่าไหร่ เหมาะสำหรับทำรายงานให้ผู้บริหารหรือใช้วางแผนงบประมาณประจำปี

  • คำสั่งหลัก: Get-MgSubscribedSku เพื่อดึงข้อมูล SKU ทั้งหมด
  • แสดงผลเป็นตาราง: ชื่อ Product, จำนวนที่ซื้อ (PrepaidUnits), จำนวนที่ใช้งาน (ConsumedUnits), และจำนวนที่เหลือ
  • Export ผลลัพธ์เป็นไฟล์ CSV ด้วย Export-Csv -Path "LicenseReport.csv" -NoTypeInformation -Encoding UTF8
  • ตั้ง Schedule Task ให้รันทุกต้นเดือนและส่ง Email รายงานอัตโนมัติได้

Script ที่ 2: ค้นหา User ที่มี License แต่ไม่ได้ Login มานานกว่า 90 วัน

นี่คือ Script ที่ช่วยประหยัดเงินได้มากที่สุด! หลายองค์กรมี License ที่จ่ายเงินทุกเดือนแต่ไม่มีคนใช้งานจริง ไม่ว่าจะเป็นพนักงานที่ลาออกแต่ยังไม่ได้ Disable Account หรือ Account สำหรับ Project ที่จบไปแล้ว

  • ใช้ Get-MgUser ร่วมกับ Property SignInActivity เพื่อดึงวันที่ Login ล่าสุด
  • Filter เฉพาะ User ที่มี AssignedLicenses และมี LastSignInDateTime เกิน 90 วัน
  • สร้าง Report แสดง DisplayName, UserPrincipalName, License ที่ถืออยู่, และวันที่ Login ล่าสุด
  • ข้อควรระวัง: ไม่ควรลบ License อัตโนมัติโดยไม่มีการ Approve จาก Manager ให้ Export รายการไว้ Review ก่อนเสมอ

Script ที่ 3: Assign License อัตโนมัติตาม Group Membership

แทนที่จะ Assign License ทีละคน Script นี้จะอ่านข้อมูลจาก Security Group ใน Azure AD แล้ว Assign License ให้ทุกคนใน Group นั้นโดยอัตโนมัติ เหมาะสำหรับ Onboarding พนักงานใหม่เป็นกลุ่ม

  • ระบุ GroupId ของ Group ที่ต้องการ และ SkuId ของ License ที่จะ Assign
  • ใช้ Get-MgGroupMember ดึงรายชื่อสมาชิกใน Group ทั้งหมด
  • Loop ผ่านสมาชิกแต่ละคน ตรวจสอบว่ามี License อยู่แล้วหรือยังด้วย Get-MgUserLicenseDetail
  • Assign เฉพาะ User ที่ยังไม่มี License เพื่อป้องกัน Error และลดการใช้ API Call โดยไม่จำเป็น
  • บันทึก Log ทุกการ Assign พร้อม Timestamp ไว้ตรวจสอบภายหลัง

Script ที่ 4: Remove License เมื่อ User ถูก Disable

หนึ่งในปัญหาที่พบบ่อยคือพนักงานลาออกแล้ว IT Disable Account แต่ลืม Remove License ทำให้เสียค่าใช้จ่ายโดยเปล่าประโยชน์ Script นี้จะตรวจหา Disabled Account ที่ยังมี License อยู่และ Remove ออกให้อัตโนมัติ

  • ค้นหา User ที่มี AccountEnabled = False และยังมี AssignedLicenses อยู่ด้วย Get-MgUser -Filter "accountEnabled eq false"
  • ใช้ Set-MgUserLicense พร้อม Parameter RemoveLicenses เพื่อถอด License ออก
  • ส่ง Email แจ้ง IT Manager ทุกครั้งที่มีการ Remove License พร้อมระบุชื่อ User และ License ที่ถูกถอด
  • แนะนำให้รัน Script นี้ผ่าน Azure Automation หรือ Logic Apps แบบ Daily Schedule

Script ที่ 5: สร้าง Dashboard License ส่งรายงานผ่าน Teams

Script สุดท้ายนี้เป็นการนำทุกอย่างมารวมกัน โดยสร้างรายงานสรุปสถานะ License ทั้งหมดและส่งเข้า Microsoft Teams Channel โดยตรงผ่าน Incoming Webhook เหมาะสำหรับทีม IT ที่อยากเห็นสถานะแบบ Real-time โดยไม่ต้องเข้า Admin Center

  • รวบรวมข้อมูล: จำนวน License ที่ใช้งาน, License ที่เหลือ, Disabled User ที่ยังมี License, และ User ที่ไม่ได้ Login มานาน
  • จัดรูปแบบข้อความเป็น Adaptive Card ใน JSON Format เพื่อแสดงผลสวยงามใน Teams
  • ส่งข้อมูลผ่าน Invoke-RestMethod ไปยัง Webhook URL ของ Teams Channel
  • ตั้ง Schedule ให้รันทุกวันจันทร์เช้า 8:00 น. เพื่อให้ทีม IT เห็นภาพรวมก่อนเริ่มงานสัปดาห์

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

หลังจากที่ได้นำ Script เหล่านี้ไปใช้กับองค์กรหลายแห่ง มีสิ่งที่อยากแชร์เพิ่มเติมดังนี้:

  • ใช้ Service Principal แทน User Account: สำหรับ Script ที่รัน Automated ควรสร้าง App Registration ใน Azure AD และใช้ Certificate-based Authentication แทนการ Login ด้วย Password เพื่อความปลอดภัยและไม่ขาดการเชื่อมต่อเมื่อ Password เปลี่ยน
  • จัดการ Error Handling อย่างจริงจัง: ใส่ Try-Catch ทุก API Call และ Log Error ลงไฟล์ หรือส่งแจ้งเตือนผ่าน Teams เพื่อให้รู้ทันทีเมื่อ Script ทำงานผิดพลาด
  • ระวัง API Throttling: Microsoft Graph มีการจำกัด Request Rate ถ้า Script วน Loop ผู้ใช้จำนวนมากให้เพิ่ม Start-Sleep -Milliseconds 500 ระหว่าง Request เพื่อป้องกัน Error 429
  • ทดสอบด้วย -WhatIf เสมอ: Script ที่เกี่ยวกับการแก้ไขข้อมูลควรมี Parameter -WhatIf เพื่อให้ Preview ว่าจะเกิดอะไรขึ้นก่อน Execute จริง
  • เก็บ Script ใน Azure DevOps หรือ GitHub: การใช้ Version Control ช่วยให้ Rollback ได้เมื่อมีปัญหา และทำงานร่วมกับทีมได้สะดวก

สรุป และก้าวต่อไป

การบริหารจัดการ License Microsoft 365 ด้วย PowerShell ไม่ใช่เรื่องยากอีกต่อไป เมื่อมี Script ที่ถูกต้องอยู่ในมือ คุณสามารถลดเวลาที่ใช้ทำงาน Manual ได้อย่างมีนัยสำคัญ และที่สำคัญกว่านั้นคือช่วยให้องค์กรประหยัดค่าใช้จ่าย License ที่จ่ายโดยเปล่าประโยชน์ได้จริง จากประสบการณ์ที่พบในองค์กรขนาดกลาง-ใหญ่ การทำ License Audit ด้วย Script เพียงครั้งเดียวสามารถพบ License ที่ไม่ได้ใช้งานได้ถึง 10-20% ของจำนวนทั้งหมด

สำหรับก้าวต่อไป ลองนำ Script เหล่านี้ไปรวมกับ Azure Automation Runbook หรือ Microsoft Power Automate เพื่อสร้าง Workflow อัตโนมัติที่สมบูรณ์แบบยิ่งขึ้น และถ้าองค์กรใช้ Microsoft Entra ID Governance อยู่แล้ว ก็สามารถผสานการทำงานกับ Access Reviews เพื่อให้กระบวนการ License Management มีความโปร่งใสและตรวจสอบได้มากยิ่งขึ้น

มีคำถามหรืออยากแชร์ Script ที่คุณใช้งานอยู่? ทิ้งคอมเมนต์ไว้ด้านล่างได้เลยครับ ทีมงานยินดีตอบทุกคำถาม และถ้าบทความนี้มีประโยชน์ อย่าลืมแชร์ให้เพื่อน IT Admin ในองค์กรด้วยนะครับ!

Comments