VBScript не работает из службы Windows - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть служба Windows, которая вызывает файл bat. Этот bat-файл вызывает скрипт PowerShell, а внутри этого скрипта PowerShell вызывается VBScript.

Windows Service > bat file > powershell file > vbscript

Когда я вручную запускаю файл bat, сценарий VBscript успешно выполняется, но если я выполняю тот же файл bat из службы Windows, то все скрипты вызываются, но VBScript пропускается.

Выполнение файла bat вручную успешно выполняет VBScript, но не через службу Windows

Я пытался вызывать VBScript внутри PowerShell различными способами:

  1. & c:\windows\system32\cscript.exe NameOfFile.vbs
  2. start-process
  3. invoke-expression
  4. C:\Windows\System32\cscript.exe NameOfFiles.vbs //B //Nologo $IP_SU $RemoteSessions_Output $user

Мой VBScript:

dim ip
dim sessions_dir
dim temp
dim username
dim password

set temp = Wscript.Arguments
ip = temp(0)
sessions_dir = temp(1)
username = temp(2)
password = temp(3)

Sub WaitEnter()
    WshShell.AppActivate("telnet " & ip )
    WScript.Sleep 2000
    WshShell.AppActivate("telnet " & ip)
    WshShell.SendKeys "{Enter}"
    WshShell.AppActivate("telnet " & ip)
    WScript.Sleep 2000
End Sub

set WshShell = WScript.CreateObject("WScript.Shell")
Wscript.Sleep 1000
WshShell.AppActivate("telnet " & ip )
WshShell.Run "telnet " & ip & " -f " & sessions_dir & "\" & ip & "_SU_Status_Output.txt",2
WshShell.AppActivate("telnet " & ip)
WScript.Sleep 1000
WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys username
WaitEnter

WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys password
WaitEnter

WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys "SU_INrOmk=` pl | awk '{{}print {$}3{}}' | head -3 | cut -d '=' -f2`; SU_type=` pl | grep $SU_INrOmk | tail -1 | awk '{{}print {$}12{}}'`"
WaitEnter

WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys "echo $SU_type"
WaitEnter

WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys "exit"
WshShell.AppActivate("telnet " & ip)
WshShell.SendKeys "{Enter}"

иСценарий PowerShell, откуда он вызывается, выглядит следующим образом:

if(Test-Path C:\Windows\System32\cscript.exe){
    echo "Cscript found"
    $command = "& C:\Windows\System32\cscript.exe NameOfFile.vbs $IP_SU $RemoteSessions_Output $user $DecPwd | out-null"
    Invoke-Expression -Command $Command
    start-Sleep 10
    if($?){
        start-sleep 10
        $SU_Output_File = $IP_SU + "_SU_Status_Output.txt"
        $SU_Remote_FilePath = $RemoteSessions_Output + "\" + $SU_Output_File
    }
}

Я ожидаю, что VBScript вызывается, когда служба Windows вызывает файл bat.

1 Ответ

0 голосов
/ 07 ноября 2019

Я вижу несколько вещей, которые могут вызывать у вас проблемы здесь.

Я не владелец VBS, но я предполагаю, что вы используете Wscript, который требует интерактивности, я думаю, но вывместо этого следует использовать Cscript варианты вызовов. Я предполагаю, что ваш сценарий может быть взрывом из-за этого. Службы не могут работать в интерактивном контексте, начиная с Vista / Windows Server 2008.

Вы вызываете это с помощью Invoke-Expression, что (почти) всегда возвращает успех, даже если командлет не выполнен . Другими словами, Invoke-Expression будет (почти) всегда устанавливать $? в $ True, даже если команда не выполнена. Тем не менее, вы можете подсчитать оценку ; $? в конце вашего выражения, что в итоге приведет к установке $?, как и следовало ожидать, что нарушает понятие «всегда устанавливает $? в $True».

Однако вы также неправильно используете $?. $? оценивает только успех cmdlets, а не команды. cscript.exe - исполняемый файл, и его успех должен оцениваться с помощью автоматической переменной $LASTEXITCODE. Обычно это будет 0 для успеха и любое другое значение для неуспеха. Вам придется проверить успех этого $LASTEXITCODE самостоятельно, так как даже если ErrorActionPreference установлен на Stop, он не будет автоматически обрабатывать ненулевые коды выхода как завершающие ошибки.

Снаружииз объема этого ответа, но стоит упомянуть, Я бы порекомендовал заменить Invoke-Expression прямым вызовом исполняемого файла и вместо этого указать параметры .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...