1

我正在尝试以编程方式查询 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路径中走得更远。

任何帮助是极大的赞赏。让我知道是否需要进一步澄清,谢谢。

4

0 回答 0