VBScript зависает при запуске из планировщика задач - PullRequest
0 голосов
/ 28 июня 2018

Мой VBScript работает, если я запускаю его вручную или запускаю его с помощью Task Scheduler от текущего вошедшего в систему пользователя, но он не работает, если я установил «запускать, зарегистрирован ли пользователь или нет».

Я запускаю vbs скрипт из cmd файла. Cmd и vbs оба лежат на локальной машине, откуда я запускаю задачу в одной общей папке (я не использую локальный путь, потому что он содержит пробелы, и я не очень знаком с синтаксисом vbs и Chr(34), поэтому я решил использовать сетевой путь к общей папке (\\server\1$)

Вот командный файл (1.cmd):

pushd \\server\1$\
wscript.exe "zISSsend.vbs"
popd

Это zISSsend.vbs (она выполняет программу cons.exe, архивирует файлы и отправляет ее на электронную почту):

Option Explicit
Const SMTP_Subj = "tt"
Const Arch_Name = "tt"
Const Cons_Path = "\\server\1$\"

Dim fso, fn, f, ff(), cnt, WshShell
Set WshShell = CreateObject("WScript.Shell")
set fso=createobject("Scripting.FileSystemObject")
WshShell.CurrentDirectory = Cons_Path

WshShell.Run Cons_Path & "cons.exe /usr", 2, True

WshShell.Run "zISS.DAT\pkcb.exe a -y -r -ep -ibck -AG{-}YYYYMMDD{-}HH zISS.DAT\" & Arch_Name & ".zip " & Cons_Path & "\ADM\STS\*.stt", 2, true
WshShell.Run "zISS.DAT\pkcb.exe a -y -r -ep -ibck -AG{-}YYYYMMDD{-}HH zISS.DAT\" & Arch_Name & ".zip " & Cons_Path & "\RECEIVE\*.usr", 2, true

Const SMTP_Host = "smtp.gmail.com"
Const SMTP_Port = 465
Const SMTP_From = "xx@gmail.com"
Const SMTP_Text = "xx"
Const SSAP_INDX = "xx"
Const SMTP_ToPP = "xxx@gmail.com"
Const cdoSendUsingPort = 2

fn = fso.buildpath(Cons_Path, "zISS.DAT")
Set f = fso.GetFolder(fn).Files
For Each fn In f
    If LCase(fso.GetExtensionName(fn)) = "zip" Then
        AddToArray fn, ff, cnt
    End If
Next

SendMessage SMTP_ToPP, SMTP_Subj, SMTP_Text, ff

Sub SendMessage(Recipient, Subj, Text, Attachments)
    Dim msg,fn
    Set msg = WScript.CreateObject("CDO.Message")
    With msg
        .From = SMTP_From
        .To = Recipient
        .Subject = Subj
        .TextBody = text
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTP_Host
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTP_Port
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = SMTP_From
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = SSAP_INDX
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
        .Configuration.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 120
        .Configuration.Fields.Update
        .MimeFormatted = True
        For Each fn In attachments
            .addattachment fn
        Next
        .Send
    End With
End Sub

Sub AddToArray(Itm, Arr, Count)
    Count = Count + 1
    ReDim Preserve Arr(Count-1)
    Arr(Count-1) = Itm
End Sub

Пользователь, выполняющий скрипт в планировщике заданий, является администратором сервера и, конечно, имеет права доступа к общей папке. Также я запускаю его с самыми высокими привилегиями. На панели «действия» я указываю путь к файлу cmd (\\server\1$\1.cmd).

Повторюсь, он работает, когда я запускаю его вручную, он работает, когда я запускаю его с планировщиком заданий от текущего вошедшего в систему пользователя, но не работает, когда я проверяю "запустить, зарегистрирован ли пользователь или нет" и делает это запустить с тем же пользователем. В результате я получил процесс зависания wscript.exe.

Я решил получить несколько логов из файла VBS и добавил

Dim fso1
Set fso1 = WScript.CreateObject("Scripting.Filesystemobject")
Set f = fso1.CreateTextFile("SCRIPTLOG.txt", 2)

И сделал f.WriteLine после каждого блока. С этим я узнал, что сценарий висит на линии

WshShell.Run Cons_Path & "cons.exe /usr", 2, True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...