如何调试/注册在文件创建时运行脚本的永久WMI事件

时间:2016-04-25 10:45:56

标签: .net powershell windows-7 wmi

我正在尝试在我的机器上注册永久WMI事件,如果在文件夹C:\test中创建了文件,则应运行脚本。

我已成功设法注册类似事件,其中操作是将一行记录到文件中,但出于某种原因,在尝试执行脚本时,我得不到任何响应。

以下是我正在使用的查询:

$query=@"
Select * from __InstanceCreationEvent within 10
where targetInstance isa 'Cim_DirectoryContainsFile'
and targetInstance.GroupComponent='Win32_Directory.Name="C:\\\\test"'
"@

我尝试以几种不同的方式注册活动但没有成功,并希望有人能帮我理解我哪里出错了。

以下面的脚本为例:

$computer = $env:COMPUTERNAME
$filterNS = "root\cimv2"
$wmiNS = "root\subscription"
$query = @"
Select * from __InstanceCreationEvent within 1
where targetInstance isa 'Cim_DirectoryContainsFile' 
and targetInstance.GroupComponent = 'Win32_Directory.Name="c:\\\\test"'
"@
$filterName = "NewFileFilter"
$scriptFileName = "C:\test\test.vbs"

$filterPath = Set-WmiInstance -Class __EventFilter `
    -ComputerName $computer -Namespace $wmiNS -Arguments `
    @{name=$filterName; EventNameSpace=$filterNS; QueryLanguage="WQL";
    Query=$query}

$consumerPath = Set-WmiInstance -Class ActiveScriptEventConsumer `
    -ComputerName $computer -Namespace $wmiNS `
    -Arguments @{name="MyConsumer"; ScriptFileName=$scriptFileName;
    ScriptingEngine="VBScript"}

Set-WmiInstance -Class __FilterToConsumerBinding -ComputerName $computer `
    -Namespace $wmiNS -arguments @{Filter=$filterPath; Consumer=$consumerPath} |
    out-null

其中test.vbs是一行代码:MsgBox("Hello!")

运行之后,我可以拨打以下电话:

Get-WmiObject -Namespace root\Subscription -Class __Eventfilter

Get-WMIObject -Namespace root\Subscription -Class __EventConsumer

Get-WMIObject -Namespace root\Subscription -Class __FilterToConsumerBinding

并获得以下输出,这表明事件确实已经注册:

__GENUS          : 2
__CLASS          : __EventFilter
__SUPERCLASS     : __IndicationRelated
__DYNASTY        : __SystemClass
__RELPATH        : __EventFilter.Name="NewFileFilter"
__PROPERTY_COUNT : 6
__DERIVATION     : {__IndicationRelated, __SystemClass}
__SERVER         : WIN7-IT3
__NAMESPACE      : ROOT\Subscription
__PATH           : \\WIN7-IT3\ROOT\Subscription:__EventFilter.Name="NewFileFilter"
CreatorSID       : {1, 5, 0, 0...}
EventAccess      : 
EventNamespace   : root\cimv2
Name             : NewFileFilter
Query            : Select * from __InstanceCreationEvent within 1
                   where targetInstance isa 'Cim_DirectoryContainsFile' 
                   and targetInstance.GroupComponent = 
                   'Win32_Directory.Name="c:\\\\test"'
QueryLanguage    : WQL
PSComputerName   : WIN7-IT3

__GENUS          : 2
__CLASS          : ActiveScriptEventConsumer
__SUPERCLASS     : __EventConsumer
__DYNASTY        : __SystemClass
__RELPATH        : ActiveScriptEventConsumer.Name="MyConsumer"
__PROPERTY_COUNT : 8
__DERIVATION     : {__EventConsumer, __IndicationRelated, __SystemClass}
__SERVER         : WIN7-IT3
__NAMESPACE      : ROOT\Subscription
__PATH           : \\WIN7-IT3\ROOT\Subscription:ActiveScriptEventConsumer.Name="MyCon
                   sumer"
CreatorSID       : {1, 5, 0, 0...}
KillTimeout      : 0
MachineName      : 
MaximumQueueSize : 
Name             : MyConsumer
ScriptFilename   : C:\test\test.vbs
ScriptingEngine  : VBScript
ScriptText       : 
PSComputerName   : WIN7-IT3

__GENUS                 : 2
__CLASS                 : __FilterToConsumerBinding
__SUPERCLASS            : __IndicationRelated
__DYNASTY               : __SystemClass
__RELPATH               : __FilterToConsumerBinding.Consumer="ActiveScriptEventConsum
                          er.Name=\"MyConsumer\"",Filter="__EventFilter.Name=\"NewFil
                          eFilter\""
__PROPERTY_COUNT        : 7
__DERIVATION            : {__IndicationRelated, __SystemClass}
__SERVER                : WIN7-IT3
__NAMESPACE             : ROOT\Subscription
__PATH                  : \\WIN7-IT3\ROOT\Subscription:__FilterToConsumerBinding.Cons
                          umer="ActiveScriptEventConsumer.Name=\"MyConsumer\"",Filter
                          ="__EventFilter.Name=\"NewFileFilter\""
Consumer                : ActiveScriptEventConsumer.Name="MyConsumer"
CreatorSID              : {1, 5, 0, 0...}
DeliverSynchronously    : False
DeliveryQoS             : 
Filter                  : __EventFilter.Name="NewFileFilter"
MaintainSecurityContext : False
SlowDownProviders       : False
PSComputerName          : WIN7-IT3

但是,当我在C:\test中创建文件时,没有任何反应。对此最令人沮丧的是,我可以创建一个使用LogFileEventConsumer的类似事件,这样可以完美地工作(当新文件添加到C:\test时,会将一行记录到指定的文件中)。

有谁知道这里发生了什么,或者我如何有效地调试这个?我还没有找到任何办法让绑定以某种方式输出错误或记录任何有关正在发生的事情的细节,并且无法弄清楚CIM WMI Studio的意图(它似乎没有为我工作)。

非常感谢任何帮助,请告诉我是否可以发布任何其他详细信息,例如我尝试的任何其他代码或任何日志 - 谢谢。

1 个答案:

答案 0 :(得分:1)

我能够使用以下脚本实现此目的:

$query = @"
SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA "Cim_DirectoryContainsFile" AND TargetInstance.GroupComponent="Win32_Directory.Name='C:\\test'"
"@

#Set up hash table for splatting
$wmiParams = @{
    Computername = $env:COMPUTERNAME
    ErrorAction = 'Stop'
    NameSpace = 'root\subscription'
}

# Filter
#Creating a new event filter
$wmiParams.Class = '__EventFilter'
$wmiParams.Arguments = @{
    Name = 'WatchFiles'
    EventNamespace = 'root\CIMV2'
    QueryLanguage = 'WQL'
    Query = $query 
}
$filterResult = Set-WmiInstance @wmiParams

# Consumer
$wmiParams.Class = 'ActiveScriptEventConsumer'
$wmiParams.Arguments = @{
    KillTimeout = 0
    MachineName = $env:COMPUTERNAME
    ScriptingEngine = 'VBScript'
    ScriptText = 
@"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\test\Log.log", 8, True)
objFile.WriteLine "hellohellohellohellohellohello"
objFile.Close
"@
    ScriptFileName = $null
    Name = 'ActiveScriptEventConsumer'
}
$consumerResult = Set-WmiInstance @wmiParams

# Binding
$wmiParams.Class = '__FilterToConsumerBinding'
$wmiParams.Arguments = @{
    Filter = $filterResult
    Consumer = $consumerResult
}
$bindingResult = Set-WmiInstance @wmiParams

请注意我格式化$query过滤器的方式,并且由于\Here-String我使用的@""@,唯一需要转义的字符是MsgBox()

here要注意的其他一些事项:

  

在创建要与ActiveScriptEventCosumer一起使用的VBScript或JScript脚本时,您需要了解一些限制:

     

•ActiveScriptEventConsumer不使用Windows脚本宿主(WSH),它在系统管理脚本中广泛使用。这意味着您无法使用WScript对象或其任何属性和方法(如WScript.CreateObject,WScript.Sleep等)。

     

•脚本无法生成任何屏幕输出,这意味着您无法使用VBScript MsgBox功能。

     

•脚本没有网络访问权限。

     

•脚本无法使用任何特定于用户的数据,例如环境变量或网络共享。

这可以解释上面的失败,因为我所指的脚本包含一个 web_submit_data("AddAttachment.aspx", "Action=https://learningshared.com/AddAttachment.aspx", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Snapshot=t7.inf", "Mode=HTML", ITEMDATA, "Name=__VIEWSTATE", "Value={ViewState_Value_1}", ENDITEM, "Name=__EVENTVALIDATION", "Value={EVENTVALIDATION_1}", ENDITEM, "Name=FileUpload1", "Value=C:\\Temp\\my_uploaded_file.pdf", "File=yes", ENDITEM, "Name=Button1", "Value=Upload", ENDITEM, LAST); ,它不能在这些马戏团中运行。

相关问题