Question

J'ai de la difficulté à accéder directement à la Win32_OperatingSystem gestion de la classe qui est exposée via WMI.

C'est une classe singleton, et je suis à peu près certain "Win32_OperatingSystem=@" est le chemin d'accès correct de syntaxe de l'exemple d'un singleton.

L'appel à InvokeMethod produit de l'exception énoncée au fond de la question, comme le fait d'accéder au ClassPath de la propriété (ligne de commentaires).

Ce que je fais mal?

[Je suis conscient que je peux utiliser ManagementObjectSearcher/ObjectQuery de renvoyer une collection de Win32_OperatingSystem (qui ne contient qu'un seul), mais depuis que je sais que c'est un singleton, je veux y accéder directement.]


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);

Système.De la gestion.ManagementException a été pris Message="Invalide le chemin de l'objet " Source="Le Système De.De gestion" StackTrace:au Système.De la gestion.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) au Système.De la gestion.ManagementObject.Initialiser(Boolean getObject) au Système.De la gestion.ManagementBaseObject.get_wbemObject() au Système.De la gestion.ManagementObject.get_ClassPath() au Système.De la gestion.ManagementObject.GetMethodParameters(String methodName, ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersClass, IWbemClassObjectFreeThreaded& outParametersClass) au Système.De la gestion.ManagementObject.InvokeMethod(String methodName, Object[] args)


Merci pour les réponses.

Nick - Je ne sais pas comment le faire :)

Uros - J'étais sous l'impression que c'était une classe singleton en raison de cette Page MSDN.Aussi, l'ouverture de la classe dans le WBEMTest utilitaire de montre cette.


Les instances de dialogue affiche:"1 les objets" et "max.lot:1" dans les champs et les listes "Win32_OperatingSystem=@"

Le ManagementScope est vérifié que le travail, donc je ne sais pas ce qui est en place.Je suis un WMI novice, mais cela semble être l'un des plus simple des cas d'utilisation!

Était-ce utile?

La solution

Wow, le monde est en train de changer.Désolé, je ne savais pas que vous étiez à l'aide de Vista.Comme vous pouvez le voir ici, les choses ont été différentes de retour dans Windows XP.Donc, ce qui se passe lorsque vous cliquez sur le "Cas" buton?

Autres conseils

Win32_OperatingSystem n'est pas une classe singleton - si vous cochez ses qualificatifs, vous verrez qu'il n'y a pas de Singleton qualificatif n'est définie, de sorte que vous aurez à utiliser ManagementObjectSearcher.Get() ou ManagementClass.GetInstances (), même s'il n'existe qu'une seule instance de la classe.Win32_OperatingSystem de propriété de la clé est le Nom, donc il y a une option pour obtenir de l'instance directement, à l'aide de

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

mais dans mon expérience, OSName est toujours quelque chose comme:

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

donc, en utilisant ManagementObjectSearcher est probablement la solution la plus simple.

J'ai juste essayé cette application simple qui a fonctionné

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);
            }
        }
    }
}

Voir si cela fonctionne pour vous?Je n'ai couru dans Visual Studio qui j'ai l'habitude de l'exécuter en tant qu'administrateur sous Vista x64.

Je ne suis pas 100% sûr de la réponse, mais avez-vous essayé d'utiliser un réflecteur pour regarder ce ManagementObjectSearcher n'?Il peut vous donner une idée de ce que vous faites mal.

Je serais probablement construire une requête qui récupère l'instance Primaire = true.Je n'ai pas utilisé Win32_OperatingSystem en temps, mais je crois me souvenir obtenir de multiples instances, et celui qui était actuellement démarré avaient Primaire est égal à true.

Duncan a écrit:

Les instances de dialogue affiche:"1 les objets" et "max.lot:1" dans les champs et les >listes "Win32_OperatingSystem=@"

Assurez-vous que cela semble comme il se doit le travail.Vous pouvez tester votre code avec une autre classe singleton, comme:

"Win32_WmiSetting=@"

et voir si vous obtenez toujours l'exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top