WMI - прямой доступ к одноэлементному экземпляру Win32_OperatingSystem - PullRequest
3 голосов
/ 11 сентября 2008

У меня возникли проблемы с прямым доступом к Win32_OperatingSystem классу управления, доступному через WMI.

Это одноэлементный класс, и я вполне уверен, что "Win32_OperatingSystem = @" является правильным синтаксисом пути для получения экземпляра одноэлементного.

Вызов InvokeMethod создает исключение, указанное в нижней части вопроса, а также доступ к свойству ClassPath (закомментированная строка).

Что я делаю не так?

[Я знаю, что могу использовать ManagementObjectSearcher / ObjectQuery для возврата коллекции Win32_OperatingSystem (которая будет содержать только один), но, поскольку я знаю, что это одноэлементный файл, я хочу получить к нему прямой доступ.]


ManagementScope cimv2 = InitScope(string.Format(@"\\{0}\root\cimv2", this.Name));

ManagementObject os = new ManagementObject(
    cimv2,
    new ManagementPath("Win32_OperatingSystem=@"),
    new ObjectGetOptions());

//ManagementPath p = os.ClassPath;

os.InvokeMethod("Reboot", null);

Исключение System.Management.ManagementException Сообщение = "Неверный путь к объекту" Источник = "System.Management" Трассировки стека: в System.Management.ManagementException.ThrowWithExtendedInfo (ManagementStatus errorCode) в System.Management.ManagementObject.Initialize (Boolean getObject) в System.Management.ManagementBaseObject.get_wbemObject () в System.Management.ManagementObject.get_ClassPath () в System.Management.ManagementObject.GetMethodParameters (String methodName, ManagementBaseObject & inParameters, IWbemClassObjectFreeThreaded & inParametersClass, IWbemClassObjectFreeThreaded & outParametersClass) в System.Management.ManagementObject.InvokeMethod (String methodName, Object [] args)


Спасибо за ответы.

Ник - Я не знаю, как это сделать:)

Uros - У меня сложилось впечатление, что это был одноэлементный класс из-за этой страницы MSDN. Кроме того, открытие класса в утилите WBEMTest показывает this .


Диалог экземпляров показывает: «1 объект» и «Максимальная партия: 1» в этих полях и списки «Win32_OperatingSystem = @»

ManagementScope проверен как работающий, поэтому я не знаю, что случилось. Я новичок в WMI, но это один из самых простых вариантов использования!

Ответы [ 6 ]

2 голосов
/ 18 сентября 2008

Я только что попробовал это простое приложение, которое работало нормально

using System;
using System.Management;

namespace WmiPlay
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ManagementScope cimv2 = new ManagementScope(@"\\.\root\cimv2");
                ManagementObject os = new ManagementObject(cimv2, new ManagementPath("Win32_OperatingSystem=@"), new ObjectGetOptions());
                Console.Out.WriteLine(os);
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
            }
        }
    }
}

Посмотри, работает ли это у тебя? Я запускал его в Visual Studio, которую я обычно запускаю как администратор в Vista x64.

2 голосов
/ 15 сентября 2008

Win32_OperatingSystem не является одноэлементным классом - если вы проверите его квалификаторы, вы увидите, что для него не определен квалификатор Singleton, поэтому вам придется использовать ManagementObjectSearcher.Get () или ManagementClass.GetInstances () даже при есть только один экземпляр класса. Свойство ключа Win32_OperatingSystem имеет значение Name, поэтому есть возможность получить экземпляр напрямую, используя

ManagementObject OS = new ManagementObject(@"Win32_OperatingSystem.Name='OSname'")

но по моему опыту, OSName всегда что-то вроде:

"Microsoft Windows XP Professional | C: \ WINDOWS | \ Device \ Harddisk0 \ Partition1"

, поэтому использование ManagementObjectSearcher, вероятно, самое простое решение.

1 голос
/ 16 сентября 2008

Дункан написал:

Диалог экземпляров показывает: «1 объект» и «Максимальная партия: 1» в этих полях и> списки «Win32_OperatingSystem = @»

Это, похоже, должно работать. Вы можете протестировать свой код с другим одноэлементным классом, например:

"Win32_WmiSetting = @"

и посмотрите, получите ли вы еще исключение.

1 голос
/ 16 сентября 2008

Я бы, вероятно, построил запрос, который получает экземпляр, где Primary = true. Я некоторое время не использовал Win32_OperatingSystem, но, похоже, я помню, что получал несколько экземпляров, и тот, который был загружен в данный момент, имел значение Primary, равное true.

1 голос
/ 12 сентября 2008

Я не уверен на 100% в ответе, но вы пытались использовать отражатель, чтобы посмотреть, что делает ManagementObjectSearcher? Это может дать вам некоторое представление о том, что вы делаете неправильно.

0 голосов
/ 16 сентября 2008

Ух ты, мир меняется. Извините, я не осознавал, что вы используете Vista. Как вы можете видеть здесь , в Windows XP все было иначе. Итак, что происходит, когда вы нажимаете кнопку «Экземпляры»?

...