2014-11-24 37 views
0

我試圖創建一個永久WMI事件訂閱來在USB驅動器連接時運行腳本。永久性WMI事件消費者不會被觸發,臨時發生

這裏是我創建的過濾器,消費者和綁定:

$computer = "xxx" 
$filterNS = "root\cimv2" 
$wmiNS = "root\subscription" 
$query = "Select * from __InstanceCreationEvent within 5 where targetinstance isa 'win32_logicaldisk'" 

$filterName = "TestFilter" 

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

$consumerPath = Set-WmiInstance -Class CommandLineEventConsumer ` 
-ComputerName $computer -Namespace $wmiNS ` 
-Arguments @{ 
name="TestConsumer"; 
ExecutablePath= "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"; 
CommandLineTemplate = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -executionpolicy bypass -file D:\\reassignDriveletter.ps1" 
} 

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

一切變得無任何錯誤,我可以看到的過濾器,消費者和WMI事件查看器結合,但如果我附上USB驅動器沒有任何反應(腳本的第一行寫入日誌條目,這就是我所知道的)。

出於測試目的,我創建了一個正常的事件訂閱類似這樣的:

$job = Register-WmiEvent -Query "Select * from __InstanceCreationEvent within 5 where targetinstance isa 'win32_logicaldisk'" -SourceIdentifier usb -Timeout 1000 -Action $scriptblock 

這工作絕對沒問題。

我錯過了一些明顯的東西嗎?我會很感激任何幫助。

問候

更新:只是在非域加入測試的Win7電腦和相同的代碼工作正常。 (我的工作站是Win8.1域加入記錄)。我將測試目標系統並回報。

+0

這只是一個贓物,但您是否嘗試刪除-Arguments變量並使用硬編碼的值,例如'-arguments @ {name =「TestFilter」; EventNameSpace =「root \ cimv2」; ...}''''''''''''''''''''''''我只是想知道是否應該用'name =「$ filtername」'引號來指定參數。另外,如果你從C#中取出這個例子,可能是你不需要在你的路徑中使用雙反斜線來處理ExecutablePath和CommandLineTemplate。反斜槓不是PowerShell中的轉義字符。 – 2014-11-24 16:43:12

+0

@KeithHill只用硬編碼值進行了測試,沒有雙反斜槓,但這也沒有幫助:/變量也不是問題,因爲我可以看到wmi查看器中的值是正確的 – Paul 2014-11-24 16:52:30

回答

1

好的,經過幾天的反覆試驗,我終於適應/使用了一種不同的方法,發現了here

這將啓動一個存儲在D:\腳本中的腳本,每次連接USB並且它是永久的。

$filter = ([wmiclass]"\\.\root\subscription:__EventFilter").CreateInstance() 

$filter.QueryLanguage = "WQL" 
$filter.Query = "Select * from __InstanceCreationEvent within 5 where targetinstance isa 'win32_logicaldisk'" 
$filter.Name = "USBFilter" 
$filter.EventNamespace = 'root\cimv2' 

$result = $filter.Put() 
$filterPath = $result.Path 

$consumer = ([wmiclass]"\\.\root\subscription:CommandLineEventConsumer").CreateInstance() 
$consumer.Name = 'USBConsumer' 
$consumer.CommandLineTemplate = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe –ExecutionPolicy Bypass -file D:\scripts\reassignDriveletter.ps1" 
$consumer.ExecutablePath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" 
$consumer.WorkingDirectory = "D:\scripts" 
$result = $consumer.Put() 
$consumerPath = $result.Path 

$bind = ([wmiclass]"\\.\root\subscription:__FilterToConsumerBinding").CreateInstance() 

$bind.Filter = $filterPath 
$bind.Consumer = $consumerPath 
$result = $bind.Put() 
$bindPath = $result.Path 

要刪除這些博活動,這樣做:

([wmi]$filterPath).Delete() 
([wmi]$consumerPath).Delete() 
([wmi]$bindPath).Delete() 

我的測試腳本創建的文件夾每次USB驅動器插入的時間,所以我可以測試它和它的工作。

我正在運行Windows 8.1 btw。

+0

嗨米奇,謝謝你的努力。我只是測試了這一點,我開始懷疑我的工作站有問題,因爲你的方法不工作(正如我的更新中所述,我的腳本實際上在另一臺機器上工作)。我還沒有測試目標機器上的任何腳本,所以直到那時我想它們都工作正常 – Paul 2014-11-25 15:25:47

+0

我剛纔看到了更新。順便說一句,如果您使用域帳戶創建事件,則存在安全考慮。基本上,該帳戶需要成爲本地管理員組的成員,更在這裏:http://msdn.microsoft.com/en-us/library/aa393016(v=vs.85).aspx – 2014-11-25 15:31:22

+0

是的,我看到了,我的帳戶我與域和本地管理員創建事件。我也嘗試使用機器本地管理員帳戶來創建它們,但也沒有運氣 – Paul 2014-11-25 15:51:05

相關問題