2016-07-06 13 views
5

Я постоянно получаю «Неверный запрос» исключение при попытке выполнить следующий запрос:WMI .NET Неверный запрос

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

Однако это работает: «SELECT * FROM Win32_DiskQuota».

Согласно MSDN:

Для большинства применений класса дескрипторов в ИНЕКЕ, флаги WMI запрос недействительным и возвращает ошибку. Однако используйте оператор dot (.) для свойств объекта типа в WMI. Например, следующий запрос является действительным, если Prop является допустимым свойством MyClass и Тип объекта:

SELECT * FROM MyClass WHERE Prop.embedprop = 5

Означает ли это работает, только если Проп объявлен ОБЪЕКТОМ?

Вот подробности исключения:

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

кажется правильным. Вам нужно поймать исключение и вставить содержимое в [edit]. Вызовите ToString на объекте или используйте диалог исключения (нажмите ссылку «Вставить содержимое в буфер обмена» внизу). – Will

+1

Я добавил исключение, но, похоже, у него мало деталей ... –

+0

Я отредактировал свой ответ с образцом кода, который, надеюсь, поможет. – Tomer

ответ

1

Да. Согласно Win32_DiskQuota class documentation, свойство QuotaVolume является ссылкой на класс WMI Win32_LogicalDisk. Приведенная вами цитата из MSDN привела к тому, что запрос недействителен в соответствии с спецификациями WQL.

Вместо этого, вы можете использовать что-то вроде этого:

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

(Обратите внимание, все вытекание ...)

+0

Это сработало для меня, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^