如何在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
相关产品推荐
相关产品推荐

