ลงทะเบียนแอปพลิเคชันใหม่ด้วย Microsoft Graph PowerShell
ในโพสต์นี้ ฉันจะแสดงวิธีสร้างแอปพลิเคชันใหม่ใน Microsoft Entra โดยใช้ Microsoft Graph PowerShell และ Intake-MgGraphRequest cmdlet สิ่งนี้ช่วยให้คุณสร้างการลงทะเบียนแอปใหม่โดยไม่ต้องพึ่งพาโมดูล Microsoft.Graph.Applications เพิ่มเติม
ความต้องการ
หากต้องการสร้างการลงทะเบียนแอปใน Microsoft Graph PowerShell คุณจะต้องตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งโมดูล Microsoft.Graph.Authentication ก่อน ซึ่งจะทำให้คุณสามารถใช้ Connect-MgGraph และ Intake-MgGraphRequest cmdlet ได้
คุณจะต้องเข้าถึงบัญชี ผู้ดูแลระบบส่วนกลาง เพื่อยินยอมรับสิทธิ์ที่จำเป็นในแอปพลิเคชัน Microsoft Graph Command Line Tools
ลงทะเบียนใบสมัครใหม่
มาทำงานผ่านการลงทะเบียนแอปพลิเคชันใหม่ใน Microsoft Entra เราจะเริ่มต้นด้วยการลงทะเบียนแอปพลิเคชันพื้นฐานแล้วค่อย ๆ เพิ่มคุณสมบัติเพิ่มเติม ขั้นแรก คุณต้องเชื่อมต่อกับ Microsoft Graph PowerShell และยินยอมต่อสิทธิ์ Application.ReadWrite.All
Connect-MgGraph -Scope Application.ReadWrite.Allตอนนี้ เราสามารถกำหนดตัวแปรพื้นฐานบางตัวได้ ซึ่งเราสามารถสร้างเพิ่มเติมได้ คำสั่งด้านล่างจะลงทะเบียนแอปพลิเคชันใหม่ในผู้เช่าของคุณด้วยชื่อที่คุณกำหนดในตัวแปร $Name
$Name = "Application Name"
$Uri = "Beta\Applications"
$body = @{
DisplayName = "$Name"
signInAudience = "AzureADMyOrg"
requiredResourceAccess = @(
)
servicePrincipalLockConfiguration = @{
isEnabled = $true
allProperties = $true
credentialsWithUsageSign = $true
credentialsWithUsageVerify = $true
identifierUris = $false
tokenEncryptionKeyId = $true
}
}
$payload = $body | ConvertTo-Json -Depth 4
Invoke-MgGraphRequest -Method POST -Uri $Uri -ContentType "application/json" -Body $payload
หากคุณเรียกใช้โค้ดข้างต้น การลงทะเบียนแอปจะถูกสร้างขึ้นในผู้เช่าของคุณและสำหรับใช้กับผู้เช่าของคุณเท่านั้น ฉันได้รวมคุณสมบัติ servicePrincipalLockConfiguration ไว้ในการกำหนดค่าด้วย หากคุณต้องการแก้ไข signInAudiance และต้องการความปลอดภัยเพิ่มเติม นอกจากนี้ โปรดทราบว่าฉันได้ใช้ Invoke-MgGraphRequest cmdlet แทน New-MgApplication เนื่องจากในที่สุดเราจะเปลี่ยนโค้ดของเราให้เป็นฟังก์ชัน PowerShell และฉันต้องการลบการพึ่งพาในโมดูลทั้งหมดนอกเหนือจากโมดูลการตรวจสอบสิทธิ์ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับคำสั่งดังกล่าวได้ที่นี่: วิธีใช้ Inrigg-MgGraphRequest กับ PowerShell
ในไม่กี่ส่วนต่อไปนี้ เราจะสร้างเพิ่มเติมจากโค้ดด้านบนโดยการกำหนดการตั้งค่าแอปพลิเคชันเพิ่มเติม
การเพิ่ม URI การเปลี่ยนเส้นทาง
URI การเปลี่ยนเส้นทางคือตำแหน่งที่ผู้ใช้จะถูกส่งไปหลังจากที่พวกเขาได้รับอนุญาตให้ใช้งานแอปพลิเคชันสำเร็จแล้ว หากต้องการเพิ่ม URI การเปลี่ยนเส้นทางไปยังแอปพลิเคชันของคุณเมื่อสร้าง ให้เพิ่มโค้ดต่อไปนี้ลงในเนื้อหาคำขอของคุณ:
publicClient = @{
redirectUris = @(
"http://localhost"
)
}การดำเนินการนี้จะเพิ่ม แอปพลิเคชันมือถือและเดสก์ท็อป เปลี่ยนเส้นทาง URI พร้อมด้วยตำแหน่งของ http://localhost ไปยังแอปพลิเคชันของคุณ นี่จะเป็นการกำหนดค่าที่ต้องการเพื่อสร้างแอปพลิเคชันที่คุณสามารถเชื่อมต่อผ่าน Microsoft Grah PowerShell
การเพิ่มสิทธิ์
คุณยังสามารถเพิ่มสิทธิ์ให้กับแอปพลิเคชันของคุณได้ในขณะที่สร้างโดยใช้บล็อคโค้ดต่อไปนี้ ในกรณีนี้ 00000003-0000-0000-c000-000000000000 แสดงถึงทรัพยากร Microsoft Graph และตารางแฮชแต่ละตารางภายในอาร์เรย์ resourcesAccess แสดงถึง การอนุญาตเฉพาะ
requiredResourceAccess = @(
@{
resourceAppId = "00000003-0000-0000-c000-000000000000"
resourceAccess = @(
@{
id ="ebfcd32b-babb-40f4-a14b-42706e83bd28"
type = "Scope"
}
@{
id = "e4aa47b9-9a69-4109-82ed-36ec70d85ff1"
type = "Scope"
}
)
}
)ประเภทอาจเป็น ขอบเขต หรือ บทบาท ขึ้นอยู่กับว่าคุณกำลังเพิ่มสิทธิ์ที่ได้รับมอบหมาย (ขอบเขต) หรือสิทธิ์ของแอปพลิเคชัน (บทบาท) และสิทธิ์แต่ละรายการมีรหัสที่ไม่ซ้ำกัน
หากต้องการดูสิทธิ์ที่มีอยู่ทั้งหมด ID และขอบเขต ให้ใช้คำสั่งต่อไปนี้:
Find-MgGraphPermission | Select Name, PermissionType, Id | Sort -Property Nameการเพิ่มการอนุญาตหลายรายการโดยทางโปรแกรม
การเพิ่มสิทธิ์ดังที่เราได้เห็นข้างต้นอาจเป็นเรื่องยุ่งยาก อย่างที่คุณเห็นแล้วว่า ต้องใช้โค้ดจำนวนมาก โดยเฉพาะอย่างยิ่งหากคุณจำเป็นต้องมีสิทธิ์จำนวนหนึ่งพร้อมกัน หรือหากคุณต้องการใช้สคริปต์ซ้ำและเปลี่ยนสิทธิ์ในแต่ละครั้ง เพื่อแก้ไขปัญหานี้ ฉันได้เขียนโค้ดสองสามบรรทัดเพื่อสร้างคุณสมบัตินี้ให้เรา
ขั้นแรก คุณจะต้องประกาศสิทธิ์ที่คุณต้องการและประเภทสิทธิ์:
$Scope = "User.Read.All", "User.ReadWrite.All", "Group.Read.All", "Group.ReadWrite.All"
$context = "Delegated"ฉันได้จัดเก็บรายการอนุญาตสาธารณะซึ่งคุณจะต้องดาวน์โหลดและเก็บไว้ในหน่วยความจำ:
#Download permissions list
if ($context -eq "Delegated") {
$Permissions = Invoke-WebRequest -Method GET -Uri "https://raw.githubusercontent.com/DanielBradley1/Microsoft-Graph-PowerShell-Examples/main/Permissions/DelegatedGraphPermissions.csv" | ConvertFrom-Csv
$Type = "Scope"
} Elseif ($context -eq "Application") {
$Permissions = Invoke-WebRequest -Method GET -Uri "https://raw.githubusercontent.com/DanielBradley1/Microsoft-Graph-PowerShell-Examples/main/Permissions/ApplicationGraphPermissions.csv" | ConvertFrom-Csv
$Type = "Role"
}
จากนั้นการรวบรวมสิทธิ์จะถูกสร้างขึ้น โดยจัดเก็บทั้ง รหัส และ Tประเภท ของแต่ละสิทธิ์:
$resourceAccess = [System.Collections.Generic.List[Object]]::new()
Foreach ($Perm in $Scope){
$obj = [PSCustomObject][ordered]@{
"id" = ($Permissions | Where {$_.Name -eq $perm}).id
"Type" = $Type
}
$resourceAccess.Add($obj)
}จากนั้นคอลเลกชันจะถูกเพิ่มลงในแฮชเทเบิลชั่วคราว ซึ่งในทางกลับกันจะถูกเพิ่มไปยังคุณสมบัติ requiredResourceAccess ของเนื้อหาคำขอ
$resource = @{
resourceAppId = "00000003-0000-0000-c000-000000000000"
resourceAccess = $resourceAccess
}
$body.requiredResourceAccess += $resourceการเพิ่มโลโก้
ขออภัย ไม่รองรับการเพิ่มโลโก้ในขณะที่สร้างโดยใช้ Invoke-MgGraphRequest เพื่อแก้ไขปัญหานี้ คุณจะต้องจัดเก็บผลลัพธ์ของการสร้างแอปพลิเคชันก่อน ดังนี้:
$Application = Invoke-MgGraphRequest -Method POST -Uri $Uri `
-ContentType "application/json" -Body $payload -OutputType PSObjectจากนั้น คุณสามารถใช้วิธี PUT ในขณะที่ระบุเส้นทางของรูปภาพและประเภทเนื้อหาเป็นรูปภาพได้ นี่จะเป็นการอัปเดตโลโก้ของแอปพลิเคชันของคุณสำเร็จ
Invoke-MgGraphRequest -Uri "$Uri/$($Application.id)/logo" -Method PUT `
-InputFilePath "C:\Temp\images.png" -ContentType "image/png"หรือหากคุณมีไฟล์ที่โฮสต์ออนไลน์ที่คุณต้องการดาวน์โหลด คุณสามารถใช้ PowerShell เพื่อดาวน์โหลดและจัดเก็บไว้ในเครื่องเป็นระยะเวลาชั่วคราวได้ จากนั้นสามารถใช้เพื่ออัปเดตแอปพลิเคชันดังนี้:
#Temporary image path
$imgpath = "C:\Temp\Image.png"
#Image to download
$webimage = "https://i.imgur.com/dAqRsQr.png"
#Download image
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($webimage, "$imgpath")
#Update image
Invoke-MgGraphRequest -Uri "$Uri/$($Application.id)/logo" -Method PUT `
-InputFilePath $imgpath -ContentType "image/png"
#Remove temporary image
Remove-Item -path $imgpathการเพิ่มบันทึกภายใน
บันทึกภายในเป็นวิธีที่ดีในการให้ข้อมูลโดยละเอียดแก่ผู้ดูแลระบบคนอื่นๆ เกี่ยวกับวัตถุประสงค์ดั้งเดิม ขอบเขต และพื้นที่การใช้งานภายในสภาพแวดล้อมของคุณ แน่นอนว่า คุณไม่ควรจัดเก็บข้อมูลที่ละเอียดอ่อนไว้ในส่วนหมายเหตุภายใน แต่ให้จัดเก็บข้อมูลที่เป็นประโยชน์เพื่อช่วยให้ผู้อื่นเข้าใจวัตถุประสงค์ของแอปพลิเคชันของคุณและกรณีการใช้งานที่ตั้งใจไว้แทน ด้วยวิธีนี้หากขอบเขตของแอปพลิเคชันเบี่ยงเบนไปจากจุดประสงค์เดิม สามารถแก้ไขได้หรืออัปเดต
หากต้องการเพิ่มบันทึกภายในให้กับแอปพลิเคชันของคุณ ให้เพิ่มโค้ดต่อไปนี้ลงในเนื้อหาคำขอของคุณ:
Notes = "This is a new note"การเพิ่มเจ้าของแอปพลิเคชัน
ตามเอกสารของ Microsoft ผู้ใช้ที่สร้างแอปพลิเคชันใน Microsoft Entra จะเป็นเจ้าของแอปพลิเคชันดังกล่าวโดยอัตโนมัติ อย่างไรก็ตาม สิ่งนี้ไม่เป็นความจริงเมื่อสร้างแอปพลิเคชันด้วย Microsoft Graph PowerShell แต่คุณต้องกำหนดเจ้าของแอปพลิเคชันด้วยตนเองหลังจากสร้างแอปพลิเคชันแล้ว
ใช้ตัวอย่างด้านล่างเพื่อเพิ่มเจ้าของแอปพลิเคชันโดยใช้ PowerShell หลังจากจัดเก็บแอปพลิเคชันที่สร้างขึ้นในตัวแปร $Application เหมือนที่เราเห็นก่อนหน้านี้
#Change the object Id for the user you wish to add as an owner
$owner = @{
"@odata.id" = "https://graph.microsoft.com/v1.0/directoryObjects/387c58a2-3fea-4e8e-979d-a49469b89100"
}
Invoke-MgGraphRequest -Method POST `
-Uri "https://graph.microsoft.com/v1.0/applications/$($Application.id)/owners/`$ref" `
-ContentType "application/json" -Body $owner | ConvertTo-Json