Azure资源管理API未显示虚拟机状态?

时间:2016-05-30 23:31:10

标签: c# api azure

所以我一直在用资源管理api对只读api访问azure。现在我专注于虚拟机。我一直在使用TokenCredentials的这个预发布包:

https://www.nuget.org/packages/Microsoft.Azure.Management.Compute/13.0.1-prerelease

我得到了一大堆关于我的虚拟机的丰富信息,但是我错过了一个非常好的批评数据,那就是vm是打开还是关闭。当我预计它们被填充时,我发现了一些元数据属性,比如InstanceView和Plan为null。这可能是因为我推出了我的vms,它可能是一个未完成或有缺陷的新包装,我无法分辨。我在想InstanceViews的雕像会告诉我vm的状态。

https://msdn.microsoft.com/en-us/library/microsoft.azure.management.compute.models.virtualmachineinstanceview.aspx

所以我想我必须到别处去看看。我确实找到了这个旧的stackoverflow问题,这可能是我正在寻找的:

azure management libraries virtual machine state

但是我不确定这个GetAzureDeyployment是什么dll,或者它甚至是TokenCredential兼容的。有谁知道什么?

1 个答案:

答案 0 :(得分:1)

您可以使用以下c#代码获取VM的电源状态。

using System;
using System.Security;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.Rest;

namespace GetVmARM
{
    class Program
    {

        private static String tenantID = "<your tenant id>";
        private static String loginEndpoint = "https://login.windows.net/";
        private static Uri redirectURI = new Uri("urn:ietf:wg:oauth:2.0:oob");
        private static String clientID = "1950a258-227b-4e31-a9cf-717495945fc2";
        private static String subscriptionID = "<your subscription id>";
        private static String resource = "https://management.core.windows.net/";



        static void Main(string[] args)
        {
            var token = GetTokenCloudCredentials();
            var credential = new TokenCredentials(token);
            var computeManagementClient = new ComputeManagementClient(credential);
            computeManagementClient.SubscriptionId = subscriptionID;

            InstanceViewTypes expand = new InstanceViewTypes();

            var vm = computeManagementClient.VirtualMachines.Get("<the resource group name>", "<the VM>", expand);

            System.Console.WriteLine(vm.InstanceView.Statuses[1].Code);
            System.Console.WriteLine("Press ENTER to continue");
            System.Console.ReadLine();
        }

        public static String GetTokenCloudCredentials(string username = null, SecureString password = null)
        {
            String authString = loginEndpoint + tenantID;

            AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);

            var promptBehaviour = PromptBehavior.Auto;

            var userIdentifierType = UserIdentifierType.RequiredDisplayableId;

            var userIdentifier = new UserIdentifier("<your azure account>", userIdentifierType);

            var authenticationResult = authenticationContext.AcquireToken(resource, clientID, redirectURI, promptBehaviour, userIdentifier);

            return authenticationResult.AccessToken;
        }

    }
}

正如您在这段代码中所看到的,我使用的是文档中没有的InstanceViewTypes。这是13.0.1预发布版本中的新功能。但是,如果您将此添加到您的computeManagementClient.VirtualMachines.Get方法,您将能够获得VM的额外信息。

此外,我使用的是vm.InstanceView.Statuses [1],因为vm.InstanceView.Statuses [0]是ProvisioningState。并且,我不确定订单是否总是这样,所以您可能需要遍历整个状态列表。