2016-07-06 29 views
5

Ich halte eine "Invalid Query" Ausnahme erhalten, wenn Sie die folgende Abfrage auszuführen versuchen:WMI .NET Ungültige Abfrage

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskQuota WHERE QuotaVolume.DeviceID = 'C:'"); 
ManagementObjectCollection quotaCollection = searcher.Get(); 

aber dies funktioniert: "* FROM Win32_DiskQuota SELECT".

MSDN Nach:

Für die meisten Anwendungen von Klasse-Deskriptoren in einer WHERE-Klausel, WMI markiert die Abfrage als ungültig und einen Fehler zurückgibt. Verwenden Sie jedoch den Punkt (.) -Operator für Eigenschaften des Typs Objekt in WMI. Zum Beispiel ist die folgende Abfrage gültig, wenn Prop gültige Eigenschaft von MyClass und ist Typ Objekt:

SELECT * FROM MyClass WHERE Prop.embedprop = 5

Ist es das funktioniert nur bedeuten, wenn Prop deklariert als OBJEKT?

Hier sind die Ausnahme-Details:

System.Management.ManagementException was unhandled 
    HResult=-2146233087 
    Message=Invalid query 
    Source=System.Management 
    StackTrace: 
     в System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 
     в System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext() 
     в UserQuota.Program.getQuota() в c:\users\administrator\documents\visual studio 2015\Projects\UserQuota\UserQuota\Program.cs:строка 40 
     в UserQuota.Program.Main(String[] args) в c:\users\administrator\documents\visual studio 2015\Projects\UserQuota\UserQuota\Program.cs:строка 33 
     в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     в System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     в System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

rechts schaut. Sie müssen die Ausnahme abfangen und den Inhalt in [Bearbeiten] einfügen. Rufen Sie ToString für das Objekt auf oder verwenden Sie das Ausnahmedialogfeld (klicken Sie unten auf den Link "Inhalte in die Zwischenablage einfügen"). – Will

+1

Ich habe die Ausnahme hinzugefügt, aber es scheint nicht viel Details ... –

+0

Ich habe meine Antwort mit Beispielcode bearbeitet, die hoffentlich helfen wird. – Tomer

Antwort

1

Ja. Laut der Win32_DiskQuota class documentation ist die QuotaVolume-Eigenschaft eine Referenz auf eine Win32_LogicalDisk WMI-Klasse. Das Zitat von MSDN, das Sie angegeben haben, gab den Grund, warum die Abfrage gemäß den WQL-Spezifikationen ungültig ist, an.

Stattdessen können Sie so etwas wie folgt verwenden:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskQuota WHERE QuotaVolume = \"Win32_LogicalDisk.DeviceID=\\\"C:\\\"\""); 
ManagementObjectCollection quotaCollection = searcher.Get(); 

(Beachten Sie alle Entkommen ...)

+0

Das hat für mich funktioniert, danke! –