Почему оператор WQL LIKE не работает на диске c, но отлично работает на диске d?

Я изучаю мониторинг файловой системы, чтобы ускорить третье и четвертое резервное копирование моего почтового сервера. У меня есть хороший сценарий VB, который безупречно работает на диске D, но когда я запрашиваю изменения на диске C, ничего не возвращается, если я использую подстановочный знак.

Вот мои запросы:

This works fine for c:\sc, but does not return subfolder changes:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path = '\\sc\\'))

This works fine for d:\sc, and does return subfolder changes:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='d:' And TargetInstance.Path LIKE '\\sc\\%'))

This one returns no changes at all. No error messages are returned, and the script continues to run:

     Select * From __InstanceOperationEvent Within 10 Where TargetInstance Isa 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path LIKE '\\sc\\%'))

Двойные скобки нужны для того, чтобы я мог добавлять похожие запросы, связанные с «ИЛИ».

Мой системный диск — это диск C.
Диск D — это съемный USB-накопитель.

Изменил ли я какие-то настройки на системном диске, которые мешают этому работать?
Или, возможно, запрос возвращает слишком много результатов?

Я искал об этом в течение нескольких часов. Любое понимание будет высоко оценено.


person alfadog67    schedule 23.10.2012    source источник


Ответы (1)


Это связано с тем, что при использовании оператора LIKE в предложении WQL с тегом CIM_DataFile, WMI сканирует весь диск, чтобы найти совпадение, теперь, поскольку ваш USB-накопитель имеет более маленькую (и простую) древовидную структуру папок, WMI может возвращать результаты больше быстро. но когда вы используете диск C, WMI по-прежнему выполняет запрос, пока не найдет все совпадения. Поэтому рекомендуется не использовать оператор LIKE с CIM_DataFile, вместо этого просто используйте оператор = следующим образом:

Select * From __InstanceOperationEvent Within 1 Where TargetInstance ISA 'CIM_DataFile' And ((TargetInstance.Drive='c:' And TargetInstance.Path = '\\sc\\'))

PD: Если вы используете оператор LIKE, потому что ожидаете отслеживать изменения в нескольких папках, это невозможно, вместо этого вы должны использовать один WQL и наблюдатель событий для каждой папки.

person RRUZ    schedule 24.10.2012
comment
Хорошо, звучит осуществимо, но поправьте меня, если я ошибаюсь - запрашивается не диск, а журнал событий. Второй пример, который я привел выше, безупречно работает для папок и подпапок на диске D:, на котором, кстати, есть резервные копии 4 разных серверов, что делает его ни маленьким, ни простым, поэтому, по-видимому, можно использовать LIKE для получения изменений в подпапках, правильно? Каждое создание, удаление и изменение файла регистрируется в журнале событий, поэтому как мне запросить в журнале событий те события, которые происходят в папке и ее подпапках на диске c:? - person alfadog67; 24.10.2012
comment
Диск C — типичная установка Windows, диск D — 3 типичные установки Windows и одна Linux. - person alfadog67; 25.10.2012
comment
То, что вы указываете, не имеет для меня смысла, у меня большой опыт использования WMI, и поведение, которое вы описываете, не соответствует моему личному опыту по этой теме. В любом случае, почему вы используете оператор LIKE? - person RRUZ; 25.10.2012
comment
Мой второй пример выше возвращает события для всех файлов в папке и всех подпапках для диска D. Пожалуйста, попробуйте его на дополнительном диске, и, возможно, вы придете к тому же выводу, что и я - в некоторых случаях это работает. Я запустил запрос из третьего примера выше в тестере WMI, и, что интересно, запрос запустился, а графический интерфейс так и не вернулся. Таким образом, запрос выполняется, но не завершается, не истекает время ожидания и не вызывает ошибки, такой как ограничение квоты или что-то еще. - person alfadog67; 25.10.2012
comment
Не уверен, почему это происходит на C, а не на D, но это кажется нежизнеспособным решением для мониторинга диска C. Я мог бы сопоставить все папки и подписаться на их события, но есть примерно 8000 папок для просмотра, и это кажется излишний. - person alfadog67; 25.10.2012
comment
Я только что обнаружил ошибку, которую я сделал. Диск D, хотя и содержит информацию о 4 компьютерах, не имеет всего дерева каталогов, доступного для ОС, поэтому он имеет файловую систему, содержащую 36 файлов в 3 папках. Когда я делаю остальную часть дерева доступной, она терпит неудачу так же, как и на C. Итак, если бы я дождался сканирования всего дерева (как это произойдет в вашем ответе), он, вероятно, начал бы возвращать результаты. Мне любопытно узнать, сколько времени это займет, но, по моим меркам, больше нескольких секунд — это слишком долго. - person alfadog67; 25.10.2012