Domanda

Ho problemi ad accedere direttamente al file Win32_SistemaOperativo classe di gestione esposta tramite WMI.

È una classe singleton e sono abbastanza certo che "Win32_OperatingSystem=@" sia la sintassi del percorso corretta per ottenere l'istanza di un singleton.

La chiamata a InvokeMethod produce l'eccezione elencata in fondo alla domanda, così come l'accesso alla proprietà ClassPath (riga commentata).

Che cosa sto facendo di sbagliato?

[Sono consapevole che posso utilizzare ManagementObjectSearcher/ObjectQuery per restituire una raccolta di Win32_OperatingSystem (che ne conterrebbe solo uno), ma poiché so che è un singleton, voglio accedervi direttamente.]


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 è stato catturato Message = "non valido percorso oggetto" sorgente = "System.Management" StackTrace:At System.Management.ManagementException.ThrowWithextendInfo (ManagementStatus ErrorCode) su System.Management.ManagementObject.Initialize (boolean getObject) su system.management.managementBaseObject.get_wbemobject () su system.management.manageagebject.get_classpath () at system.management.managementobject .GetMetHodParameters (String MethodName, ManagementBaseObject & Inparameters, IwbemClassObjectFreethReed & InParaMetersclass, iwbemclassObjectFreethread & OutParametersclass) su System.Management.ManagementObject.InvokeMethod (String Methodname, Object [] Objects)


Grazie per le risposte

Nick - Non so come procedere :)

Uros - Avevo l'impressione che fosse una lezione singleton a causa di Questo Pagina MSDN.Inoltre, aprendo la classe nell'utilità WBEMTest viene visualizzato Questo.


La finestra di dialogo delle istanze mostra:"1 oggetti" e "max.lotto:1" in questi campi ed elenca "Win32_OperatingSystem=@"

È stato verificato che ManagementScope funziona, quindi non so cosa succede.Sono un principiante di WMI, ma questo sembra uno dei casi d'uso più semplici!

È stato utile?

Soluzione

Wow, il mondo sta cambiando.Scusa, non avevo capito che stavi usando Vista.Come potete vedere Qui, le cose erano diverse in Windows XP.Quindi, cosa succede quando fai clic sul pulsante "Istanze"?

Altri suggerimenti

Win32_OperatingSystem non è una classe singleton: se controlli i suoi qualificatori, vedrai che non è definito alcun qualificatore Singleton, quindi dovrai utilizzare ManagementObjectSearcher.Get() o ManagementClass.GetInstances() anche se esiste solo un'istanza della classe.La proprietà della chiave Win32_OperatingSystem è Name, quindi esiste un'opzione per ottenere l'istanza direttamente, utilizzando

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

ma nella mia esperienza, OSName è sempre qualcosa del tipo:

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

quindi utilizzare ManagementObjectSearcher è probabilmente la soluzione più semplice.

Ho appena provato questa semplice app che ha funzionato bene

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

Vedi se funziona per te?L'ho eseguito in Visual Studio che normalmente eseguo come amministratore in Vista x64.

Non sono sicuro al 100% della risposta, ma hai provato a utilizzare reflector per vedere cosa fa ManagementObjectSearcher?Potrebbe darti qualche indizio su cosa stai facendo di sbagliato.

Probabilmente costruirei una query che ottenga l'istanza in cui Primary = true.Non utilizzo Win32_OperatingSystem da un po', ma mi sembra di ricordare di aver ricevuto più istanze e quella attualmente avviata aveva Primary uguale a true.

Duncan ha scritto:

La finestra di dialogo delle istanze mostra:"1 oggetti" e "max.lotto:1" in questi campi ed >elenca "Win32_OperatingSystem=@"

Sembra proprio che dovrebbe funzionare.Potresti testare il tuo codice con un'altra classe singleton, come:

"Win32_WmiSetting=@"

e vedi se ottieni ancora l'eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top