ค้นหาเว็บไซต์

ปรับปรุงประสิทธิภาพ 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) จากนั้นจึงนำเข้าข้อมูลผ่านโค้ด

บทความที่เกี่ยวข้อง