2016-07-06 2 views
5

Je continue à obtenir une "requête non valide" exception lorsque vous essayez d'exécuter la requête suivante:WMI .NET requête non valide

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

Cependant cela fonctionne: "SELECT * FROM Win32_DiskQuota".

Selon MSDN:

Pour la plupart des utilisations des descripteurs de classe dans une clause WHERE, drapeaux WMI la requête comme non valide et renvoie une erreur. Cependant, utilisez l'opérateur point (.) pour les propriétés de l'objet type dans WMI. Par exemple, la requête suivante est valide si Prop est une propriété valide de MyClass et est objet de type:

SELECT * FROM MyClass OÙ Prop.embedprop = 5

Est-ce que cela signifie cela ne fonctionne que si Prop déclaré comme OBJET?

Voici les détails d'exception:

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

Attend droit. Vous devez attraper l'exception et coller le contenu dans un [edit]. Appelez ToString sur l'objet ou utilisez la boîte de dialogue d'exception (cliquez sur le lien "coller le contenu dans le presse-papiers" en bas). – Will

+1

J'ai ajouté l'exception, mais il semble qu'il n'a pas beaucoup de détails ... –

+0

J'ai édité ma réponse avec un exemple de code qui, nous l'espérons, aidera. – Tomer

Répondre

1

Oui. Selon le Win32_DiskQuota class documentation, la propriété QuotaVolume est une référence à une classe WMI Win32_LogicalDisk. La citation de MSDN que vous avez fournie a donné la raison pour laquelle la requête n'est pas valide selon les spécifications WQL.

Au lieu de cela, vous pouvez utiliser quelque chose comme ceci:

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

(Notez tous les Escaping ...)

+0

Cela a fonctionné pour moi, merci! –