【问题标题】:How to detect if Azure Powershell session has expired?如何检测 Azure Powershell 会话是否已过期?
【发布时间】:2015-03-22 04:59:52
【问题描述】:

我正在编写一个 Azure PowerShell 脚本并登录到 Azure,我调用 Add-AzureAccount,这将弹出一个浏览器登录窗口。

我想知道检查身份验证凭据是否过期以及是否应该再次致电Add-AzureAccount 的最佳方法是什么?

我现在要做的是,我只需调用Get-AzureVM 并查看$? 是否等于$False。对我来说听起来有点骇人听闻,但似乎有效。如果订阅没有部署任何虚拟机,它仍然有效吗?

【问题讨论】:

  • 约翰保罗,如果你还在外面,你应该接受 Aviad Ezra 的回答......

标签: powershell authentication azure


【解决方案1】:

Azure RM 但这会检查是否有活动帐户,否则会出现提示。

if ([string]::IsNullOrEmpty($(Get-AzureRmContext).Account)) {Login-AzureRmAccount}

干杯

【讨论】:

    【解决方案2】:

    您需要运行 Get-AzureRmContext 并检查 Account 属性是否已填充。在最新版本的 AzureRM 中,Get-AzureRmContext 不会引发错误(该错误由需要活动会话的 cmdlet 引发)。但是,显然在其他一些版本中确实如此。

    这对我有用:

    function Login
    {
        $needLogin = $true
        Try 
        {
            $content = Get-AzureRmContext
            if ($content) 
            {
                $needLogin = ([string]::IsNullOrEmpty($content.Account))
            } 
        } 
        Catch 
        {
            if ($_ -like "*Login-AzureRmAccount to login*") 
            {
                $needLogin = $true
            } 
            else 
            {
                throw
            }
        }
    
        if ($needLogin)
        {
            Login-AzureRmAccount
        }
    }
    

    如果您使用的是新的 Azure PowerShell API,则要简单得多

    function Login($SubscriptionId)
    {
        $context = Get-AzContext
    
        if (!$context -or ($context.Subscription.Id -ne $SubscriptionId)) 
        {
            Connect-AzAccount -Subscription $SubscriptionId
        } 
        else 
        {
            Write-Host "SubscriptionId '$SubscriptionId' already connected"
        }
    }
    

    【讨论】:

    • 我正在对此进行跟踪,但仍有一些情况下 Subscription.Id 已填充但仍需要登录,因为 Set-AzContext 返回 请提供有效的租户或有效的订阅。
    【解决方案3】:

    我会比彼得建议的更简单一些。只需在脚本开头的某处插入这些行:

    Try {
      Get-AzureRmContext
    } Catch {
      if ($_ -like "*Login-AzureRmAccount to login*") {
        Login-AzureRmAccount
      }
    }
    

    干杯,

    【讨论】:

    • Get-AzureRmContent 在需要登录时并不总是失败。
    • 嗨,Aviad,请您详细说明一下。您有多个订阅活动吗?如果Get-AzureRmContext 没有失败,您稍后在尝试访问 Azure 资源时是否会在脚本中收到错误?
    • 此解决方案似乎不正确。 OP 引用 Azure ASM,此解决方案使用 ARM。从今天开始,使用 Azure ARM 登录将不允许 Azure ASM cmdlet 为访问共享订阅的用户工作。
    • 我试过这个并没有登录。Get-AzureRmContent 没有失败。但是,它返回我的帐户为空。 Mark Grills 的回答抓住了这一点,据我所知会更好。
    【解决方案4】:

    试试这个:

    function Check-Session () {
        $Error.Clear()
    
        #if context already exist
        Get-AzureRmContext -ErrorAction Continue
        foreach ($eacherror in $Error) {
            if ($eacherror.Exception.ToString() -like "*Run Login-AzureRmAccount to login.*") {
                Add-AzureAccount
            }
        }
    
        $Error.Clear();
    }
    
    #check if session exists, if not then prompt for login
    Check-Session
    

    【讨论】:

      【解决方案5】:

      以下对我来说效果很好,只是尝试选择订阅,如果出错,提示登录:

      Try
      {
          Select-AzureRmSubscription -SubscriptionName $SUBSCRIPTIONNAME -ErrorAction Stop
      }
      Catch{
          Add-AzureRmAccount
          Select-AzureRmSubscription -SubscriptionName $SUBSCRIPTIONNAME
      }
      

      【讨论】:

        【解决方案6】:

        将 Azure 上下文存储在脚本开头的变量中,并检查“Account”属性,因为当没有活动登录时它为 NULL。

        $context = Get-AzureRmContext
        if($context.Account -eq $null)
        {
            Login-AzureRmAccount
        }

        【讨论】:

          【解决方案7】:

          您可以查看 Add-AzureAccount 操作的结果

          $result = Add-AzureAccount
          if (!$result) {Write-Output "Login to Azure failed"}
          else {Write-Output "Login successful - user $result.Id"}
          

          【讨论】:

          • 我不认为它回答了这个特定的问题。它确实回答了stackoverflow.com/questions/28105128/…,事实上我使用了类似你的代码来回答这个问题。
          • 这里的答案没有回答我如何知道会话是否过期,因此我是否必须使用 Add-AzureAccount 显示登录屏幕。
          猜你喜欢
          • 2013-05-25
          • 2017-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多