我目前正在学习如何使用 powershell 资源管理 cmdlet 创建 azure 环境。
经典的工作方式没有问题,我可以使用Add-AzureAccount
它,它可以让我访问我的订阅。
但是,使用新的资源管理器 cmdlet,当我使用时,Add-AzureRmAccount
我会遇到两个错误之一。
当使用存储的凭据$Cred = Get-Credentials
,然后使用登录时,Add-AzureRmAccount -Credential $cred
我收到以下错误:
访问 ws 元数据交换失败。
使用登录提示时。这意味着我只需输入Add-AzureRmAccount
,它就会将我转发到我公司的 SSO 页面。我在其中成功登录。我收到以下错误:
发送请求时出错。
当我尝试在家中使用 cmdlet 时,使用 vpn 连接我之前使用的同一台笔记本电脑。我可以使用Add-AzureRmAccount
并遵循登录提示进行完美连接。使用存储的$cred
entials 仍然失败,并出现元数据交换错误。
我假设存储凭据方法失败,因为它无法在没有交互式提示的情况下重定向到 SSO。
但是我不确定是什么可能导致交互式登录失败,因为我可以清楚地到达 SSO,并且Add-AzureAccount
cmdlet 在同一台机器上工作。
可能导致此问题Add-AzureAccount
的 cmdlet 和cmdlet之间有什么区别?Add-AzureRmAccount
更新:
完整的堆栈跟踪错误是:
Message : An error occurred while sending the request.
Data : {}
InnerException : System.Net.WebException: The remote server returned an error: (407) Proxy Authentication Required.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
TargetSite : Void ThrowForNonSuccess(System.Threading.Tasks.Task)
StackTrace : at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
at Microsoft.Azure.Subscriptions.TenantOperationsExtensions.List(ITenantOperations operations)
at Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient.ListAccountTenants(AzureAccount
account, AzureEnvironment environment, SecureString password, ShowDialog promptBehavior)
at Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient.Login(AzureAccount account,
AzureEnvironment environment, String tenantId, String subscriptionId, String subscriptionName,
SecureString password)
at Microsoft.Azure.Commands.Profile.AddAzureRMAccountCommand.ProcessRecord()
at System.Management.Automation.Cmdlet.DoProcessRecord()
at System.Management.Automation.CommandProcessor.ProcessRecord()
HelpLink :
Source : Microsoft.Threading.Tasks
HResult : -2146233088
看起来我的错误与防火墙有关。
我不确定为什么一个命令 ( Add-AzureRmAccount
) 会遇到错误,而旧版本 ( Add-AzureAccount
) 不会。
根据Colyn1337关于差异可能是基于 Web 的 API 的评论。
并且身份验证错误与代理服务器未正确身份验证有关。
一个关于stackoverflow的类似问题提供了解决方案,其中一个不同的、也是基于web的api cmdlet有一个类似的错误。
如答案中所述,我只需在脚本开头添加以下代码: