Azure Invoke-AzureRmVMRunCommand - 正在运行命令扩展执行

时间:2018-05-10 12:20:13

标签: powershell azure

我正在尝试通过Invoke-AzureRmVMRunCommand以及Invoke-RestMethod cmdlet在Azure VM(Windows)上运行一个简单的脚本。 只是试图获取DHCP服务的状态。

  1. 重新启动虚拟机后尝试
  2. 创建了一个新VM以运行相同的脚本但错误相同
  3. 尝试从其他计算机运行调用命令
  4. 存储在test.ps1文件中的脚本

    Get-Service DHCP
    

    命令:

    Invoke-AzureRmVMRunCommand -ResourceGroupName $Resource_Group -VMName $Resource_Name -CommandId RunPowerShellScript -ScriptPath 'C:\Vincent\Azure\AzureVM\Test.ps1'
    

    我甚至尝试过使用Azure API但是同样的错误: 命令:

    $Body = @"
    {
      "commandId": "RunPowerShellScript",
      "script": [
        "Get-Service DHCP"
      ]
    }
    "@
    
    $AppID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    $Key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    $TenantId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    $SubscriptionID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    $GetToken = "https://login.microsoftonline.com/$TenantId/oauth2/token?tenant_id=$TenantId"
    $Access_Token = Invoke-RestMethod -Method Post -Uri $GetToken -Body "grant_type=client_credentials&client_id=$AppID&client_secret=$Key&resource=$resource"
    $Token = $Access_Token.access_token
    
    
    $API = "https://management.azure.com/subscriptions/$SubscriptionID/resourceGroups/$Resource_Group/providers/Microsoft.Compute/virtualMachines/$VMName/runCommand?api-version=2017-03-30"
    Invoke-RestMethod -Method Post -Uri $API -Headers @{Authorization = "Bearer $Token"} -Body $Body -ContentType 'application/json' -OutVariable Result
    

    错误: 调用-AzureRmVMRunCommand:

      

    Invoke-AzureRmVMRunCommand:资源   资源下的'Microsoft.Compute / virtualMachines / XXXXXXXX'   未找到“XXXXXX”组。 ErrorCode:ResourceNotFound   ErrorMessage:资源   资源组下的“Microsoft.Compute / virtualMachines / XXXXXXXX”   找不到'XXXXXX'。 StatusCode:404 ReasonPhrase:未找到   OperationID:d5a9e664-92e2-45d6-b5e8-b3d5bd65814c在行:1字符:1   + Invoke-AzureRmVMRunCommand -ResourceGroupName $ Resource_Group -VMName ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:CloseError:(:) [Invoke-AzureRmVMRunCommand],ComputeCloudException       + FullyQualifiedErrorId:Microsoft.Azure.Commands.Compute.Automation.InvokeAzureRmVMRunCommand

    错误API:

      

    Invoke-RestMethod:{“error”:{       “代码”:“冲突”,       “message”:“正在运行命令扩展执行。请在调用运行命令之前等待完成。”第23行:第23行   焦炭:1   + Invoke-RestMethod -Method Post -Uri $ API -Headers @ {Authorization =“...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke-RestMethod],   引发WebException       + FullyQualifiedErrorId:WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

3 个答案:

答案 0 :(得分:0)

Invoke-AzureRmVMRunCommand 在VM上运行命令。

当您提供错误的“ ResourceGroupName ”时,您会收到错误消息。

您可以查看下面的屏幕截图:我提供了错误的资源组并更改为正确的资源组给出了成功。

enter image description here

如果显示正在运行命令扩展执行,则可以从 Azure Portal =>中检查操作。活动日志:

enter image description here

答案 1 :(得分:0)

您收到“找不到资源”错误:

  

错误:Invoke-AzureRmVMRunCommand:

     

Invoke-AzureRmVMRunCommand:资源   资源组下的“ Microsoft.Compute / virtualMachines / XXXXXXXX”   找不到“ XXXXXX” 。错误代码:ResourceNotFound错误消息:   资源下的资源“ Microsoft.Compute / virtualMachines / XXXXXXXX”   找不到“ XXXXXX”组。状态码:404原因短语:找不到   OperationID:d5a9e664-92e2-45d6-b5e8-b3d5bd65814c在第1行:char +1   Invoke-AzureRmVMRunCommand -ResourceGroupName $ Resource_Group -VMName   ... +

+ CategoryInfo : CloseError: (:) [Invoke-AzureRmVMRunCommand], ComputeCloudException + FullyQualifiedErrorId :
Microsoft.Azure.Commands.Compute.Automation.InvokeAzureRmVMRunCommand

然后您会收到一条错误消息,提示“您正在运行invoke-azurermvmrunco​​mmand”,请等到完成为止:

  

错误API:

     

Invoke-RestMethod:{“错误”:{“代码”:“ 冲突”,“消息”:“ 运行   命令扩展正在执行中。请等待完成   在调用运行命令之前。“}}在第23行:char:1 +   Invoke-RestMethod-方法发布-Uri $ API -Headers @ {Authorization =“   ... +

+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod],
WebException + FullyQualifiedErrorId :
WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

运行此命令以检查虚拟机是否在预期的位置,然后检查脚本:

get-azurermvm -resourcegroupname $Resource_Group -Name $Resource_Name
$file = "C:\Vincent\Azure\AzureVM\Test.ps1"
Invoke-AzureRmVMRunCommand -ResourceGroupName $Resource_Group -VMName $Resource_Name -CommandId RunPowerShellScript -ScriptPath $file

如果仍然无效,请与我们分享$Resource_Name.GetType()$Resource_Group.GetType()

答案 2 :(得分:0)

通过在虚拟机的订阅中设置Set-AzureRmContext,您需要先调用Invoke-AzureRmVMRunCommand,然后再调用-SubscriptionName