2016-07-06 14 views
5

Continuo a ricevere un'eccezione "Invalid query" quando si tenta di eseguire la query seguente:query WMI .NET valido

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

Tuttavia questo funziona: "SELECT * FROM Win32_DiskQuota".

Secondo MSDN:

Per la maggior parte degli utilizzi di descrittori di classe in una clausola WHERE, WMI bandiere la query come non valido e restituisce un errore. Tuttavia, utilizzare l'operatore punto (.) per le proprietà dell'oggetto tipo in WMI. Ad esempio, la seguente query è valida se Prop è una struttura valida di MyClass ed è tipo di oggetto:

SELECT * FROM WHERE MyClass Prop.embedprop = 5

Vuol dire questo funziona solo se Prop dichiarato come OBJECT?

Ecco i dettagli di eccezione:

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

guarda a destra. Devi catturare l'eccezione e incollare il contenuto in una [modifica]. Chiama ToString sull'oggetto o utilizza la finestra di dialogo delle eccezioni (fai clic sul link "incolla contenuto negli appunti" in basso). – Will

+1

Ho aggiunto l'eccezione ma sembra che non abbia molti dettagli ... –

+0

Ho modificato la mia risposta con un codice di esempio che si spera possa essere d'aiuto. – Tomer

risposta

1

Sì. In base allo Win32_DiskQuota class documentation, la proprietà QuotaVolume è un riferimento a una classe WMI Win32_LogicalDisk. La citazione da MSDN fornita ha fornito il motivo per cui la query non è valida in base alle specifiche WQL.

Invece, si può usare qualcosa di simile:

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

(preavviso tutte le fuga ...)

+0

Questo ha funzionato per me, grazie! –