Мой 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