我不知道如何通过摘要来介绍这个问题,所以我将直接进行解释。
我目前正在 C# 应用程序中实现一些功能,这些功能依赖于执行各种 powershell 命令。准确地说,我正在尝试从 Windows Server 2012 iSCSI 目标功能中检索服务器目标列表。
PS 命令是Get-IscsiServerTarget,作为示例,它返回以下输出:
ID:Server0.contoso.local:SQLTarget 目标名称:SQL 目标 TargetIqn:iqn.1991-05.com.microsoft:server0-sqltarget-target 描述 : 启用:真 状态:空闲 最后登录 : 12/31/1600 4:00:00 PM 启用章:假 EnableReverseChap : 假 计算机名:Server0.contoso.local 最大接收数据段长度:65536 第一次突发长度:65536 最大突发长度:262144 接收缓冲区计数:10 强制空闲超时检测:真 InitiatorIds : {IPAddress:10.1.1.3} LunMappings : {TargetName:SQLTarget;WTD:2;LUN:0} 版本:3.3.16543 服务器信息:Server0.contoso.local
在管道上调用命令后返回的 PSObject 集合是Microsoft.Iscsi.Target.Commands.IscsiServerTarget对象的集合,这很好,因为我可以访问所有原始类型的属性。我的问题是LunMappings是Microsoft.Iscsi.Target.Commands.LunMapping类型,我找不到访问该特定对象属性的方法。
在属性上调用 ToString() 会产生一个等于“Microsoft.Iscsi.Target.Commands.LunMapping[]”的字符串——这显然不是我想要的。
在我心中我想做的是
psobject[index].Properties["LunMappings"].Properties["Lun"]
或者
((Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"]).Lun
在引用了必要的程序集之后,我尝试了最后一个,但我收到了编译错误。
我将不胜感激任何指导、方向或建设性意见。
编辑
在项目中放置对 Microsoft.Iscsi.Target.Commands.dll 的引用以允许转换 PSObject((Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"]).Lun
会导致编译错误 - Error 4 The type or namespace name 'Iscsi' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)
。
编辑
现在已经修复了这个问题。第一次编辑中提到的错误4问题,当我尝试投射时,是因为该项目针对的是3.5框架并且引用的程序集需要4.0。现在我能够成功地投射对象。