2016-06-22 3 views
0

У меня есть следующая проблема:Run Исполняемые Без WScript

  • Когда пользователь входит в систему через Citrix, сценарий входа пишет в сети файл
  • После того как файл был записан, уведомить локальный компьютер, чтобы он мог выполнять некоторые операции
  • Как только это будет сделано, перезапустите сеанс (я знаю, как это сделать, моя трудность связана с мониторингом сетевого файла из локально хранимого файла FileWatcher и последующим запуском локального exe)

Я планирую достичь этого:

  • Регистрация в ActiveEventScriptConsumer на машине, которая будет следить за файл, а затем запустить исполняемый файл, когда он модифицируется
  • Первые действия Исполняемый файл занимает в спать в течение 5 минут, а затем выполнить действия, мне это нужно делать

сдерживающих

Проблема у меня в том, что ActiveEventScriptConsuemr s не может использовать Wscript объект, то есть я не могу запустить ехе с:

objShell.Run("C:\MyProgram.exe")

Есть другой способ запуска исполняемого файла из VBScript, который может делать с EventConsumer? В качестве альтернативы, могу ли я зарегистрировать эту подписку, когда сценарий работает, использует нечто, отличное от VBScript?

Я бы включил Wait в свой сценарий входа в систему, но я не могу отложить это, потому что это приводит к тому, что мои групповые политики запускаются через 5 минут после входа в систему!

Я попытался взглянуть на запуск командного файла из VBS, но это также использует WScript.

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

Любая помощь очень ценится!

событий Подписка Код:

$Computername = $env:COMPUTERNAME 

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

$script = 
@" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("c:\test\filewatching\Log.log", 8, True) 
objFile.WriteLine "1" 

Dim objShell 
Set objShell = WScript.CreateObject("WScript.Shell") 
objShell.Run("C:\MyProgran.exe") 
Set objShell = Nothing 

objFile.WriteLine "2" 

objFile.Close 
"@ 
$instanceConsumer = ([wmiclass]"\\$Computername\root\subscription:ActiveScriptEventConsumer").CreateInstance() 
$instanceConsumer.Name = 'ConsumerNameHere' 
$instanceConsumer.ScriptingEngine = 'VBScript' 
$instanceConsumer.ScriptFilename = '' 
$instanceConsumer.ScriptText = $script 
$instanceConsumer.Put() 

[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

Как насчет использования запланированной задачи? Установите триггер для входа в систему и добавьте пятиминутную задержку. – vonPryz

+0

@vonPryz Это хорошая идея. Есть ли способ запуска при входе в сеанс citrix вместо входа в сам компьютер? – Bassie

+0

Зачем вам это нужно? Какую проблему вы решаете? –

ответ

0

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

Docs

Когда WMI запускается как служба, скрипты, управляемые ActiveScriptEventConsumer не производят вывод на экран. Скрипты, которые используют MsgBox, выполняются, но они не отображают информацию на экране. Запуск службы WMI в качестве исполняемого файла не поддерживается, но WMI позволяет скриптам, использующим функцию MsgBox, выводить вывод или принимать ввод пользователя.Ни один из методов, предоставляемых объектом WScript, не может использоваться, потому что ActiveScriptEventConsumer не использует Windows Script Host (WSH).

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

Смежные вопросы