การใช้ Power Automate และ Azure Automation เพื่อจัดการวงจรการใช้งานของไซต์ SharePoint
SharePoint Sprawl เป็นปัญหาที่แท้จริง
ลักษณะสำคัญของสภาพแวดล้อม Microsoft 365 ที่มีการจัดการอย่างดีคือเพื่อให้แน่ใจว่าออบเจ็กต์ เช่น ไซต์ SharePoint (และโดยส่วนขยายคือ Microsoft Teams) จะถูกลบออกเมื่อไม่จำเป็นอีกต่อไป ฉันได้พูดคุยกับหลายองค์กรที่ปรับใช้ผู้เช่า Microsoft 365 โดยไม่ต้องคำนึงถึงวิธีจัดการวงจรการใช้งานของไซต์ ผลลัพธ์สุดท้ายมักจะเสียใจ แม้ว่าปัญหาจะไม่ปรากฏในช่วงสองสามปีแรก แต่เมื่อเวลาผ่านไป ผู้ดูแลระบบของผู้เช่าเริ่มสังเกตเห็นว่าการแพร่ขยายของอ็อบเจ็กต์ในผู้เช่าทำให้การจัดการในแต่ละวันเป็นเรื่องยากมาก ตัวอย่างเช่น สภาพแวดล้อมที่ขาดการกำกับดูแลที่เหมาะสมมีแนวโน้มที่จะมีข้อมูลที่ล้าสมัยจำนวนมากกระจายอยู่ในไซต์ SharePoint จำนวนมาก ซึ่งนำไปสู่ความสับสนของผู้ดูแลระบบและผู้ใช้
ในบทความนี้ ฉันสำรวจวิธีการรวมทักษะพื้นฐานของ PowerShell และ Azure Automation เข้ากับ Power Automate เพื่อสร้างวิธีที่สะอาดและมีประสิทธิภาพในการทำให้ผู้เช่า Microsoft 365 ของคุณปลอดจากการแผ่ขยายมากเกินไป
เหตุใดนโยบายการหมดอายุของกลุ่มจึงไม่เหมาะกับคุณ
คำตอบของ Microsoft ต่อการแผ่ขยายกลุ่ม/ทีมคือนโยบายการหมดอายุของกลุ่ม ในระดับพื้นฐาน การหมดอายุทำงานได้ดีเป็นวิธีง่ายๆ ในการลบกลุ่มที่เก่ากว่าหรือไม่ได้ใช้งานภายในผู้เช่า Microsoft 365 แม้ว่าสัญญาณที่จำกัดจาก Microsoft Graph จะทำให้การหมดอายุตามกิจกรรมไม่น่าเชื่อถือก็ตาม นโยบายการหมดอายุอนุญาตให้เจ้าของกลุ่มอนุมัติการลบกลุ่มหรือต่ออายุกลุ่มเพื่อป้องกันการลบ โดยส่งการแจ้งเตือนหลายครั้งไปยังผู้ใช้เพื่อให้แน่ใจว่าจะไม่พลาดการต่ออายุ
ปัญหาเกี่ยวกับนโยบายการหมดอายุคือเมื่อข้อกำหนดของคุณไม่สอดคล้องกับวิสัยทัศน์ของ Microsoft เกี่ยวกับการหมดอายุของกลุ่ม ตัวอย่างเช่น รองรับนโยบายการหมดอายุของกลุ่มเดียวเท่านั้นต่อผู้เช่า ทุกกลุ่มที่อยู่ในขอบเขตของนโยบายการหมดอายุจะมีระยะเวลาหมดอายุเท่ากัน อีกตัวอย่างหนึ่งคือเมื่อคุณมีกลุ่มที่คุณไม่ต้องการรวมไว้ในนโยบายการหมดอายุ นโยบายการหมดอายุมีการตั้งค่าสองแบบสำหรับการมอบหมาย: กลุ่มทั้งหมดหรือกลุ่มที่เลือก (สูงสุด 500) นอกจากนี้ นโยบายการหมดอายุของกลุ่ม (ตามที่คุณบอกได้ด้วยชื่อ) จะเน้นไปที่ไซต์ทีมที่เชื่อมต่อกับกลุ่มโดยเฉพาะ และไม่ครอบคลุมไซต์ SharePoint Online อื่นๆ เช่น ไซต์การติดต่อสื่อสาร นโยบายการหมดอายุของกลุ่มยังจำเป็นต้องมีใบอนุญาต Entra ID Premium ซึ่งอาจเป็นตัวบล็อกสำหรับบางองค์กรได้
แม้ว่านโยบายการหมดอายุจะมีประโยชน์ในบางสถานการณ์ แต่การขาดความยืดหยุ่นและการปรับแต่งเพื่อควบคุมการหมดอายุของกลุ่มมักจะโน้มน้าวให้ผู้เช่าสำรวจโซลูชันแบบกำหนดเองบางรูปแบบ
การรวม Azure Automation และ Power Automate
บทความมากมายเกี่ยวกับ Practical 365 แสดงให้เห็นถึงคุณค่าของ Azure Automation เมื่อต้องเผชิญกับความจำเป็นในการดำเนินการด้านการดูแลระบบแบบอัตโนมัติ ตัวอย่างเช่น ก่อนหน้านี้ฉันเคยเขียนหัวข้อที่คล้ายกันในเรื่องการทำให้ Teams เป็นระเบียบเรียบร้อยด้วยระบบอัตโนมัติ สำหรับงานแบบเป็นโปรแกรมที่ทำซ้ำได้ Azure Automation เป็นเครื่องมือที่ยอดเยี่ยมสำหรับผู้ดูแลระบบผู้เช่าที่ควรมีในกล่องเครื่องมือ Azure Automation สามารถทำงานหนักได้มากสำหรับโซลูชันนี้ แต่สิ่งหนึ่งที่ไม่สามารถให้ได้ (เนื่องจากลักษณะของ Azure Automation ที่ใช้งานสคริปต์แบบง่ายบนกล่อง Linux ที่โฮสต์) คือกระบวนการอนุมัติสำหรับการลบวัตถุ
นั่นคือที่มาของ Power Automate โดยเฉพาะฟังก์ชันการอนุมัติใน Power Automate เป็นวิธีง่ายๆ ในการสร้างโฟลว์การอนุมัติที่ใช้งานง่าย การแจ้งเตือนการอนุมัติสามารถจัดการได้ทั้งใน Teams และ Outlook สำหรับผู้ใช้ ทำให้การตอบสนองต่อการแจ้งเตือนการหมดอายุค่อนข้างลำบาก
สุดท้ายนี้ จำเป็นต้องรักษารายชื่อไซต์ที่จะรวมและเวลาหมดอายุที่เกี่ยวข้องไว้ มีหลายตัวเลือกในการจัดเก็บรายชื่อกลุ่มที่ต้องตรวจสอบการหมดอายุ เช่น ไฟล์ CSV ใน SharePoint หรือ Azure Storage หรือตาราง Dataverse สำหรับตัวอย่างนี้ ฉันใช้รายการ SharePoint เนื่องจากง่ายต่อการบำรุงรักษาและรองรับประวัติเวอร์ชันพื้นฐานและการบันทึกการตรวจสอบ เมื่อทุกอย่างเข้าที่แล้ว ผังกระบวนการจะเป็นไปตามโครงร่างในรูปที่ 1
รายการติดตามของ SharePoint
ในการติดตามสถานะการอนุมัติ ฉันใช้รายการ SharePoint เพื่อเก็บรายละเอียดสำคัญที่จำเป็นในการจัดการการหมดอายุของไซต์ รายการประกอบด้วยคอลัมน์ที่แสดงในตารางที่ 1
- Column Name
รายละเอียด
- SiteName
ฟิลด์บุคคลใช้เพื่อกำหนดผู้อนุมัติตั้งแต่หนึ่งรายขึ้นไปสำหรับแต่ละไซต์
- SiteURL
URL ของเว็บไซต์
- RetentionDays
ระยะเวลาหมดอายุเป็นวันสำหรับไซต์
- RemainingDays
ใช้เพื่อติดตามว่าเหลืออีกกี่วันจึงจะหมดอายุ
- MarkedforDeletion
-
ฟิลด์ตัวเลือกเพื่อติดตามว่าควรลบไซต์หรือไม่ ทางเลือกที่มีคือ: “ใช่” “ไม่ใช่” และ “รอการอนุมัติ”
- DeletedOn
ใช้เพื่อติดตามวันที่ที่ไซต์ถูกลบ
- Approver
ฟิลด์บุคคลที่ใช้เพื่อกำหนดผู้อนุมัติตั้งแต่หนึ่งรายขึ้นไปสำหรับแต่ละไซต์
รายการติดตาม (รูปที่ 2) เก็บรายละเอียดและสถานะปัจจุบันของแต่ละไซต์ภายในขอบเขตของกระบวนการหมดอายุ หากไซต์ไม่อยู่ในรายการ ไซต์นั้นจะไม่มีวันหมดอายุ
เมื่อสร้างรายการติดตาม ตรวจสอบให้แน่ใจว่าได้จัดทำดัชนีคอลัมน์ “Deletedon”, “MarkedforDeletion” และ “SiteURL” เพื่อให้ค้นหาได้จากคำขอ Graph API การตั้งค่าดัชนีสำหรับรายการนี้แสดงในรูปที่ 3
พาวเวอร์ โฟลว์อัตโนมัติ
Power Automate มีความยืดหยุ่นสูงและขั้นตอนในการประมวลผลการอนุมัติสามารถปรับแต่งได้เพื่อให้ตรงตามข้อกำหนดขององค์กร ฉันจะไม่เจาะลึกรายละเอียดระดับต่ำของการสร้างโฟลว์ Power Automate ที่นี่ แต่ฉันแนะนำให้อ่าน Teams และ Power Automate: ตัวอย่างเชิงปฏิบัติเพื่อทำให้งานเป็นแบบอัตโนมัติ หากคุณไม่คุ้นเคยกับ Power Automate
โฟลว์ Power Automate สำหรับกระบวนการหมดอายุเริ่มต้นด้วยทริกเกอร์ที่กำหนดเวลาไว้เพื่อให้ทำงานวันละครั้ง ในแต่ละวัน โฟลว์จะตรวจสอบรายการติดตาม และหากค่า "วันที่เหลือ" ไม่เป็น 0 ก็จะลดลง กระบวนการทริกเกอร์แสดงไว้ในรูปที่ 4
หากค่า "RemainingDays" อยู่ที่ 0 แสดงว่าไซต์หมดอายุ และดำเนินการกระบวนการอนุมัติ คอลัมน์ "MarkedForDeletion" ได้รับการอัปเดตด้วยค่า "PendingApproval" และการอนุมัติจะถูกส่งไปยังผู้ใช้ที่แสดงอยู่ในคอลัมน์ผู้อนุมัติ การกำหนดค่าสำหรับโฟลว์แสดงในรูปที่ 5
การอนุมัติจะถูกส่งไปยังรายชื่อผู้อนุมัติผ่านทางทั้ง Teams และ Outlook ผู้อนุมัติมีตัวเลือกในการอนุมัติการลบหรือปฏิเสธและรีเซ็ตอายุการใช้งานของกลุ่มอีกครั้ง (รูปที่ 6)
สุดท้าย หากผู้อนุมัติคนใดคนหนึ่งอนุมัติคำขอ โฟลว์จะอัปเดตฟิลด์ "MarkedforDeletion" เป็น "ใช่" หากพวกเขาปฏิเสธคำขอ โฟลว์จะรีเซ็ต “วันที่เหลืออยู่” เพื่อให้ตรงกับค่า “วันเก็บรักษา” โดยเริ่มเวลาหมดอายุอีกครั้ง (รูปที่ 7)
Azure Automation Runbook
บัญชีการทำงานอัตโนมัติและรันบุ๊กเป็นส่วนสุดท้ายของการกำหนดค่าที่จำเป็นสำหรับโซลูชัน รหัสที่ฉันใช้ในตัวอย่างนี้มีอยู่ใน GitHub Runbook ใช้โมดูล PowerShell สี่โมดูล ซึ่งจำเป็นต้องเพิ่มเป็นทรัพยากรสำหรับบัญชีอัตโนมัติ:
- Microsoft.Graph.Authentication เป็นสิ่งจำเป็นในการตรวจสอบสิทธิ์ Microsoft Graph API
- Microsoft.Graph.Groups เป็นสิ่งจำเป็นในการประมวลผลการลบไซต์ที่เชื่อมต่อกับกลุ่ม
- Microsoft.Graph.Sites เป็นสิ่งจำเป็นในการรวบรวมข้อมูลในแต่ละไซต์
- PnP.PowerShell จำเป็นต้องประมวลผลการลบไซต์การสื่อสาร เนื่องจาก Microsoft Graph API ยังไม่รองรับ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการติดตั้งและอัปเดตโมดูลสำหรับ Azure Automation โปรดดูบทความนี้
บัญชีการทำงานอัตโนมัติใช้ข้อมูลประจำตัวที่ได้รับการจัดการที่ระบบกำหนดเพื่อตรวจสอบสิทธิ์ Microsoft Graph และ PnP PowerShell ซึ่งคล้ายกับคำอธิบายในบทความนี้ สิทธิ์ที่จำเป็นในการกำหนดให้กับบริการหลักของข้อมูลประจำตัวที่ได้รับการจัดการคือ:
- Microsoft Graph - Group.ReadWrite.All - จำเป็นในการลบไซต์ที่เชื่อมต่อกับกลุ่ม
- Microsoft Graph - Sites.FullControl.All - จำเป็นในการดึงข้อมูลไซต์และจัดการไซต์
- Office 365 SharePoint Online - Sites.Manage.All - จำเป็นในการลบไซต์การติดต่อสื่อสารผ่าน PNP PowerShell
รหัสตัวอย่างนี้แสดงวิธีการเพิ่มสิทธิ์กราฟและ SharePoint ไปยังบัญชี Azure Automation โค้ดจะแสดงรายการสิทธิ์กราฟที่จำเป็นก่อน รับรหัสหลักของบริการบัญชีอัตโนมัติ รับหลักการบริการของแอปพลิเคชัน Microsoft Graph จากนั้นจึงกำหนดสิทธิ์ให้กับบัญชีอัตโนมัติ กระบวนการนี้จะถูกทำซ้ำสำหรับแอป Office 365 SharePoint Online กระบวนการนี้มีรายละเอียดเพิ่มเติมในบทความนี้เกี่ยวกับการใช้ Azure Automation Managed Identities กับ RBAC สำหรับแอปพลิเคชัน
##List Required Permissions
$Permissions = @(
"Group.ReadWrite.All"
"Sites.FullControl.All"
)
##Add Managed Identity ID
$MIID = "<Replace with Managed Identity Service Principal ID>"”
##Get Roles for Permissions
$GraphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" # Microsoft Graph
[array]$Roles = $GraphApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId” = $MIID
"ResourceId" = $GraphApp.Id
"AppRoleId" = $Role.Id
}
# Assign the Graph permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}
##List Required Permissions
$Permissions = @(
"Sites.Manage.All"
)
##Get Roles for Permissions
$SPApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0ff1-ce00-000000000000'" # SharePoint Online
[array]$Roles = $SPApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId" = $MIID
"ResourceId" = $SPApp.Id
"AppRoleId" = $Role.Id
}
# Assign the SharePoint permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}เมื่อสคริปต์ทำงาน จะตรวจจับรายการที่ถูกทำเครื่องหมายเพื่อลบและประมวลผลการลบไซต์ที่เกี่ยวข้อง เมื่อประมวลผลออบเจ็กต์เพื่อการลบ วันที่ลบจะถูกเพิ่มลงในฟิลด์ "DeletedOn" ในรายการติดตาม หากไม่มีออบเจ็กต์ที่ถูกทำเครื่องหมายให้ลบ สคริปต์จะออก
โซลูชันที่ยืดหยุ่น
ในบทความนี้ ฉันได้สรุปวิธีหนึ่งในการใช้ Power Automate และ Azure Automation เพื่อแก้ไขปัญหาในโลกแห่งความเป็นจริง ยังมีอีกหลายสิ่งที่สามารถทำได้เพื่อปรับปรุงกระบวนการนี้ เช่น การดูกิจกรรมล่าสุดบนไซต์เป็นตัวชี้วัดการหมดอายุก็น่าจะดี ฉันยังได้รวมการจัดการข้อผิดพลาดเล็กน้อยไว้ที่นี่เพื่อให้สิ่งต่าง ๆ ตรงประเด็น
การรวมเครื่องมือของ Microsoft เข้าด้วยกันตามที่ฉันได้แสดงไว้ที่นี่สามารถช่วยให้ผู้ดูแลระบบผู้เช่าทำงานที่ซับซ้อนอย่างน่าประหลาดใจด้วยกระบวนการอัตโนมัติที่ค่อนข้างง่ายได้ ในอนาคต Microsoft อาจนำเสนอโซลูชันที่ดีกว่าในการจัดการการหมดอายุของไซต์และทีม ในระหว่างนี้ ผู้ดูแลระบบสามารถสร้างโซลูชันของตนเองและแบ่งปันกับชุมชนได้ตลอดเวลา






