使用PowerShell检索目录中访问包及资源时遇到问题求助
解决特定目录下访问包枚举及资源收集问题
原代码的问题点
Connect-MgGraph的作用域字符串未闭合,存在语法错误- 先拉取所有访问包再过滤的方式效率低,且当访问包数量较多时可能因分页遗漏结果
- 未处理
$catalogId为空的情况(比如目录名称不匹配、无权限访问目录),会导致后续过滤失效
修正后的访问包枚举代码
# 连接Microsoft Graph,修正作用域引号问题 Connect-MgGraph -Scopes "EntitlementManagement.ReadWrite.All" # 定义目标目录名称 $catalogName = "Test" # 获取目录ID,添加大小写不敏感匹配,并处理未找到的情况 $catalog = Get-MgEntitlementManagementCatalog | Where-Object { $_.DisplayName -eq $catalogName } if (-not $catalog) { Write-Error "未找到名称为 $catalogName 的权限管理目录" exit } $catalogId = $catalog.Id # 直接通过CatalogId过滤访问包,避免全量拉取 $filteredAccessPackages = Get-MgEntitlementManagementAccessPackage -Filter "catalogId eq '$catalogId'" # 输出访问包信息 $filteredAccessPackages | Format-Table Id, DisplayName, Description -AutoSize
收集访问包关联的资源
如果需要获取每个访问包中使用的资源,可以遍历访问包,查询其资源角色分配:
foreach ($pkg in $filteredAccessPackages) { Write-Host "`n访问包: $($pkg.DisplayName) (ID: $($pkg.Id))" -ForegroundColor Cyan # 获取访问包的资源角色分配 $resourceRoles = Get-MgEntitlementManagementAccessPackageResourceRole -AccessPackageId $pkg.Id foreach ($role in $resourceRoles) { # 获取对应的资源详情 $resource = Get-MgEntitlementManagementAccessPackageResource -AccessPackageResourceId $role.AccessPackageResourceId Write-Host "资源名称: $($resource.DisplayName) | 角色: $($role.DisplayName)" } }
额外注意事项
- 确保当前账号拥有
EntitlementManagement.ReadWrite.All或至少EntitlementManagement.Read.All权限 - 如果目录存在重名情况,建议直接使用目录ID代替名称,避免匹配错误
- 当访问包或资源数量较多时,可添加
-All参数确保获取全量结果(如Get-MgEntitlementManagementAccessPackage -Filter "catalogId eq '$catalogId'" -All)
内容的提问来源于stack exchange,提问作者4pixels
相关产品推荐
相关产品推荐

