You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中解析System.Collections.Generic.List`1[Microsoft.Online.Administration.UserLicense]对象以提取租户用户许可证信息

解析PowerShell返回的用户许可证集合数据

嘿,我完全懂你现在遇到的困扰——直接打印member.Value时出现的那个长串类型名,是因为你打印的是一个泛型列表集合,它的默认ToString()方法只会输出类型的全名,不会把里面的具体数据展示出来。别担心,咱们只要遍历这个集合里的每一个许可证对象,就能提取出你要的信息了。

问题原因

你拿到的member.Value其实是List<Microsoft.Online.Administration.UserLicense>类型的对象,当你直接调用Console.WriteLine时,它会调用这个列表的默认ToString()方法,而这个方法只会返回类型的限定名,也就是你看到的System.Collections.Generic.List1[Microsoft.Online.Administration.UserLicense]`。

解决方案:遍历集合并提取属性

你可以把member.Value强转成对应的列表类型,然后逐个遍历里面的UserLicense对象,取出它的属性(比如AccountSkuId、DisabledPlans等)来打印。这里给你修改后的代码:

foreach (PSObject result in PS.Invoke())
{
    foreach (var member in result.Members)
    {
        if (member.Name == "Licenses")
        {
            // 将值强转为UserLicense的列表
            var userLicenseList = member.Value as List<Microsoft.Online.Administration.UserLicense>;
            
            if (userLicenseList != null && userLicenseList.Any())
            {
                Console.WriteLine("\n==== 当前用户的许可证信息 ====");
                foreach (var license in userLicenseList)
                {
                    // 打印许可证的SKU ID
                    Console.WriteLine($"许可证SKU: {license.AccountSkuId}");
                    
                    // 打印已禁用的服务计划(如果有的话)
                    if (license.DisabledPlans?.Any() == true)
                    {
                        Console.WriteLine("已禁用的服务计划:");
                        foreach (var planId in license.DisabledPlans)
                        {
                            Console.WriteLine($"  - {planId}");
                        }
                    }
                    else
                    {
                        Console.WriteLine("无禁用的服务计划");
                    }
                    
                    Console.WriteLine("------------------------");
                }
            }
            else
            {
                Console.WriteLine("该用户无任何许可证");
            }
        }
    }
}

额外说明

  • 引用必要的库:如果你的项目还没引用相关库,需要通过NuGet安装Microsoft.Online.Administration.Automation包,这样才能识别Microsoft.Online.Administration.UserLicense类型。
  • 动态类型替代方案:如果你不想强转类型(比如暂时不想引用库),也可以用dynamic来遍历,代码会更灵活,但少了编译时类型检查:
foreach (PSObject result in PS.Invoke())
{
    foreach (var member in result.Members)
    {
        if (member.Name == "Licenses")
        {
            var licenses = member.Value as IEnumerable;
            if (licenses != null)
            {
                Console.WriteLine("\n==== 当前用户的许可证信息 ====");
                foreach (dynamic license in licenses)
                {
                    Console.WriteLine($"许可证SKU: {license.AccountSkuId}");
                    // 同样可以访问DisabledPlans等属性
                }
            }
        }
    }
}

这样修改后,你就能看到每个用户的具体许可证详情,而不是那个晦涩的类型名称啦!

内容的提问来源于stack exchange,提问作者Nithish Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:27:48