3

我不知道如何通过摘要来介绍这个问题,所以我将直接进行解释。

我目前正在 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对象的集合,这很好,因为我可以访问所有原始类型的属性。我的问题是LunMappingsMicrosoft.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。现在我能够成功地投射对象。

4

2 回答 2

0

在属性上调用 ToString() 会产生一个等于“Microsoft.Iscsi.Target.Commands.LunMapping[]”的字符串——这显然不是我想要的。

不调用 ToString,而是转换为 Microsoft.Iscsi.Target.Commands.LunMapping[]:

// obj is the thing than you used to call ToString() on that retuned
// "Microsoft.Iscsi.Target.Commands.LunMapping[]
var mappings = (Microsoft.Iscsi.Target.Commands.LunMapping[])obj;
// Check the length of the array and read the index 
// you are interested in instead of 0
int myLun = mappings[0].Lun;

只是为了解决您对编译器错误的评论:

在此处输入图像描述

正确引用后,您应该不会收到错误。仔细检查一切。你的设置有问题,你没有告诉。正如你在图片中看到的那样,演员编译得很好。

即使您引用了程序集,也有几个原因可能会导致错误。例如看这里这里

于 2013-07-02T22:45:04.383 回答
0

LunMappings属性是一个对象数组LunMapping因此您首先需要转换为该数组类型。完成后,您需要访问数组的某个索引,此时您可以访问该.Lun属性

var arr = (Microsoft.Iscsi.Target.Commands.LunMapping[])psobject[index].Properties["LunMappings"];
arr[0].Lun;
于 2013-07-02T22:31:41.447 回答