使用PowerShell每小时触发Azure文件共享按需备份及Runbook报错排查
解决建议
错误根源分析
你的代码逻辑存在核心问题:在未完成Azure身份验证的情况下,就尝试创建新的服务主体(New-AzADServicePrincipal),而该命令必须依赖已验证的Azure上下文才能执行。此外,Azure自动化Runbook无需手动创建服务主体,应利用自动化账户的托管身份完成身份验证,这是更安全且符合Azure最佳实践的方式。
具体解决步骤
1. 为自动化账户启用系统分配托管身份
- 登录Azure门户,找到目标自动化账户
- 在左侧菜单「账户设置」下选择「身份」
- 切换到「系统分配」标签,将状态设为「开启」,点击「保存」
2. 为托管身份分配必要权限
给自动化账户的系统分配托管身份添加以下角色权限:
- Recovery Services 参与者:作用于你的Recovery Services Vault,用于执行备份操作
- 存储账户参与者:作用于文件共享所在的存储账户,用于访问目标资源
- 备份操作员(可选):细化备份相关操作的权限范围
操作方式:
- 打开目标Recovery Services Vault,进入「访问控制(IAM)」
- 点击「添加角色分配」,选择对应角色,成员类型选「托管身份」,再选择你的自动化账户身份
- 对目标存储账户重复上述权限分配操作
3. 修改Runbook代码(使用托管身份登录)
移除手动创建服务主体的冗余逻辑,直接利用托管身份自动完成Azure登录:
# 利用自动化账户系统分配托管身份登录Azure Connect-AzAccount -Identity # 设置Recovery Services Vault上下文 $vault = Get-AzRecoveryServicesVault -Name "vault641" Set-AzRecoveryServicesVaultContext -Vault $vault # 获取对应存储账户的备份容器 $afsContainer = Get-AzRecoveryServicesBackupContainer -FriendlyName "testtest" -ContainerType AzureStorage # 获取目标文件共享的备份项 $afsBkpItem = Get-AzRecoveryServicesBackupItem -Container $afsContainer -FriendlyName "test" -WorkloadType "AzureFiles" # 触发按需备份作业 $job = Backup-AzRecoveryServicesBackupItem -Item $afsBkpItem # 可选:等待备份作业完成(超时时间1小时) Wait-AzRecoveryServicesBackupJob -Job $job -Timeout 3600
4. 验证并升级自动化账户模块版本
确保自动化账户中的Az模块(尤其是Az.RecoveryServices、Az.Resources)为最新稳定版:
- 进入自动化账户的「模块」页面
- 检查目标模块版本,若版本过低,点击「更新」按钮完成升级
额外注意事项
- 确保目标文件共享已被Azure Backup保护(已添加到Recovery Services Vault的备份策略中,即使策略间隔为4小时,仍可触发按需备份)
- 按需备份频率需合理控制,避免超出Azure Backup限制或产生不必要的存储成本
内容的提问来源于stack exchange,提问作者taka
相关产品推荐
相关产品推荐

