使用指定PowerShell代码时反复触发Azure登录提示的原因排查
先看看你提供的代码:
$File = 'c:\azure\azradmpwd.txt' $ash = Get-Content -Path $File | ConvertTo-SecureString $ashSvcCred = New-Object System.Management.Automation.PSCredential('test@test',$ash) Login-AzureRmAccount -Credential $ashSvcCred Set-AzureRmContext -SubscriptionId '<subscription code here>' $rg = '<resource group here>' $adla = '<azure analytics name here>' $myrootdir = "/Test/" $source = "adl://<adl name>.azuredatalakestore.net" + $myrootdir $dest = "adl://<adl name>.azuredat..."
反复弹出登录窗口,大概率是凭据验证环节出了问题,我整理了几个常见原因和对应的解决办法:
凭据文件加密上下文不匹配
ConvertTo-SecureString默认会用当前登录用户和本地机器的信息加密密码。如果你的azradmpwd.txt是在另一台机器、或者用另一个用户账号生成的,那当前环境根本解密不了这个密码,自然会触发重新登录。
解决办法:在你现在运行脚本的用户和机器上,重新生成密码文件:# 替换成你的实际密码,执行这条命令生成新的凭据文件 "你的实际密码" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File 'c:\azure\azradmpwd.txt'用户账户启用了MFA,无法用纯凭据登录
你用的test@test如果是普通用户账户,而且开启了多因素认证(MFA),那Login-AzureRmAccount -Credential这种非交互式登录方式根本绕不开MFA,必然会弹登录窗口让你做二次验证。
解决办法:- 如果必须用这个用户:要么临时禁用MFA(不推荐生产环境),要么改用交互式登录(去掉
-Credential参数,手动完成MFA验证),或者用设备代码登录:Login-AzureRmAccount -DeviceCode - 如果是服务主体:那你当前的用法不对,服务主体的用户名应该是应用程序ID,而且登录时要加
-ServicePrincipal和-TenantId参数:# 确保$ashSvcCred里的用户名是服务主体的应用ID Login-AzureRmAccount -ServicePrincipal -Credential $ashSvcCred -TenantId "你的租户ID"
- 如果必须用这个用户:要么临时禁用MFA(不推荐生产环境),要么改用交互式登录(去掉
AzureRM模块版本太旧有bug
旧版本的AzureRM模块在凭据认证上可能存在兼容性问题,导致无法正确读取解密后的凭据。
解决办法:更新到最新的AzureRM模块(不过更推荐迁移到Az模块,因为AzureRM已经停止维护了):# 卸载所有旧版本 Uninstall-Module AzureRM -AllVersions -Force # 安装最新版本 Install-Module AzureRM -AllowClobber -Force迁移到Az模块的话,把
Login-AzureRmAccount换成Connect-AzAccount,Set-AzureRmContext换成Set-AzContext即可。账户没有目标订阅的权限
如果你的test@test账户没有访问你指定的<subscription code here>订阅的权限,登录后切换上下文失败,也可能触发重新登录的提示。
解决办法:登录Azure门户,检查该账户是否在目标订阅中有至少读者以上的权限,确保SubscriptionId没有填错。
内容的提问来源于stack exchange,提问作者FELIX A

