Azure Automation Az模块加载报错:同名程序集已加载,脚本运行失败
解决Azure Automation中Az模块冲突与Blob写入失败问题
核心问题分析
报错里的Assembly with same name is already loaded是因为Azure Automation默认已预装Az模块,手动调用Connect-AzAccount或尝试重复导入模块会触发版本/加载冲突;而New-AzStorageContext等命令找不到,是因为对应的Az.Storage模块未正确加载或未在Automation账户中启用。
解决方案步骤
1. 移除手动Connect-AzAccount调用
Azure Automation内置两种认证方式,无需手动执行Connect-AzAccount:
- 使用Azure Automation运行账户:Automation账户默认关联的运行账户已具备访问Azure资源的权限,脚本会自动使用该身份认证。
- 使用系统分配托管身份:给Automation账户启用托管身份后,为该身份分配存储账户的
Storage Blob Data Contributor权限,脚本可直接利用身份访问存储。
2. 确保Az.Storage模块在Automation账户中可用
- 登录Azure门户,进入目标Automation账户
- 左侧菜单选择模块,检查是否存在
Az.Storage模块 - 若不存在,点击添加模块,从Azure模块库中搜索并导入
Az.Storage(建议选择与Automation默认Az模块兼容的版本)
3. 修改脚本避免模块冲突
修改后的脚本示例(适配托管身份/运行账户认证):
# 无需手动Connect-AzAccount,Automation会自动处理认证 $storageAccountName = "xxx" $containerName = "yyy" # 使用Automation内置身份获取存储上下文 $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -UseConnectedAccount # 验证容器存在(若不存在则创建) $container = Get-AzStorageContainer -Name $containerName -Context $ctx -ErrorAction SilentlyContinue if (-not $container) { $container = New-AzStorageContainer -Name $containerName -Context $ctx -Permission Blob } $date_loaded = Get-Date -Format "MMddyyyy" $content = [System.Text.Encoding]::UTF8.GetBytes($Result -join "`r`n") $blobName = "$date_loaded.csv" # 使用Az模块原生cmdlet上传,减少底层依赖 Set-AzStorageBlobContent -Context $ctx -Container $containerName -Blob $blobName -InputStream (New-Object System.IO.MemoryStream($content)) -Force
4. 强制指定模块版本(可选,解决版本冲突)
若仍存在模块加载问题,可在脚本开头显式导入指定版本的模块,避免与默认模块冲突:
# 替换为实际兼容的模块版本号 Import-Module Az.Accounts -RequiredVersion 2.12.0 Import-Module Az.Storage -RequiredVersion 4.10.0
关键注意事项
- 不要在Automation脚本中手动调用
Connect-AzAccount,否则会与内置认证机制冲突 - 确保Automation账户的身份(运行账户/托管身份)拥有存储账户的Blob数据读写权限
- 优先使用Az模块的原生cmdlet替代直接调用.NET CloudBlobContainer API,减少对底层组件的依赖
内容的提问来源于stack exchange,提问作者Oleg Kazanskyi
相关产品推荐
相关产品推荐

