<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: Слежение за изменениями файлов в директории?]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=563</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=563&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: Слежение за изменениями файлов в директории?».]]></description>
		<lastBuildDate>Mon, 04 Aug 2008 09:47:07 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=13014#p13014</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p><strong>2The gray Cardinal</strong>: опробовать сие сможете?</p></blockquote></div><p>У меня PowerShell не установлен, к сожалению.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 04 Aug 2008 09:47:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=13014#p13014</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=13013#p13013</link>
			<description><![CDATA[<div class="quotebox"><cite>The gray Cardinal пишет:</cite><blockquote><p>Любопытно, но как-то страшно делать сотни подписок на события...</p></blockquote></div><p>Угу <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Идея <em>[первая - alexii]</em> не выдержала испытания на прочность. На тех же вышеизложенных условиях, служба, реализующая WMI, отъедает 30-40% процессорного времени, сам WMI ещё 10%... Потом догадался обрубить антивирус и файерволл. Потом увеличил предикат WITHIN с 1 до 5, 10 — стало полегче. Однако уже ясно, что в реальных условиях, на серверах, где условия будут куда как серьёзнее, сей метод не годится. Позже попробую не вязать всё к одному SWbemSink&#039;у, а каждый CIM_DirectoryContainsFile попробую прилепить к отдельному SWbemSink, но, думаю, результат будет тот же.</p><p>P.S. Свеженькое. Для отдельно взятой папки на PS: <a href="http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=3683910&amp;SiteID=40">Мониторинг папки: подскажите как реализовать?</a>. Думаю, для нашего случая, результат будет тот же.</p><p><strong>2The gray Cardinal</strong>: опробовать сие сможете?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 04 Aug 2008 09:28:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=13013#p13013</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=12993#p12993</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Как идея?</p></blockquote></div><p>Любопытно, но как-то страшно делать сотни подписок на события...</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 01 Aug 2008 18:20:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=12993#p12993</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=12975#p12975</link>
			<description><![CDATA[<p>Согласно <a href="http://forum.script-coding.com/viewtopic.php?pid=5363#p5363">теме «VBScript: слежение за содержимым каталога»</a> из Коллекции; однако новую тему создавать не стал. Собственно, вот по чему:<br /></p><div class="quotebox"><blockquote><p>Примечание: отслеживание вложенных каталогов в данном случае проблематично, т.к. оператор LIKE со свойством Path в WMI-запросе, похоже, корректно не работает.</p></blockquote></div><p>Специально для проверки создал раздел. Скопировал ~4-уровневую структуру папок (~100), файлов ~3000. Сделал обработку на __InstanceOperationEvent для экземпляров класса CIM_DataFile ежесекундно <em>с использованием предиката Like</em> для свойства .Path. Работает нормально с небольшими задержками. Специальных замеров не проводил, но при увеличении количества папок/файлов задержки многократно возрастают; вплоть до того, что с некоторого момента&nbsp; работа скрипта, при использовании подобного механизма, становится бессмысленной из-за возросших задержек. Хотя и <em>продолжает работать</em>. Таким образом, использование предиката Like для обработки подпапок имеет достаточные ограничения.</p><p>Зимой, когда было больше времени, я писал скрипт, но, как обычно, не вылизал его до конца. Пожалуй, я вкратце опишу свою идею.</p><p>Подписываемся на события файлов в папке (через класс CIM_DirectoryContainsFile, а не CIM_DataFile) асинхронным (!) запросом, что-то вроде**:<br /></p><div class="codebox"><pre><code>objSWbemService.ExecNotificationQueryAsync objSWbemSink_CIM_DirectoryContainsFile, _
    &quot;SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE &quot; &amp;_
        &quot;TargetInstance ISA &#039;CIM_DirectoryContainsFile&#039; AND &quot; &amp;_
        &quot;TargetInstance.GroupComponent=&#039;Win32_Directory.Name=&quot;&quot;&quot; &amp; strFolder &amp; &quot;&quot;&quot;&#039;&quot;</code></pre></div><p>В принципе, можно создать и постоянный подписчик, но это нецелесообразно.</p><p>Затем, через обычный механизм рекурсии objFSO.GetFolder().SubFolders… обходим все вложенные папки и делаем для них <em>ту же</em> операцию (мы ведь можем к <em>одному</em> объекту objSWbemSink_ привязать несколько запросов). Собственно, и всё.</p><p>Почти всё. Если структура папок у нас неизменна. Однако, это, как правило, не так. Подпапки (внутри той папки, за которой мы следим) могут создаваться и удаляться. И за этим нужно также следить. То есть, нужно подписываться на события экземпляров класса Win32_Directory и следить. И поменять механизм подписки, описанный выше (уже нельзя привязывать к одному objSWbemSink_ несколько запросов, поскольку отменять их по отдельности невозможно, а только все сразу командой .Cancel). И при создании вложенной папки — добавлять подписку **, при удалении — отменять слежение за этой подпапкой.</p><p>На «…подписываться на события экземпляров класса Win32_Directory и следить» я и «заморозил» работу до зимы <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Как идея?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 01 Aug 2008 01:21:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=12975#p12975</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=5362#p5362</link>
			<description><![CDATA[<p>Кроме того, не совсем понятно, какой состав событий вообще обрабатывается __InstanceOperationEvent, т.е. что там вообще могут быть за события. Достаточно вызвать контекстное меню папки Проводника, не производя никаких действий, как возникает целый шквал непонятных событий.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 06 Oct 2007 11:29:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=5362#p5362</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=5361#p5361</link>
			<description><![CDATA[<p>Предыдущий вопрос снимается, решён г-ном Касперским <img src="//forum.script-coding.com/img/smilies/lol.png" width="15" height="15" />.<br />Вопрос такой: а эффективно ли вообще использовать класс __InstanceOperationEvent? Что-то я не нашел, как определить, <strong>что именно</strong> за событие произошло. В классе всего три дохлых свойства, которые мало что дают: <a href="http://msdn2.microsoft.com/en-us/library/aa394652.aspx">__InstanceOperationEvent</a>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 06 Oct 2007 10:48:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=5361#p5361</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=5356#p5356</link>
			<description><![CDATA[<p><strong>Alexbootch</strong><br />Скрипт выдаёт очень странную ошибку:<br /></p><div class="quotebox"><blockquote><p>C:\Temp\test.vbs(3, 1) SWbemServicesEx: Ошибка источника данных</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 05 Oct 2007 18:41:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=5356#p5356</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=5326#p5326</link>
			<description><![CDATA[<p>Пример синхронного отслеживания событий с файлами TXT в папке c:\temp<br /></p><div class="codebox"><pre><code>strComputer = &quot;.&quot;
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;c:&#039;&quot; &amp; _
    &quot; AND TargetInstance.Extension = &#039;txt&#039;&quot; &amp; _
    &quot; AND TargetInstance.Path = &#039;\\temp\\&#039;&quot;)

Wscript.Echo &quot;Ожидаем события ...&quot;
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent

    WScript.Echo &quot;Filename: &quot; &amp; objReceivedEvent.TargetInstance.FileName
    WScript.Echo &quot;Name: &quot; &amp; objReceivedEvent.TargetInstance.Name
Loop</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Alexbootch)]]></author>
			<pubDate>Thu, 04 Oct 2007 21:31:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=5326#p5326</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4509#p4509</link>
			<description><![CDATA[<p>Написал скрипт, который отслеживает создание файлов в папке C:/WINDOWS/system32/.</p><p>Скрипт запускает процесс wmiprvse.exe, который постоянно сканирует файлы в этой папке (проверил filemon-ом). Причем в цикле. Файлов там много. Какой вообще механизм? Он что, сохраняет первоначальный список файлов и периодически сравнивает его. <br />Кто-нибудь знает, как работает __InstanceCreationEvent?</p>]]></description>
			<author><![CDATA[null@example.com (rorog)]]></author>
			<pubDate>Fri, 07 Sep 2007 14:41:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4509#p4509</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4294#p4294</link>
			<description><![CDATA[<p>Странно, скрипт отробатывает, но с жуткой задержкой, по минут 5-7</p>]]></description>
			<author><![CDATA[null@example.com (Ganzales)]]></author>
			<pubDate>Tue, 28 Aug 2007 05:16:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4294#p4294</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4275#p4275</link>
			<description><![CDATA[<p>Чего-то всё равно не пашет. Последний скрипт я немного упростил (убрал отсылку письма, т.к. интересен собственно сам запрос WMI):<br /></p><div class="codebox"><pre><code>strDrive = &quot;C:&quot;
strDir = &quot;\\Temp\\&quot;
strComputer = &quot;.&quot;
&#039;===================================================================
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;&quot; &amp; strDrive &amp; &quot;&#039;&quot; &amp; _
    &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path Like &#039;&quot; &amp; strDir &amp; &quot;%&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
    strMess = objReceivedEvent.TargetInstance.FileName &amp; &quot;, &quot; &amp; objReceivedEvent.TargetInstance.Name &amp; vbCrLf
    WScript.Echo strMess
Loop</code></pre></div><p>Этот скрипт вообще ни на что не реагирует. Покрушил все файлы в C:\Temp\ - ноль эмоций, скрипт ничего не выводит <img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" />.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Mon, 27 Aug 2007 10:56:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4275#p4275</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4263#p4263</link>
			<description><![CDATA[<p>Конечно же, сильно извеняюсь выложил не тот скрипт)</p><div class="codebox"><pre><code>strDir = &quot;\\test\\&quot;
strComputer = &quot;.&quot;
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject(&quot;CDO.Message&quot;)
    Set iConf = CreateObject(&quot;CDO.Configuration&quot;)
    Set Flds = iConf.Fields
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/sendusing&quot;) = 2
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&quot;) = strSMTP_Server
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout&quot;) = 10
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.Send
End Function
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;d:&#039;&quot; &amp; _
    &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path Like &#039;&quot; &amp; strDir &amp; &quot;%&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
&#039;    If objReceivedEvent.TargetInstance.Extension=&quot;mp3&quot; then //Если нужно можно установить слежение за конкретный расширением.
&#039;        MsgBox &quot;Пользователь сохранил файл с расширением  &quot; &amp; objReceivedEvent.TargetInstance.Extension
&#039;    End if
    Body = &quot;File modifed: &quot; &amp; objReceivedEvent.TargetInstance.FileName &amp; &quot;  &quot; &amp; objReceivedEvent.TargetInstance.Name &amp; vbCrLf &amp; vbCrLf
    Call SendPost(&quot;SMTP&quot;, &quot;TO&quot;, &quot;FROM&quot;, &quot;File modifed&quot;, body)
Loop</code></pre></div><p>Вот этот следит)</p>]]></description>
			<author><![CDATA[null@example.com (Ganzales)]]></author>
			<pubDate>Mon, 27 Aug 2007 04:47:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4263#p4263</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4234#p4234</link>
			<description><![CDATA[<div class="quotebox"><cite>Ganzales пишет:</cite><blockquote><p>Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.</p></blockquote></div><p>На изменения в подкаталогах этот скрипт не реагирует.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 24 Aug 2007 14:55:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4234#p4234</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=4225#p4225</link>
			<description><![CDATA[<div class="codebox"><pre><code>strDir = &quot;\\share\Admins docs\\&quot;
strComputer = &quot;.&quot;
Dim Body
    Function SendPost(strSMTP_Server, strTo, strFrom, strSubject, strBody)
    Set iMsg = CreateObject(&quot;CDO.Message&quot;)
    Set iConf = CreateObject(&quot;CDO.Configuration&quot;)
    Set Flds = iConf.Fields
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/sendusing&quot;) = 2
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpserver&quot;) = strSMTP_Server
    Flds.Item(&quot;http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout&quot;) = 10
    Flds.Update
    iMsg.Configuration = iConf
    iMsg.To = strTo
    iMsg.From = strFrom
    iMsg.Subject = strSubject
    iMsg.TextBody = strBody
    iMsg.Send
End Function
Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp; strComputer &amp; &quot;\root\CIMv2&quot;) 
Set objEvents = objWMIService.ExecNotificationQuery _
(&quot;SELECT * FROM __InstanceOperationEvent WITHIN 5 WHERE &quot; &amp; _
    &quot;TargetInstance ISA &#039;CIM_DataFile&#039;&quot; &amp; _
    &quot; AND TargetInstance.Drive = &#039;e:&#039;&quot; &amp; _
            &quot; AND TargetInstance.FileSize &gt; 0&quot; &amp; _
    &quot; AND TargetInstance.Path = &#039;&quot; &amp; strDir &amp; &quot;&#039;&quot;)
Do While(True)
    Set objReceivedEvent = objEvents.NextEvent
&#039;    If objReceivedEvent.TargetInstance.Extension=&quot;mp3&quot; then //Если нужно можно установить слежение за конкретный расширением.
&#039;        MsgBox &quot;Пользователь сохранил файл с расширением  &quot; &amp; objReceivedEvent.TargetInstance.Extension
&#039;    End if
    Body = &quot;File modifed: &quot; &amp; objReceivedEvent.TargetInstance.FileName &amp; &quot;  &quot; &amp; objReceivedEvent.TargetInstance.Name
        Call SendPost(&quot;SMTP&quot;, &quot;TO&quot;, &quot;FROM&quot;, &quot;File modifed&quot;, body)
Loop</code></pre></div><p>Скрипт следит за созданием и внесением изменений в дерриктории, а также в сабдеррикториях, не реагирует на создание пустых документов, оповещает почтовой рассылкой.</p><p>Так же можно отслеживать по расширению.</p>]]></description>
			<author><![CDATA[null@example.com (Ganzales)]]></author>
			<pubDate>Fri, 24 Aug 2007 08:20:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=4225#p4225</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: Слежение за изменениями файлов в директории?]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=3733#p3733</link>
			<description><![CDATA[<p>Не, мне не нужно следить за удалением, мне важны сообщения только типа: создание, модификация.</p><p>Просто если использовать WMI то скрипт выходит гораздо гибче чем варриант с массивом, к примеру к этому я без проблем прикрутил запрет на создание файлов различных типов, дабавив всего пару строк.</p>]]></description>
			<author><![CDATA[null@example.com (Ganzales)]]></author>
			<pubDate>Fri, 27 Jul 2007 11:38:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=3733#p3733</guid>
		</item>
	</channel>
</rss>
