2016-06-10 11 views
0

Я пытаюсь подписаться на событие конкретного файла модифицируется с помощью WQL с этим запросом:Как подписаться на Windows File Модификации события

SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA "CIM_DataFile" AND TargetInstance.Drive="C:" AND TargetInstace.Path="\\test\\filewatching\\"

я могу зарегистрировать событие успешно (см выхода внизу) и может видеть, что он связан со сценарием, который я зарегистрировал у (потребителя).

Однако, когда я изменяю файл в C:\test\filewatching\, сценарий не запускается.


Вот код для регистрации на событие создания файла в той же папке, и это работает:

#WQL 

$query = @" 
SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Cim_DirectoryContainsFile" AND TargetInstance.GroupComponent="Win32_Directory.Name='C:\\test\\filewatching'" 
"@ 
$instanceFilter = ([WMICLASS]"\\$Computername\root\subscription:__EventFilter").CreateInstance() 
$instanceFilter.QueryLanguage = 'WQL' 
$instanceFilter.Query = $query 
$instanceFilter.Name = 'EventFilterNameHere' 
$instanceFilter.EventNameSpace = 'root/CIMV2' 
$result = $instanceFilter.Put() 

# Consumer 

$script = 
@" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("c:\test\filewatching\Log.log", 8, True) 
objFile.WriteLine "New File Created" 
objFile.Close 
"@ 
$instanceConsumer = ([wmiclass]"\\$Computername\root\subscription:ActiveScriptEventConsumer").CreateInstance() 
$instanceConsumer.Name = 'ConsumerNameHere' 
$instanceConsumer.ScriptingEngine = 'VBScript' 
$instanceConsumer.ScriptFilename = '' 
$instanceConsumer.ScriptText = $script 
$instanceConsumer.Put() 

# Binding 

[object]$Filter = (Get-WMIObject -Computername $Computername -Namespace root\Subscription -Class __EventFilter | Sort Name) 
[object]$Consumer = (Get-WMIObject -Computername $Computername -Namespace root\Subscription -Class __EventConsumer | Sort Name) 

$instanceBinding = ([wmiclass]"\\$Computername\root\subscription:__FilterToConsumerBinding").CreateInstance() 
$instanceBinding.Filter = $Filter 
$instanceBinding.Consumer = $Consumer 
$instanceBinding.Put() 

Так что я знаю, что нет ничего плохого с моей PowerShell. Это заставляет меня думать, что мой запрос должен быть неправильным.

Я пробовал несколько настроек вышеуказанного InstanceModificationEvent запроса, но безуспешно. (эти настройки включают в себя такие вещи, как изменение C: до C или удаление \ s с TargetInstace.Path).


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


Выход после выполнения сценария:

Path   : \\WIN7-IT3\root\subscription:ActiveScriptEventConsumer.Name="Co 
       nsumerNameHere" 
RelativePath : ActiveScriptEventConsumer.Name="ConsumerNameHere" 
Server  : WIN7-IT3 
NamespacePath : root\subscription 
ClassName  : ActiveScriptEventConsumer 
IsClass  : False 
IsInstance : True 
IsSingleton : False 

Path   : \\WIN7-IT3\root\subscription:__FilterToConsumerBinding.Consumer 
       ="\\\\WIN7-IT3\\ROOT\\Subscription:ActiveScriptEventConsumer.Na 
       me=\"ConsumerNameHere\"",Filter="\\\\WIN7-IT3\\ROOT\\Subscripti 
       on:__EventFilter.Name=\"EventFilterNameHere\"" 
RelativePath : __FilterToConsumerBinding.Consumer="\\\\WIN7-IT3\\ROOT\\Subscri 
       ption:ActiveScriptEventConsumer.Name=\"ConsumerNameHere\"",Filt 
       er="\\\\WIN7-IT3\\ROOT\\Subscription:__EventFilter.Name=\"Event 
       FilterNameHere\"" 
Server  : WIN7-IT3 
NamespacePath : root\subscription 
ClassName  : __FilterToConsumerBinding 
IsClass  : False 
IsInstance : True 
IsSingleton : False 

Запросы WMI подписки:

Get-WmiObject -Namespace root\Subscription -Class __Eventfilter 
Get-WMIObject -Namespace root\Subscription -Class __EventConsumer 
Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding 
Get-WMIObject -Namespace root\Subscription -Class ActiveScriptEventConsumer 

Выход после запроса:

__GENUS   : 2 
__CLASS   : __EventFilter 
__SUPERCLASS  : __IndicationRelated 
__DYNASTY  : __SystemClass 
__RELPATH  : __EventFilter.Name="EventFilterNameHere" 
__PROPERTY_COUNT : 6 
__DERIVATION  : {__IndicationRelated, __SystemClass} 
__SERVER   : WIN7-IT3 
__NAMESPACE  : ROOT\Subscription 
__PATH   : \\WIN7-IT3\ROOT\Subscription:__EventFilter.Name="EventFilterNameHere" 
CreatorSID  : {1, 5, 0, 0...} 
EventAccess  : 
EventNamespace : root/CIMV2 
Name    : EventFilterNameHere 
Query   : SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 
        "CIM_DataFile" AND TargetInstance.Drive="C:" AND 
        TargetInstace.Path="\\test\\filewatching\\" 
QueryLanguage : WQL 
PSComputerName : WIN7-IT3 

__GENUS   : 2 
__CLASS   : ActiveScriptEventConsumer 
__SUPERCLASS  : __EventConsumer 
__DYNASTY  : __SystemClass 
__RELPATH  : ActiveScriptEventConsumer.Name="ConsumerNameHere" 
__PROPERTY_COUNT : 8 
__DERIVATION  : {__EventConsumer, __IndicationRelated, __SystemClass} 
__SERVER   : WIN7-IT3 
__NAMESPACE  : ROOT\Subscription 
__PATH   : \\WIN7-IT3\ROOT\Subscription:ActiveScriptEventConsumer.Name="ConsumerNameHere" 
CreatorSID  : {1, 5, 0, 0...} 
KillTimeout  : 0 
MachineName  : 
MaximumQueueSize : 
Name    : ConsumerNameHere 
ScriptFilename : 
ScriptingEngine : VBScript 
ScriptText  : Set objFSO = CreateObject("Scripting.FileSystemObject") 
        Set objFile = objFSO.OpenTextFile("c:\test\filewatching\Log.log", 8, True) 
        objFile.WriteLine "New File Created" 
        objFile.Close 
PSComputerName : WIN7-IT3 

__GENUS     : 2 
__CLASS     : __FilterToConsumerBinding 
__SUPERCLASS   : __IndicationRelated 
__DYNASTY    : __SystemClass 
__RELPATH    : __FilterToConsumerBinding.Consumer="\\\\WIN7-IT3\\ROOT\\Subscription:ActiveS 
          criptEventConsumer.Name=\"ConsumerNameHere\"",Filter="\\\\WIN7-IT3\\ROOT\\Su 
          bscription:__EventFilter.Name=\"EventFilterNameHere\"" 
__PROPERTY_COUNT  : 7 
__DERIVATION   : {__IndicationRelated, __SystemClass} 
__SERVER    : WIN7-IT3 
__NAMESPACE    : ROOT\Subscription 
__PATH     : \\WIN7-IT3\ROOT\Subscription:__FilterToConsumerBinding.Consumer="\\\\WIN7-IT 
          3\\ROOT\\Subscription:ActiveScriptEventConsumer.Name=\"ConsumerNameHere\"",F 
          ilter="\\\\WIN7-IT3\\ROOT\\Subscription:__EventFilter.Name=\"EventFilterName 
          Here\"" 
Consumer    : \\WIN7-IT3\ROOT\Subscription:ActiveScriptEventConsumer.Name="ConsumerNameHer 
          e" 
CreatorSID    : {1, 5, 0, 0...} 
DeliverSynchronously : False 
DeliveryQoS    : 
Filter     : \\WIN7-IT3\ROOT\Subscription:__EventFilter.Name="EventFilterNameHere" 
MaintainSecurityContext : False 
SlowDownProviders  : False 
PSComputerName   : WIN7-IT3 

__GENUS   : 2 
__CLASS   : ActiveScriptEventConsumer 
__SUPERCLASS  : __EventConsumer 
__DYNASTY  : __SystemClass 
__RELPATH  : ActiveScriptEventConsumer.Name="ConsumerNameHere" 
__PROPERTY_COUNT : 8 
__DERIVATION  : {__EventConsumer, __IndicationRelated, __SystemClass} 
__SERVER   : WIN7-IT3 
__NAMESPACE  : ROOT\Subscription 
__PATH   : \\WIN7-IT3\ROOT\Subscription:ActiveScriptEventConsumer.Name="ConsumerNameHere" 
CreatorSID  : {1, 5, 0, 0...} 
KillTimeout  : 0 
MachineName  : 
MaximumQueueSize : 
Name    : ConsumerNameHere 
ScriptFilename : 
ScriptingEngine : VBScript 
ScriptText  : Set objFSO = CreateObject("Scripting.FileSystemObject") 
        Set objFile = objFSO.OpenTextFile("c:\test\filewatching\Log.log", 8, True) 
        objFile.WriteLine "New File Created" 
        objFile.Close 
PSComputerName : WIN7-IT3 

ответ

1

наткнулся this page вскоре после публикации этого вопроса, от которого я работал, что запрос мне нужно:

Обратите внимание, что в отличие от ряда других сообщений в Интернете, что работало для меня было на самом деле опустить Path и Drive частями TargetInstance и включил в него полный путь и имя файла, который я хочу посмотреть.

Это работает для меня, потому что я буду наблюдать только 1 конкретный файл. Если вам нужно посмотреть несколько файлов с помощью этого метода, вам нужно будет зарегистрировать несколько подписчиков.

Полный код для регистрации изменения файла Бодрствующего:

#WQL 

$query = @" 
SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'CIM_DataFile' AND TargetInstance.Name='c:\\test\\filewatching\\tester.txt' 
"@ 
$instanceFilter = ([WMICLASS]"\\$Computername\root\subscription:__EventFilter").CreateInstance() 
$instanceFilter.QueryLanguage = 'WQL' 
$instanceFilter.Query = $query 
$instanceFilter.Name = 'EventFilterNameHere' 
$instanceFilter.EventNameSpace = 'root/CIMV2' 
$result = $instanceFilter.Put() 

# Consumer 

$script = 
@" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("c:\test\filewatching\Log.log", 8, True) 
objFile.WriteLine "New File Created" 
objFile.Close 
"@ 
$instanceConsumer = ([wmiclass]"\\$Computername\root\subscription:ActiveScriptEventConsumer").CreateInstance() 
$instanceConsumer.Name = 'ConsumerNameHere' 
$instanceConsumer.ScriptingEngine = 'VBScript' 
$instanceConsumer.ScriptFilename = '' 
$instanceConsumer.ScriptText = $script 
$instanceConsumer.Put() 

# Binding 

[object]$Filter = (Get-WMIObject -Computername $Computername -Namespace root\Subscription -Class __EventFilter | Sort Name) 
[object]$Consumer = (Get-WMIObject -Computername $Computername -Namespace root\Subscription -Class __EventConsumer | Sort Name) 

$instanceBinding = ([wmiclass]"\\$Computername\root\subscription:__FilterToConsumerBinding").CreateInstance() 
$instanceBinding.Filter = $Filter 
$instanceBinding.Consumer = $Consumer 
$instanceBinding.Put() 
0

вам нужно прикрепить путь потребителя и фильтра к связующему вместо каждого фильтра \ потребителя в системе

$result = $instanceFilter.Put() 
$filterPath = $result.Path 
$result = $instanceConsumer.Put() 
$consumerPath = $result.Path 

$bind.Filter = $filterPath 
$bind.Consumer = $consumerPath