WMI .NET Invalid query

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

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

Однако это работает: «ВЫБРАТЬ * ИЗ Win32_DiskQuota».

Согласно MSDN:

Для большинства случаев использования дескрипторов классов в предложении WHERE WMI помечает запрос как недопустимый и возвращает ошибку. Однако используйте оператор точки (.) Для свойств типа объекта в WMI. Например, следующий запрос действителен, если Prop является допустимым свойством MyClass и является объектом типа:

ВЫБЕРИТЕ * ИЗ MyClass, ГДЕ Prop.embedprop = 5

Означает ли это, что это работает, только если Prop объявлен как OBJECT?

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

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: 

person Vladimir M.    schedule 06.07.2016    source источник
comment
Выглядит правильно. Вам нужно перехватить исключение и вставить содержимое в правку. Вызовите ToString для объекта или используйте диалоговое окно исключения (щелкните ссылку «Вставить содержимое в буфер обмена» внизу).   -  person    schedule 06.07.2016
comment
Я добавил исключение, но подробностей в нем не так много ...   -  person Vladimir M.    schedule 06.07.2016
comment
Я отредактировал свой ответ образцом кода, который, надеюсь, поможет.   -  person Tomer    schedule 06.07.2016


Ответы (1)


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

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

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

(Обратите внимание на все побег ...)

person Tomer    schedule 06.07.2016