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

ลงทะเบียนแอปพลิเคชันใหม่ด้วย 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

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