我正在尝试以编程方式查询 WMI 以获取数据库服务器上的 SAN WWN 编号。我正在使用 WMI 命名空间 root\wmi 和 MSFC_FibrePortHBAAttributes 类。我的问题是我可以访问此类的 Attributes 属性,但我无法深入到该属性中以获取MSFC_FibrePortHBAAttributes.Attributes.PortWWN
值。
在PowerShell中,查询如下(使用一个索引,因为有多个):
PS C:\Users\e21013> (Get-WmiObject MSFC_FibrePortHBAAttributes -Namespace root\wmi)[0].attributes | select portwwn
portwwn
-------
{99, 1, 1, 1...}
但是,我的任务是在 C# 中执行此操作。例如,在相关的类 MSFC_FCAdapterHBAAttributes 中,我可以通过以下方式使用 C# 查询 HBA 驱动程序名称:
// Special method to abstract out WMI queries in root\wmi namespace
// query is: "select * from MSFC_FCAdapterHBAAttributes"
private void printSANData(String query)
{
ManagementScope scope = new ManagementScope(@"root\wmi");
scope.Connect();
List<PropertyData> valueList = new List<PropertyData>();
SelectQuery selectQuery = new SelectQuery(query);
ManagementObjectSearcher searcher = new
ManagementObjectSearcher(scope, selectQuery);
ManagementObjectCollection information = searcher.Get();
try
{
foreach (ManagementObject obj in information)
{
foreach (PropertyData property in obj.Properties)
{
if (property.Name.ToString().Equals("DriverName"))
{
string hbaDriver = "nothing";
hbaDriver = property.Value.ToString();
Console.WriteLine("DriverName: " + hbaDriver);
}
}
}
}
catch (ManagementException)
{
Console.Write("Server not SAN attached.");
}
searcher.Dispose();
}
这给了我:“DriverName:elxstor”,一个驱动程序名称。凉爽的。
但是,当我想使用相同的查询逻辑和方法来查询要查询的 MSFC_FibrePortHBAAttributes 类时MSFC_FibrePortHBAAttributes.Attributes.portwwn
,我会卡住,因为 Attributes 是一个System.Management.ManagementBaseObject
并且我无法弄清楚如何深入到对象中以获取它的底层属性。
如果我尝试:
if (property.Name.ToString().Equals("Attributes"))
{
string hbaAttribute = "nothing";
hbaAttribute = property.Value.ToString();
Console.WriteLine("Value: " + hbaAttribute);
}
我得到:“值:System.Management.ManagementBaseObject”并且for循环中的属性变量没有任何成员可以在WMI路径中走得更远。
任何帮助是极大的赞赏。让我知道是否需要进一步澄清,谢谢。