2016-07-06 11 views
5

Ciągle otrzymuję „Nieprawidłowy zapytanie” wyjątek podczas próby wykonać następujące zapytanie:WMI NET Nieprawidłowe zapytanie

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

Jednak to działa: „SELECT * FROM Win32_DiskQuota”.

Zgodnie z MSDN:

Dla większości zastosowań deskryptorów klasy w klauzuli WHERE, WMI flagi zapytanie jako nieważny i zwraca błąd. Jednak należy użyć operatora kropki (.) dla właściwości obiektu typu w WMI. Na przykład, następujące zapytanie jest ważny jeśli Prop jest ważna właściwość MojaKlasa i typ obiektu:

SELECT * FROM MojaKlasa GDZIE Prop.embedprop = 5

Czy to znaczy Zadziała tylko wtedy, Prop zadeklarowany jako OBJECT?

Oto szczegóły wyjątek:

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

Wygląda dobrze. Musisz wychwycić wyjątek i wkleić jego zawartość do [edytuj]. Wywołaj ToString na obiekcie lub użyj okna dialogowego wyjątku (kliknij link "wklej zawartość do schowka" na dole). – Will

+1

Dodałem wyjątek, ale wydaje mi się, że nie ma on zbyt wielu szczegółów ... –

+0

Edytowałem swoją odpowiedź za pomocą przykładowego kodu, który, mam nadzieję, pomoże. – Tomer

Odpowiedz

1

Tak. Zgodnie z Win32_DiskQuota class documentation właściwość QuotaVolume jest odwołaniem do klasy WMI klasy Win32_LogicalDisk. Cytat podany przez MSDN podał powód, dla którego zapytanie jest nieprawidłowe zgodnie ze specyfikacją WQL.

Zamiast tego można użyć czegoś takiego:

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

(uwaga Wszystkie cytowanie ...)

+0

To zadziałało dla mnie, dziękuję! –

Powiązane problemy