c# - 使用 Azure.ResourceManager 在 C#/dotnet 中获取 Azure VM PowerState

标签 c# .net azure virtual-machine power-state

我想使用 Azure.ResourceManager(不是 PowerShell、CLI、REST、不使用任何已弃用的 Fluent)在 C#/dotnet 应用程序中获取已知 Azure VM 实例的 PowerState(开/关/重新启动等)方法)。

我可以使用 REST 成功完成此操作,因此我知道底层 VM InstanceView 数据存在,但对于此应用程序,REST 将无法通过测试。

我正在使用以下代码; vm.Data.Name 按预期返回,但从 InstanceView.Statuses 获得空响应。

除了旧的、已弃用的方法之外,我找不到任何有用的 MSFT 文档。

有谁知道如何通过 Azure.ResourceManager 获取 PowerState,或者为什么我得到 NULL?

谢谢!!

[代码示例于 2023 年 1 月 16 日更新如下,更改了身份验证方法,InstanceView 仍返回 NULL]

using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Compute.Models;
using Azure.ResourceManager.Resources;

namespace Test
{
    public class Program
    {
        public static async Task ListAllVms()
        {
            ArmClient armClient = new ArmClient(new DefaultAzureCredential());
            SubscriptionResource subscription = await armClient.GetDefaultSubscriptionAsync();
            string rgName = "redacted";
            ResourceGroupResource resourceGroup = await subscription.GetResourceGroups().GetAsync(rgName);
            VirtualMachineCollection vmCollection = resourceGroup.GetVirtualMachines();
            AsyncPageable<VirtualMachineResource> response = vmCollection.GetAllAsync();
            
            await foreach (VirtualMachineResource vm in response)
            {
                Console.WriteLine(vm.Data.Name);
                foreach (InstanceViewStatus istat in vm.Data.InstanceView.Statuses)
                {
                    Console.WriteLine("\n  code: " + istat.Code);
                    Console.WriteLine("  level: " + istat.Level);
                    Console.WriteLine("  displayStatus: " + istat.DisplayStatus);
                }
            }
        }

        public static async Task Main(string[] args)
        {
            await ListAllVms();
        }
    }
}

最佳答案

从我这边复制后,我可以使用 vm.Get().Value.InstanceView().Value.Statuses[1].DisplayStatus 来实现此目的。下面是对我有用的完整代码,其中我列出了资源组中存在的所有虚拟机并获取其状态。

using System;
using System.Threading.Tasks;
using Azure;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Compute;
using Azure.ResourceManager.Compute.Models;
using Azure.ResourceManager.Resources;

namespace ConsoleApp1
{
    class Program
    {
        static async Task Main(string[] args)
        {
            ArmClient armClient = new ArmClient(new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions() { TenantId = "<YOUR_TENAT_ID>" }));
            SubscriptionResource subscriptionResource = await armClient.GetDefaultSubscriptionAsync();

            string rgName = "<YOUR_RESOURCE_GROUP>";
            ResourceGroupResource resourceGroupResource = await subscriptionResource.GetResourceGroups().GetAsync(rgName);

            VirtualMachineCollection vmCollection = resourceGroupResource.GetVirtualMachines();
    
            // Lists all virtual machines
            AsyncPageable<VirtualMachineResource> vmList = vmCollection.GetAllAsync();
            Console.WriteLine("Listing");
            await foreach (VirtualMachineResource vm in vmList)
            {
                Console.WriteLine(vm.Data.Name);
                Console.WriteLine(vm.Get().Value.InstanceView().Value.Statuses[1].DisplayStatus);
            }
        }
    }
}

输出:

enter image description here

关于c# - 使用 Azure.ResourceManager 在 C#/dotnet 中获取 Azure VM PowerState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75116030/

相关文章:

Azure 云服务上的 WCF 与 Azure 网站客户端

azure - 如果启用了 Azure 网站的自动缩放功能,我是否需要负载均衡器?

c# - For 循环直到 SQL 命令返回某个值

c# - 在 TextBlock 中环绕文本

c# - _NT_SYMBOL_PATH adplus windbg 问题,无法设置名称

c# - 在 C# 中发送 USSD?

.net - 有关重构现有 .net 应用程序以支持本地化的技巧?

deployment - 由于启动脚本,Azure 部署失败

c# - 为多个应用程序创建 VSTO 插件

c# - 如何在 C# AWS SDK 中强制使用 HTTP-only 模式?