ปรับปรุงประสิทธิภาพ Microsoft Graph PowerShell ด้วยแบตช์
การจัดชุด (หรือที่เรียกว่าการจัดชุด JSON) สามารถใช้กับ Microsoft Graph PowerShell เพื่อปรับปรุงประสิทธิภาพของสคริปต์ที่มีอยู่ซึ่งจำเป็นต้องโต้ตอบกับบริการใน Microsoft 365, Microsoft Entra หรือ Microsoft Intune
แนวคิดของการแบทช์นั้นค่อนข้างง่าย คุณรวบรวมข้อมูลเพื่อส่งคำขอหลายรายการ จากนั้นส่งเป็น "ชุด" ไปยัง Microsoft Graph API วิธีนี้ทำให้คุณสามารถส่งคำขอได้หลายรายการพร้อมกัน ซึ่งจะช่วยปรับปรุงเวลารวมของสคริปต์ของคุณ
คำขอแบทช์คืออะไร?
การรวบรวมคำขอช่วยให้แอปพลิเคชันสามารถรวมคำขอหลายรายการไปยัง Microsoft Graph เพื่อปรับปรุงประสิทธิภาพและลดเวลาแฝง นอกจากนี้ยังสามารถนำไปใช้ใน Microsoft Graph PowerShell เพื่อช่วยผู้ดูแลระบบปรับปรุงประสิทธิภาพของงานการจัดการและสคริปต์
ชุดคำขอคือชุดของคำขอภายในออบเจ็กต์ JSON เดียว ซึ่งสามารถจัดเก็บไว้ในตัวแปรใน PowerShell ได้ คุณสามารถสร้างออบเจ็กต์ JSON ได้หลายวิธี ได้แก่:
- โดยกำหนดด้วยตนเองระหว่างสตริงที่นี่
- โดยการกำหนด hashtable และแปลงเป็น JSON
- โดยการสร้าง Object ผ่านโค้ดแล้วแปลงเป็น JSON (มีประสิทธิภาพสูงสุด)
จากนั้นสามารถส่งแบทช์ไปยัง Microsoft Graph ได้โดยใช้ Intake-RestMethod หรือ Invive-MgGraphRequest cmdlets ด้วยเมธอด POST
เมื่อใดที่คุณควรใช้คำขอแบบแบตช์
การใช้กลไกการร้องขอแบทช์ใน Microsoft Graph จะเพิ่มความซับซ้อนให้กับสคริปต์ของคุณ ดังนั้น แม้ว่าจะสามารถปรับปรุงประสิทธิภาพของโค้ดของคุณและ "เวลาในการส่งออก" ได้ แต่โดยทั่วไปแล้วจะทำให้โค้ดของคุณสามารถอ่านได้น้อยลงสำหรับผู้อื่นที่อาจจำเป็นต้องอ่านหรือสืบทอดโค้ดนั้น ดังนั้น ฉันขอแนะนำเฉพาะคำขอแบบแบตช์เมื่อคุณต้องส่งคำขอจำนวนมากไปยัง Microsoft Graph (มากกว่า 20 รายการ)
ตัวอย่างที่อาจเป็นประโยชน์ต่อคุณคือ หากคุณกำลังลบผู้ใช้หรืออุปกรณ์จำนวนมากออกจากสภาพแวดล้อมของคุณ แม้ว่าจะง่ายต่อการใช้การกรองด้วย Microsoft Graph เพื่อดึงข้อมูลรายการออบเจ็กต์ แต่การลบออกจะต้องมีคำขอลบแต่ละรายการ สมมติว่าคุณต้องลบออบเจ็กต์ 100 รายการออกจากไดเร็กทอรีของคุณ แทนที่จะส่งคำขอ 100 รายการไปยัง Microsoft Graph และรอให้แต่ละคำขอดำเนินการก่อนที่คำขอถัดไปจะเริ่มต้น ในกรณีดังกล่าว สามารถจัดกลุ่มเป็นกลุ่มละ 20 รายการได้ ดังนั้นคุณจะต้องส่งคำขอไปยัง Microsoft Graph เพียง 5 รายการเท่านั้น
ประโยชน์ด้านประสิทธิภาพของการแบทช์ใน PowerShell
ฉันได้ทำการทดสอบเชิงปฏิบัติเกี่ยวกับการใช้แบทช์และคุณประโยชน์ด้านประสิทธิภาพแล้ว สำหรับสิ่งนี้ ฉันได้สร้างผู้ใช้ทดสอบ 2,000 รายใน Microsoft Entra (ผู้ใช้เหล่านี้ไม่ได้รับอนุญาตหรือจัดเตรียม) ผู้ใช้ 1,000 รายที่ฉันเก็บไว้ในตัวแปร $1to1000 และอีก 1,000 รายถูกเก็บไว้ในตัวแปร $1001to2000
นี่เป็นสคริปต์แรกด้านล่างที่ถูกเรียกใช้เพื่อลบผู้ใช้ 1,000 ราย สคริปต์นี้ส่งคำขอเป็นรายบุคคลเพื่อลบผู้ใช้แต่ละคน
Foreach ($user in $1to1000){
Remove-MgUser -UserId $user.id
}เมื่อใช้ Measure-Command cmdlet เวลารวมในการลบผู้ใช้จะใช้เวลา 33 วินาที
จากนั้น ฉันรันสคริปต์ต่อไปนี้ ซึ่งจัดกลุ่มคำขอเป็นกลุ่มละ 20 รายการ จากนั้นส่งเป็นคำขอเดียว
for($i=0;$i -lt $1001to2000.count;$i+=20){
$batch = @{}
$batch['requests'] = ($1001to2000[$i..($i+19)] | select @{n='id';e={$_.id}},@{n='method';e={'DELETE'}},`
@{n='url';e={"/users/$($_.id)"}})
Invoke-mggraphrequest -Method POST -URI "https://graph.microsoft.com/v1.0/`$batch" -body ($batch | convertto-json) -OutputType PSObject
}คุณสามารถดูเวลาทั้งหมดที่ต้องทำให้เสร็จคือ 12 วินาที ซึ่งเป็นการปรับปรุงที่สำคัญ
ตัวอย่างคำขอแบทช์
ด้านล่างนี้คือตัวอย่างคำขอแบตช์ JSON สำหรับ Microsoft Graph คุณจะเห็นว่าเนื้อหาของคำขอล้อมรอบด้วยสตริงที่นี่ (@’ ‘@)
คุณสามารถระบุสตริงที่นี่ด้วยเครื่องหมายคำพูดเดี่ยว (เช่นที่คุณเห็นด้านล่าง) หรือใช้เครื่องหมายคำพูดคู่แทน ความแตกต่างก็คือ เครื่องหมายคำพูดเดี่ยวจะใช้ข้อความตามตัวอักษรและจะไม่ขยายตัวแปร อย่างไรก็ตาม เครื่องหมายคำพูดคู่จะอนุญาตให้มีตัวแปรที่ขยายได้
จากนั้น Invivo-MgGraphRequest cmdlet จะถูกนำมาใช้กับเมธอด POST ฉันยังใช้ backtick ( ` ) ในเส้นทางเว็บ URI เพื่อให้แน่ใจว่าสตริง $batch ถูกนำมาใช้ตามตัวอักษรและไม่ได้ขยายเป็นตัวแปร ซึ่งจำเป็นสำหรับคำขอแบบแบตช์
จากนั้นตัวแปร $batch ที่มีเนื้อหาคำขอจะถูกนำมาใช้กับตัวแปร -body เพื่อส่งคำขอ
$batch = @'
{
"requests": [
{
"id": "1",
"method": "GET",
"url": "/users/[email "
},
{
"id": "2",
"method": "GET",
"url": "/users/[email "
},
{
"id": "3",
"method": "GET",
"url": "/users/[email "
}
]
}
'@
$response = Invoke-MgGraphRequest `
-Method POST `
-URI "https://graph.microsoft.com/beta/`$batch" `
-body $batch `
-OutputType PSObjectการบันทึกการตอบกลับไปยังตัวแปรทำให้มั่นใจได้ว่าคุณสามารถอ้างอิงกลับไปยังข้อมูลได้โดยใช้เครื่องหมายจุด คุณสามารถใช้ตัวอย่างด้านล่างเพื่อแยกชื่อผู้ใช้และที่อยู่อีเมลสำหรับผู้ใช้ที่กำหนดไว้ในคำขอแบทช์
$response.responses.body | Select UserPrincipalName, proxyaddresses | ftกำลังสร้างคำขอแบทช์
ในตัวอย่างก่อนหน้านี้ ฉันแสดงให้เห็นถึงคุณประโยชน์ของการใช้คำขอแบบแบตช์ ด้วยสิ่งนี้ ฉันจึงใช้ลูป PowerShell For เพื่อสร้างชุด JSON สำหรับแต่ละคำขอ โดยที่สำคัญคือ แต่ละคำขอจะทำซ้ำกับออบเจ็กต์ประเภทเดียวกันที่แตกต่างกัน ซึ่งจะทำให้คุณสามารถใช้การแบทช์กับ PowerShell ได้อย่างมีประสิทธิภาพ ไม่เช่นนั้นจะทำไม่ได้ในทางปฏิบัติ นี่คือรหัสเทมเพลต:
for($i=0;$i -lt $objects.count;$i+=20){
$batch = @{}
$batch['requests'] = ($objects[$i..($i+19)] | select @{n='id';e={$_.id}},@{n='method';e={'DELETE'}},`
@{n='url';e={"/users/$($_.id)"}})
invoke-mggraphrequest -Method POST -URI "https://graph.microsoft.com/v1.0/`$batch" -body ($batch | convertto-json) -OutputType PSObject
}เพื่อแยกย่อยตรรกะเบื้องหลังสิ่งนี้ For loop (หรือคำสั่ง For) มีข้อมูลสำคัญสามส่วนภายในไวยากรณ์ ซึ่งฉันได้เน้นไว้ในรูปภาพด้านล่างในบรรทัดแรก
$i=0. คำสั่งนี้จะรันก่อนที่การวนซ้ำจะเริ่มต้น ใช้เพื่อสร้างและเริ่มต้นตัวแปรด้วยค่าเริ่มต้น 0
$i -lt $obects.count. คำสั่งนี้คือเงื่อนไข (หรือกฎ) และบอกว่าให้ดำเนินการวนซ้ำนี้ต่อไปในขณะที่ตัวแปรเริ่มต้น $i น้อยกว่าจำนวนวัตถุทั้งหมดในคอลเลกชัน (หรืออาร์เรย์)
$i+=20. นี่คือคำสั่งส่งคืน สิ่งนี้จะถูกดำเนินการในแต่ละลูป และ 20 จะถูกบวกเข้ากับค่าของ $i ดังนั้นในวงแรก $i=0 จากนั้นในวงถัดไป $i=20 และ 40 และต่อๆ ไป
ซึ่งจะทำให้โค้ดวนซ้ำในขณะที่เพิ่ม 20 ไปยัง $i ในแต่ละลูป ซึ่งจำเป็นในขั้นตอนถัดไป
อาร์เรย์ $objects ถูกไฮไลต์ไว้ด้านล่าง จากนั้นในวงเล็บเหลี่ยมจะเป็นตัวเลือกช่วง ในการผ่านครั้งแรกของลูป $i=0 และ $i+19=19 สิ่งนี้จะเลือกวัตถุ 20 ตัวแรกภายในอาร์เรย์ที่จะรวมไว้ในตัวแรก คำขอแบทช์
คำสั่ง return จะเพิ่ม 20 ถึง $i พร้อมสำหรับการวนรอบที่สอง ในระหว่างการวนรอบที่สอง $i=20 และ $i+19=39 โดยเลือก 20 รายการถัดไปจากอาร์เรย์และเพิ่มไปยังคำขอชุดถัดไป สิ่งนี้จะดำเนินต่อไปจนกระทั่ง $i น้อยกว่าวัตถุทั้งหมดในอาร์เรย์ ผลลัพธ์ก็คือวัตถุทั้งหมดในอาร์เรย์จะถูกส่งไปยัง Microsoft Graph ภายในคำขอแบบแบตช์
ห่อ
แม้ว่าคำขอแบบกลุ่มสามารถปรับปรุงประสิทธิภาพของสคริปต์ของคุณได้อย่างมาก แต่ให้ใช้อย่างชาญฉลาด เนื่องจากความซับซ้อนที่เพิ่มเข้ามาอาจเป็นปัญหาเมื่อทำงานร่วมกันบนสคริปต์ โดยเฉพาะอย่างยิ่งหากผลกระทบต่อประสิทธิภาพโดยรวมมีเพียงเล็กน้อย
ยังมีวิธีต่างๆ มากมายที่คุณสามารถสร้างคำขอเป็นชุดได้ ฉันได้สาธิตวิธีสร้างคำขอโดยทางโปรแกรมโดยใช้คำสั่ง For ใน PowerShell แล้ว วิธีนี้ใช้ได้กับประเภทคำขอที่ทำซ้ำ อย่างไรก็ตาม วิธีอื่นอาจจัดเก็บข้อมูลคำขอไว้นอกสคริปต์ของคุณ (เช่น ในไฟล์ CSV) จากนั้นจึงนำเข้าข้อมูลผ่านโค้ด



