2016-06-10 5 views
0

Je suis en train de souscrire à l'événement d'un fichier spécifique étant modifié à l'aide WQL avec cette requête:Comment abonner à la modification fichier événements Windows

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

Je peux enregistrer l'événement avec succès (voir la sortie en bas) et peut voir qu'il est lié avec le script que j'ai enregistré avec (le consommateur).

Toutefois, lorsque je modifie un fichier dans C:\test\filewatching\ le script ne s'exécute pas.


Voici le code d'enregistrement pour un événement de création du fichier dans le même dossier, et cela fonctionne:

#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() 

donc je sais qu'il n'y a rien de mal avec mon PowerShell. Cela me fait penser que ma requête doit être fausse.

J'ai essayé quelques réglages de la requête InstanceModificationEvent ci-dessus, mais sans succès. (ces réglages comprennent des choses comme changer C: à C ou en supprimant \ depuis le TargetInstace.Path).


J'ai besoin cet abonnement pour être permanent et il ne peut pas réinitialiser si le PC est allumé ou éteint - c'est pourquoi je me sers WQL. Si quelqu'un peut suggérer une autre façon de réaliser la même chose ou comment je peux résoudre ma requête, je serai éternellement reconnaissant!


sortie après l'exécution du script:

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 

Interrogation abonnements 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 

Sortie: après l'interrogation

__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 

Répondre

1

Nous sommes tombés sur this page bientôt après la publication de cette question, à partir de laquelle je travaillais que la requête dont j'ai besoin est:

Notez que contrairement à plusieurs autres postes en ligne, ce qui a fonctionné pour moi était en fait pour omettre le Path et Drive parties de TargetInstance et seulement inclus le chemin complet et le nom du fichier que je veux regarder.

Cela fonctionne pour moi parce que je ne regarderai qu'un fichier spécifique. Si vous devez regarder plusieurs fichiers en utilisant cette méthode, vous devrez enregistrer plusieurs abonnements.

Le code complet pour l'enregistrement d'un veilleur de modification du fichier:

#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

vous devez attacher le chemin du consommateur et le filtre au liant au lieu de chaque filtre \ consommateur dans le système

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

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