データベース サーバー上の SAN WWN 番号について WMI にプログラムでクエリを実行しようとしています。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 パスをさらに下るメンバーがありません。
どんな助けでも大歓迎です。さらに説明が必要な場合はお知らせください。ありがとうございます。