2

Win32_OperatingSystemのプロパティに格納されている値を使用して、Windowsフォームにいくつかのテキストボックスを入力しようとしています。私はウィンドウズ7を使用しています。

以下は私が使用しているコードです

 ArrayList prName = new ArrayList();
        ArrayList prValue = new ArrayList();
        int i = 0;
        ManagementClass msClassOS = new ManagementClass("Win32_OperatingSystem");
        msClassOS.Options.UseAmendedQualifiers = true;
        PropertyDataCollection properties = msClassOS.Properties;
        foreach (PropertyData property in properties)
        {
            prName.Add(property.Name);
        }

        foreach (PropertyData property in properties)
        {
            prValue.Add(new string[] { msClassOS.GetPropertyValue("Value").ToString() });
         }

以下は私が得ている例外です-

System.Management.ManagementException: Not found 
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.PropertyData.RefreshPropertyInfo()
at System.Management.PropertyDataCollection.get_Item(String propertyName)
at System.Management.ManagementBaseObject.GetPropertyValue(String propertyName)
at NetworkMonitoringSoftware.Form1.tabControl1_Selected(Object sender, TabControlEventArgs e) in C:\Users\OWNER\Documents\Visual Studio 2010\Projects\NetworkMonitoringSoftware\NetworkMonitoringSoftware\Form1.cs:line 

例外とは何か、どうすればそれを克服できるか教えていただけますか?

前もって感謝します。

4

2 に答える 2

4

以下のコードを試すことができます:

using System;
using System.Management;
namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {             
            try
            {
                ManagementClass osClass = new ManagementClass("Win32_OperatingSystem");
                foreach (ManagementObject queryObj in osClass.GetInstances())
                {
                    foreach (PropertyData prop in queryObj.Properties)
                    {
                        //add these to your arraylist or dictionary 
                      Console.WriteLine("{0}: {1}", prop.Name, prop.Value);
                    }                    
                }
            }
            catch (ManagementException e)
            {
                //MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}
于 2013-03-14T11:36:28.110 に答える
2

foreachループでValueを取得するためにプロパティを使用しません。property.Valueはnullになる可能性があることに注意してください。property.Valueは、文字列または配列のオブジェクトです。これは私が作成したコードの抜粋で、あなたを助けることができます:

mo  //ManagementObject
    .Properties
    .OfType<PropertyData>()
    .ToList()
    .ForEach(p =>
    {
        String str = String.Empty;
        if (p.Value != null)
             if (p.Value.GetType().BaseType == typeof(Array)) // Value is a array, special string creation
             {
                 Array list = (p.Value as Array);
                 foreach (object o in list)
                      str += o.ToString() + "-";
                 if (list.Length > 0)
                      str = str.Substring(0, str.Length - 1);
             }
             else // value is already a string
                 str = p.Value.ToString();

         this.ListDuet
             .Add(new Duet()
             {
                 Key = Convert.ToString(p.Name),
                 Value = str
             });
     });

Duetは、データを簡単に管理するために作成したクラスです。

于 2013-03-14T11:09:06.263 に答える