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

如何通过ADF以ServicePrincipal上下文无密运行PowerShell脚本?

解决方案

用ADF托管标识直接运行脚本

ADF自带的托管标识可直接授权访问AAS,完全无需SPN密钥:

  • 先在AAS门户的「安全性」→「管理员」中,添加ADF的系统托管标识并赋予管理员权限
  • 在ADF中使用自定义活动,选择Azure Batch或Azure VM作为计算环境,脚本内直接通过托管标识获取令牌,无需写入密钥:
    # 通过Azure元数据服务获取AAS访问令牌
    $token = (Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://analysis.windows.net/powerbi/api" -Headers @{Metadata="true"}).access_token
    
    # 用令牌连接AAS并执行模型更新
    Invoke-ProcessASDatabase -Server "asazure://westus.asazure.windows.net/你的AAS服务器名" -Database "你的数据库名" -RefreshType "Full" -AccessToken $token
    
  • 确保计算环境(Batch/VM)的托管标识也拥有AAS访问权限,或直接将ADF托管标识关联至计算资源

用Azure Automation Runbook+托管标识

若脚本逻辑复杂,可将脚本迁移至Azure Automation Runbook:

  • 给Automation账户的系统托管标识分配AAS管理员权限
  • Runbook内同样通过托管标识获取令牌,代码逻辑与上述一致,无需密钥
  • 在ADF中添加Azure Automation活动,调用该Runbook即可实现ADF作业完成后的自动触发

用SPN证书认证替代密钥

若必须使用原SPN,可改用证书认证避免存储明文密钥:

  • 给SPN绑定自签名或CA签发的证书,并将证书部署至执行脚本的机器/计算资源
  • 脚本内通过证书指纹获取令牌,无需明文密钥:
    $certThumbprint = "你的证书指纹"
    $tenantId = "租户ID"
    $clientId = "SPN的ClientID"
    $resource = "https://analysis.windows.net/powerbi/api"
    
    $cert = Get-ChildItem -Path Cert:\CurrentUser\My\$certThumbprint
    $token = Get-AzAccessToken -ApplicationId $clientId -Certificate $cert -TenantId $tenantId -Resource $resource
    
    # 后续用令牌执行AAS模型操作
    
  • 证书更新频率低于密钥,且无需存储明文,符合安全要求

关键注意事项

  • 所有涉及的托管标识/SPN必须拥有AAS模型的管理员权限,否则无法执行更新操作
  • 托管标识的令牌获取依赖Azure内部元数据服务,仅能在Azure资源(VM、Batch、Automation等)中使用,本地环境无法直接调用
  • 使用证书认证时,需确保证书已正确安装至执行脚本环境的证书存储(当前用户或本地机器)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:43:15