已创建自定义 PowerShell 脚本来导出我的所有 Azure 注册应用 API 应用程序权限
和委派权限
。我的一些应用的 API 权限
的类型
等于委托(delegate)
或应用程序
。我按照这个问题 Similar question 中回答的分步指南进行操作。它仅针对单个应用程序显示,在我的例子中是多个应用程序。
什么有效,什么无效
创建的脚本能够导出分配给任何应用注册的应用程序权限
,但无法导出委派权限
。该脚本返回时没有错误,但我没有获得创建并填充了具有委派权限(包括权限信息)的应用的委派权限
的 csv。
我尝试仅单独导出委派权限
,但仍然存在同样的问题,csv 不是使用数据创建的。
我的主要目标是能够检索分配给我的所有应用注册的所有 API 权限(应用程序权限
和 委派权限
)并将其导出到 csv 文件中我使用 Azure-AD
模块。
下面是脚本。
# Add your azure ad global administrator password here
$password_ = ""
$password = ConvertTo-SecureString $password_ -AsPlainText -Force
# Add your azure ad global administrator login UPN
$upn = ""
$export_application_permission = "C:\temp\application_perms.csv"
$export_delegated_permission = "C:\temp\delegated_perms.csv"
# Automated login to azure ad
$AppCredential = New-Object System.Management.Automation.PSCredential($upn, $password)
Connect-azureAD -Credential $AppCredential
$apps = Get-AzureADApplication -All $true
foreach ($app in $apps){
$perms = $app.requiredResourceAccess
foreach($perm in $perms){
# Grab all the ResourceAppId from requiredResourceAccess array
$res_app_id = $perm.ResourceAppId
foreach($res_access in $perm.ResourceAccess){
# Check if the resourceAccess Type is Role, which means its application permissions
if($res_access.Type -eq "Role"){
# Grab the resource id
$res_ac = $res_access.Id
# Calling azure-AD module
Connect-azureAD -Credential $AppCredential
# Grab all applications assigned application permissions only
$sps = Get-AzureADServicePrincipal -All $true | Where-Object {$_.AppId -eq $res_app_id}
foreach($sp in $sps){
# Grab application permissions details now
$roles = $sp.AppRoles | Where-Object {$_.Id -eq $res_ac}
foreach($rol in $roles.value){
$record = New-Object PSObject
$record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
$record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
$record | Add-Member NoteProperty -Name "Permission Value" -Value $rol
$record | Export-CSV $export_application_permission -NoTypeInformation -Append
}
}
# Check if the resourceAccess Type is Scope, which means its delegated permissions
}elseif ($res_access.Type -eq "Scope") {
<# Action when this condition is true #>
$res_ac = $res_access.Id
Connect-azureAD -Credential $AppCredential
$sps = Get-AzureADServicePrincipal -All $true | Where-Object {$_.AppId -eq $res_app_id}
foreach($sp in $sps){
# Grab delegated permissions details now
$delegated_perms = $sp.oauth2PermissionScopes | Where-Object {$_.Id -eq $res_ac}
foreach($rol in $delegated_perms.value){
$record = New-Object PSObject
$record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
$record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
$record | Add-Member NoteProperty -Name "Permission Value" -Value $rol
$record | Export-CSV $export_delegated_permission -NoTypeInformation -Append
}
}
} else {
Write-host "Retreating........."
}
}
}
}
我期望所有具有委托(delegate)权限
的应用程序都有类似的输出
我做错了什么或遗漏了什么?
最佳答案
以下是我在跟踪所有权上下文时获取所有应用程序的所有应用程序权限/委派权限的方法。
这将生成类似于示例 CSV 输出的内容。
代码
Connect-azureAD
$Apps = Get-AzureADApplication -All $true
$ServicePrincipals = Get-AzureADServicePrincipal -All $true
$export_application_permission = ""
$export_delegated_permission = "C:\temp\delegated_perms.csv"
$PermissionsList = $ServicePrincipals.Oauth2Permissions | Select-Object Id, Value
$RolesList = $ServicePrincipals.AppRoles | Select-Object Id, Value
$app.RequiredResourceAccess
$Data = Foreach ($App in $Apps) {
foreach ($Access in $App.RequiredResourceAccess) {
foreach ($Permission in $Access.ResourceAccess) {
switch ($Permission.Type) {
'Scope' {
$PermissionName = ($PermissionsList | Where Id -eq $Permission.Id).Value
break
}
'Role' {
$PermissionName = ($RolesList | Where Id -eq $Permission.Id).Value
break
}
}
if (!$PermissionName) { $PermissionName = $Permission.Id }
[PSCustomObject]@{
'Application Display Name' = $App.DisplayName
'Permission Type' = $Permission.Type
'Permission Value' = $PermissionName
}
}
}
}
$Data | Where-Object 'Permission Type' -eq Role | Export-Csv -Path $export_application_permission -NoTypeInformation
$Data | Where-Object 'Permission Type' -eq Scope | Export-Csv -Path $export_delegated_permission -NoTypeInformation
警告
仅检查权限值(例如:User.Read.All
)可能会产生误导,因为自定义应用程序也公开同名的权限,会导致您获得权限名称,但您不知道该权限背后是哪个 API(例如:它是图形、自定义应用程序还是共享某些权限名称的另一个 Microsoft API 等...)
关于原始代码的一些注释
您的原始示例存在一些效率低下的问题。
连接-AzureAd
。您只需要在进入循环之前连接一次,而不是像您那样在多个点连接。Get-AzureADServicePrincipal
可以在循环之前调用一次,同时获取所有 Azure AD 应用程序。在循环中,您只需从初始结果中选择所需的内容,而无需一次又一次调用 cmdlet。导出 CSV - 附加
。我不鼓励使用它,而是在循环之后使用它,这样您就可以访问一次文件,而不是数十次、数百次或数千次。- 从性能角度来看,使用哈希表转换为 PSCustomObject 比创建 PSObject 并使用
Add-member
更快(而且更干净)
# This
$record = [PSCustomObject]@{
"Application Display Name" = $app.displayName
"Permission Type" = $res_access.Type
"Permission Value" = $rol
}
#Instead of this
$record = New-Object PSObject
$record | Add-Member NoteProperty -Name "Application Display Name" -Value $app.displayName
$record | Add-Member NoteProperty -Name "Permission Type" -Value $res_access.Type
$record | Add-Member NoteProperty -Name "Permission Value" -Value $rol
关于azure - 如何通过 PowerShell 使用 azure-AD 模块导出分配给 azure 应用程序注册的委派权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72847582/