物理ディスクを通過し、WMI 設定を表示する以下のコードがあります。
WMI パラメーターが存在しない場合、何も表示されないことに気付きました (これは問題ありません) が、これは、サーバー上に存在する後続の WMI パラメーターに干渉し、何も表示されません...表示されるべきであっても..以下の例。
つまり、コードは次の部分を通過するということです。
lblcapability_desc.Text = "Capability Description: " + moDisk["CapabilityDescription"].ToString();
lblAvailability.Text = "Availability: " + moDisk["Availability"].ToString();
lblbytepersector.Text = "Bytes per Sector: " + moDisk["BytesPerSector"].ToString();
lbl_deviceid.Text = "Device ID: " + moDisk["systemname"].ToString();
最初に SystemName を取得し、次に Type を取得します。
次に、コンピューターに「可用性」などの WMI パラメーターが存在しない場合、それは表示されません。それは結構です。ただし、「可用性」の直後に「セクターあたりのバイト数」パラメーターなどがあります。これらのパラメータも何も表示しません(サーバー上に存在するため、何かを表示する必要があることはわかっていますが、powershellでテストされています)。
「Availability」からの情報の欠如がパラメータに干渉し、何も表示しないようです。
これを修正する瞬間に私が考えることができる唯一の方法は (たとえ可用性が何も示していなくても、後続のパラメーターが必要なデータを示している場合でも)、各 WMI パラメーター内に IF THEN を追加することです。これを修正する方法。
したがって、例としては、IF [Availability] の次にメッセージ "Avialbility = anything" ELSE "WMI parameter not found" が表示されます。このように、各 WMI パラメータには独自のエラー チェックがあります。私が想像する素敵なコーディングではありません..
WMI パラメータが存在しない場合のエラー キャプチャがすでに存在し、コメントがエンド ユーザーに表示されます。
コードは次のとおりです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using Microsoft.Win32;
namespace diskdrive_info
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Get all the disk drives
ManagementObjectSearcher mosDisk = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
// Loop through each object (disk) retrieved by WMI
foreach (ManagementObject moDisk in mosDisk.Get())
{
cmbHdd.Items.Add(moDisk["Model"].ToString());
}
}
private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
foreach (ManagementObject moDisk in mosDisks.Get())
{
lblSystemName.Text = "SystemName: " + moDisk["systemname"];
lblType.Text = "Type: " + moDisk["MediaType"].ToString();
lblModel.Text = "Model: " + moDisk["Model"].ToString();
lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString() + " bytes (" + Math.Round(((((double)Convert.ToDouble(moDisk["Size"]) / 1024) / 1024) / 1024), 2) + " GB)";
lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString();
lblSectors.Text = "Sectors: " + moDisk["SectorsPerTrack"].ToString();
lblSignature.Text = "Signature: " + moDisk["Signature"].ToString();
lblFirmware.Text = "Firmware: " +moDisk["FirmwareRevision"].ToString();
lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"] == null ? "Not Available" : moDisk["FirmwareRevision"].ToString();
lblcapability_desc.Text = "Capability Description: " + moDisk["CapabilityDescription"].ToString();
lblAvailability.Text = "Availability: " + moDisk["Availability"].ToString();
lblbytepersector.Text = "Bytes per Sector: " + moDisk["BytesPerSector"].ToString();
lbl_deviceid.Text = "Device ID: " + moDisk["systemname"].ToString();
}
}
catch (Exception exp)
{
lblError.Text = "Some properties were not shown due to WMI errors or member not available on this system";
}
}
private void btn_clear_Click(object sender, EventArgs e)
{
//lblSystemName.Text = string.Empty;
lblSystemName.Text = "SystemName: " + "";
lblType.Text = "Type: " + "";
lblModel.Text = "Model: " + "";
lblCapacity.Text = "Capacity: " + "";
lblPartitions.Text = "Partitions: " + "";
lblSectors.Text = "Sectors: " + "";
lblSignature.Text = "Signature: " + "";
lblFirmware.Text = "Firmware: " + "";
lblError.Text = String.Empty;
cmbHdd.Items.Clear();
cmbHdd.Text = "";
ManagementObjectSearcher mosDisk = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject moDisk in mosDisk.Get())
{
cmbHdd.Items.Add(moDisk["Model"].ToString());
}
}
}
}