WMI – прямой доступ к одноэлементному экземпляру Win32_OperatingSystem

StackOverflow https://stackoverflow.com/questions/56208

Вопрос

У меня возникли проблемы с прямым доступом к Win32_Операционная система класс управления, который предоставляется через 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.ManagemageException был пойман сообщением = "Неверный путь объекта" Source = "System.Management" StackTrace:at System.Management.ManagementException.ThrowTheTexTendendInFo (ManagementStatus ErrorCode) на System.Management.ManagemageObject.Itialize (Boolean getObject) на System.Management.ManagementBaseObject.get_Wbemobject () на System.Management.ManagemageObject.get_Classpath () at at system.managemage.managementobjectobject.management.managementobject.get_classpath. .GetMethodParameters (String Methodname, ManagementBaseObject & Inparameters, iwbemClassObjectFreeThreaded & InparametersClass, iwbemClassObjectFreethed & OutParametersClass) на System.Management.ManagementObject.invokeMethod (String Methodname, объект [] args)


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

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

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


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

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

Это было полезно?

Решение

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

Другие советы

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, вероятно, является самым простым решением.

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

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.

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

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

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

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

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

"Win32_WmiSetting=@"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top