Метод ManagementObjectSearcher Get () генерирует исключение - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь запустить следующий код:

ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Processor");
// This line throws the exception
ManagementObjectCollection moc = mos.Get();

и я получаю следующее исключение:

System.Management.ManagementException: Invalid class 
   at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
   at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
   at LicenseCheckThingy.Form1.button1_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Для справки, система, на которой я работаю, - это машина с Windows XP SP 3 с установленным .net 3.5.

Пользователь на этом аппарате настроен как администратор, но howerver не использует учетную запись «Администратор».

Я создал пример проекта, в котором в основном использовался только этот код в качестве доказательства ошибки. Я знаю из добавления простых сообщений show вокруг двух строк, что строка mos.Get () - это та, которая выбрасывает ошибку, и текст исключения, похоже, поддерживает это благодаря «ManagementObjectEnumerator.MoveNext ()» в трассировке стека. Во всяком случае, я в растерянности относительно того, что даже искать на машине.

Обратите внимание, я запускал этот же код на более чем 50 других компьютерах (большинство из них Vista или Windows 7) без проблем, поэтому кажется, что это будет что-то конкретное для этой коробки. Предложение / мысль о том, что я могу попробовать?

Дополнительная информация: Итак, я запустил следующий код на машине, это вызывает те же исключения, но в объявлении цикла for

MessageBox.Show("pre setup");  // displays correctly
ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\cimv2");

//connect to the machine 
scope.Connect();

MessageBox.Show("scope setup"); // displays correctly

//use a SelectQuery to tell what we're searching in 
SelectQuery searchQuery = new SelectQuery("SELECT * FROM Win32_Processor");
//set the search up 
ManagementObjectSearcher searcherObj = new ManagementObjectSearcher(scope, searchQuery);

MessageBox.Show("search object setup"); // displays correctly

//get the results into a collection 
ManagementObjectCollection obj = searcherObj.Get();

MessageBox.Show("got ManagementObjectCollection"); // displays correctly

// next statement appears to cause Invalid class exception
foreach ( ManagementObject mo in obj )
{
   try
   {
      MessageBox.Show("looking for device id, cpu0"); // never shows up

      if ( string.Equals((string) mo["DeviceID"], "CPU0", StringComparison.InvariantCultureIgnoreCase) )
      {
         MessageBox.Show("processor ID: " + mo["ProcessorID"].ToString()); // never shows up
         break;
      }
   }
   catch ( Exception ex )
   {
      MessageBox.Show("Exception fetching processor id: " + ex.ToString()); // doesn't show
   }
}

Другая помощь ??


Не удалось выяснить это, кажется, что на сайте, который Johnv2020 рекомендовал, есть ошибка или проблема в Windows XP SP3, которая не позволяет мне получить идентификатор процессора. Для справки, на данном компьютере процессор является i5 650, и я «обошел» эту проблему, обернув ее в попытку и игнорируя ID процессора в этом случае. Отдельное спасибо Johnv2020 за помощь!

1 Ответ

1 голос
/ 03 мая 2011

Работает нормально для меня, вы можете попробовать код ниже и посмотреть, что происходит

//set the scope of this search
        ManagementScope scope = new ManagementScope(@"\\" + Environment.MachineName + @"\root\cimv2");
        //connect to the machine
        scope.Connect();
...