2016-07-06 14 views
5

tôi tiếp tục nhận được một "Truy vấn không hợp lệ" ngoại lệ khi cố gắng thực hiện các truy vấn sau đây:truy vấn WMI NET không hợp lệ

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

Tuy nhiên công trình này: "SELECT * FROM Win32_DiskQuota".

Theo MSDN:

Đối với hầu hết cách dùng mô tả lớp trong một mệnh đề WHERE, WMI cờ truy vấn là không hợp lệ và trả về một lỗi. Tuy nhiên, sử dụng dấu chấm (.) toán tử cho thuộc tính của đối tượng kiểu trong WMI. Ví dụ, truy vấn sau đây là hợp lệ nếu Prop là một tài sản có giá trị của MyClass và là loại đối tượng:

SELECT * FROM MyClass ĐÂU Prop.embedprop = 5

Liệu nó có nghĩa này chỉ hoạt động nếu Dự án được tuyên bố là OBJECT?

Dưới đây là các chi tiết ngoại lệ:

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

Trông đúng. Bạn cần phải nắm bắt ngoại lệ và dán nội dung vào [chỉnh sửa]. Gọi ToString trên đối tượng hoặc sử dụng hộp thoại ngoại lệ (nhấp vào liên kết "dán nội dung vào khay nhớ tạm" ở dưới cùng). – Will

+1

Tôi đã thêm ngoại lệ nhưng có vẻ như nó không có nhiều chi tiết ... –

+0

Tôi đã chỉnh sửa câu trả lời của mình bằng mã mẫu mà hy vọng sẽ hữu ích. – Tomer

Trả lời

1

Yes. Theo số Win32_DiskQuota class documentation, thuộc tính QuotaVolume là tham chiếu đến lớp WMI Win32_LogicalDisk. Báo giá từ MSDN bạn cung cấp đã đưa ra lý do tại sao truy vấn không hợp lệ theo thông số WQL.

Thay vào đó, bạn có thể sử dụng một cái gì đó như thế này:

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

(Chú ý tất cả các thoát ...)

+0

Điều này làm việc cho tôi, cảm ơn bạn! –

Các vấn đề liên quan