Azure Powershell用于检查资源名称

时间:2016-02-10 03:00:25

标签: powershell azure

Azure可以拒绝随机生成的资源名称。是否有任何Powershell cmdlet来检查这些名称?

我知道有一个Test-AzureName。但它只适用于有限类型的资源。对我的用例来说还不够。 (存储,SQL,DNS,公共IP)

我知道有这个REST-API。但是当我通过Invoke-RestMethod调用它时,它会返回一个错误:{" error":{" code":" AuthenticationFailed"," message&# 34;:"身份验证失败。授权'标题丢失。"}}

我对Powershell不是很擅长,有人可以指出我使用Azure Powershell cmdlet执行此类任务或帮助我使REST-API工作吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

Invoke-RestMethod与" Check resource name" REST API足以满足您的需求。但是,你需要做一些准备。

首先,您需要创建一个Active Directory应用程序。

  1. Classic Portal
  2. 中登录您的Azure Accout
  3. 从左侧窗格中选择 Active Directory ,可以单击您的默认目录。
  4. 点击应用,然后点击底部窗格中的添加
  5. 您应该创建 WEB APPLICATION AND / OR WEB API 。对于 NAME SIGN-ON网址 APP ID URI ,请输入任何合适的内容,因为在这种情况下它并不重要。我输入" https://localhost"测试时 SIGN-ON URL APP ID URI
  6. 点击确定进行创建。
  7. 创建后,点击您应用的配置。向下滚动到“密钥”部分,然后选择您希望密码有效的时长。
  8. 保存并获取客户的密钥。在此页面中,您可以获取客户端ID和密钥。将它们复制并保存在其他地方,因为稍后您将需要它们。
  9. 配置页面的其他应用程序的权限下,点击添加应用程序
  10. 选择 Windows Azure Service Management API ,然后点击确定添加。
  11. Access Azure服务管理作为组织用户(预览)委派权限添加到服务管理API。
  12. 保存更改。
  13. 有关此内容的详情,请参阅Create Active Directory application and service principal using portal

    以下脚本将为您提供适当的REST API标头。

    try{
        $subscription = Get-AzureRmSubscription
    }
    catch{
        Login-AzureRmAccount
        $subscription = Get-AzureRmSubscription
    }
    
    $tenantId = $subscription.TenantId
    
    #these are the client id and key you get from the above steps.
    $clientId = "<your client id>"
    $key = "<your key>"
    
    $authUrl = "https://login.windows.net/${tenantId}"
    $AuthContext = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]$authUrl
    
    $cred = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential $clientId,$key
    $result = $AuthContext.AcquireToken("https://management.core.windows.net/",$cred)
    $authHeader = @{
    'Content-Type'='application/json'
    'Authorization'=$result.CreateAuthorizationHeader()
    }
    
    $URI = "https://management.azure.com/providers/microsoft.resources/checkresourcename?api-version=2014-01-01"
    Invoke-RestMethod -Uri $URI -Method POST -Headers $authHeader -Body "{'Name':'<the name you want to test>','Type':'<the resource type you want to test>'}"
    

答案 1 :(得分:0)

问题的核心是如何为 Invoke-Rest 构建身份验证 http标头以满足Azure要求。您可以按照以下方式执行此操作

  1. 在Azure默认Active Directory中创建应用程序
  2. 保存应用程序客户端ID和密钥
  3. 将应用程序适当的权限授予资源组
  4. 添加&#34; Microsoft.IdentityModel.Clients.ActiveDirectory.dll&#34;在你的Powershell背景下
  5. 为令牌
  6. 调用Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext方法 AcquireTokenAsync
  7. 通过第5步中的令牌构建auth标头
  8. 将标头和休息uri传递给 Invoke-Rest cmdlet
  9. 更多细节,您可以参考How to authenticate Azure Rest API with Azure Service Principal by Powershell获取完整的示例代码。

答案 2 :(得分:0)

如上所述,大多数提供程序都有一个名为checkNameAvailabilityhttps://docs.microsoft.com/en-us/search/?search=checkNameAvailability&scope=REST)的API,您可以使用它来查看名称是否已被使用或在全球范围内是唯一的。我将其中一些包装在PowerShell函数中。参见https://secureinfra.blog/2019/11/07/test-azure-resource-name-availability/