You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用New-MgServicePrincipalAppRoleAssignment替代AzureAD命令时遇报错

问题解决:PowerShell使用Graph模块添加角色时出现"无法访问已释放的对象"错误

核心问题:权限类型不匹配

你通过服务主体(ClientSecretCredential)做身份验证,但配置的是委托权限——服务主体属于应用身份,只能使用应用权限,委托权限是给用户身份设计的,应用身份无法正常调用,这会导致身份验证或后续请求异常,最终触发你看到的这类通用错误。

修复步骤

1. 替换为应用权限

在Azure AD中给你的服务主体配置以下应用权限(需管理员同意):

  • Application.ReadWrite.All(应用权限类型)
  • AppRoleAssignment.ReadWrite.All(应用权限类型)

2. 修正Graph连接命令

连接时明确指定应用权限范围,确保获取正确的访问令牌:

Connect-MgGraph -TenantId $tenantID -ClientSecretCredential $ClientSecretCredential -Scopes "Application.ReadWrite.All","AppRoleAssignment.ReadWrite.All"

3. 修正命令参数

New-MgServicePrincipalAppRoleAssignment的参数存在错误:

  • -ServicePrincipalId应该是被分配角色的服务主体ID(即你的应用对应的企业应用ObjectID,也就是$params.PrincipalId),而非Graph的服务主体ID
  • 确认$params.ResourceId是租户内Graph服务主体的正确ID
  • 确认$params.AppRoleId是Graph服务主体中目标角色的真实ID(可通过Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Graph'" | Select-Object -ExpandProperty AppRoles查看所有可用角色ID)

修正后的完整代码示例:

$ApplicationId = '<Myappid>'
$SecuredPassword = '<MyAppID secret>'
$tenantID = '<MyTenantID>'

$SecuredPasswordPassword = ConvertTo-SecureString -String $SecuredPassword -AsPlainText -Force
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ApplicationId, $SecuredPasswordPassword

# 指定应用权限范围连接Graph
Connect-MgGraph -TenantId $tenantID -ClientSecretCredential $ClientSecretCredential -Scopes "Application.ReadWrite.All","AppRoleAssignment.ReadWrite.All"

$params = @{
    PrincipalId = "<principalID>"  # 你的应用对应的企业应用ObjectID
    ResourceId = "<graph-service-principal-id>" # 租户内Graph服务主体的ID
    AppRoleId = "<target-approle-id>" # 要分配的Graph角色ID
}

try {
    # ServicePrincipalId为被分配角色的主体ID,即$params.PrincipalId
    New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $params.PrincipalId -BodyParameter $params -ErrorAction Stop
}
catch {
    Write-Error "角色分配失败: $($_.Exception.Message)"
    if ($_.Exception.InnerException) {
        Write-Error "内部错误详情: $($_.Exception.InnerException.Message)"
    }
}

额外排查点

  • 检查服务主体的客户端密钥是否过期
  • 确保Microsoft.Graph模块为最新版本,执行Update-Module Microsoft.Graph更新
  • 用Get-MgServicePrincipal -Filter "displayName eq 'Microsoft Graph'"确认Graph服务主体ID的正确性

内容的提问来源于stack exchange,提问作者PowershellUser42

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:42:33