从任务计划程序运行 .vbs。VBS 应通过 shell 执行 .exe

从任务计划程序运行 .vbs。VBS 应通过 shell 执行 .exe

如果我尝试过之前发布的有关此问题的大量可能的解决方案,我就不会发布此帖子了。

我开发了一个软件,它使用.vbs文件(导出器)从另一个软件执行 .exe(记者程序) 安装在客户端机器上。

用例场景

运行导出器手动操作(右键单击并打开)运行完美,完全符合预期。当我以自己的 Windows 用户身份通过​​任务计划程序在自己的机器上运行时,它运行完美,完全符合预期。

在客户端 Windows Server 2008/2012 机器上手动运行时,它运行完美,完全符合预期。当以任何用户(不包括管理员组)身份通过任务计划程序运行时,任务计划程序报告为 0x0,但是记者程序未按预期生成文件。

当在客户端 Windows Server 2008/2012 框上通过以用户身份运行的任务计划程序运行时管理员,它可以运行,但是在一夜之间(当我们的任务设置为运行时),它却无法运行。

计划任务设置 - 常规

在此处输入图片描述

计划任务设置 - 操作

在此处输入图片描述

脚本

在上述场景中,导出器由于脚本的其他部分正在运行(脚本的其他部分清空了目标 XML 文件),因此脚本的这个阶段似乎出现故障。

Function Export(filepath, report)
    dim fso
    set fso_tidy = CreateObject("Scripting.FileSystemObject")

    if fso_tidy.FileExists(filepath)=true then

        set fso_tidy = nothing

        set oShell = CreateObject("WScript.Shell")
        oShell.Run """"&simsdir&"\CommandReporter.exe"" /QUIET /user="""&simsu&""" /password="""&simsp&""" /REPORT:"""&report&" v"&rptv&""" /OUTPUT:"""&filepath&"""", 0, true

        set oShell = nothing

        set fso_tidy = CreateObject("Scripting.FileSystemObject")
        set objFile = fso_tidy.GetFile(filepath)

        if objFile.size > 64 then
            size = round(objFile.size / 1024, 1)
            WriteToLog "DATA", "(OK) "&report&" EXPORTED (size: "&size&"kb)"
        else
            WriteToLog "DATA", "(FAILED) "&report&" EXPORTED (size: "&size&"kb)"
        end if

        set objFile = nothing

    end if

    set fso_tidy = nothing
end Function

该函数被调用 5 次,对于每个需要从软件中导出数据的报告调用一次。

已经尝试过的方法

  • 我的软件文件夹的完全用户权限
  • 尝试以每个用户身份运行,无论是客户端服务器上的本地用户还是域用户
  • 尝试使用 cscript.exe 运行 vbs

如果 vbs 需要操作文件等,我是否遗漏了有关如何从任务计划程序运行 vbs 的信息

答案1

您已将任务设置为在本地系统帐户上下文中运行。系统帐户不是成熟的交互式用户,因此并非所有任务都会在该上下文中运行。在使用它执行任务时,您必须牢记以下注意事项:

  • 本地系统向网络提供您的计算机帐户凭据(即COMPUTERNAME$),因此如果filepath位于网络共享上,则本地计算机帐户必须对它具有特定的权限(或 Everyone 组)。
  • 本地系统没有用户配置文件(技术上来说有,但里面什么都没有)。任何引用每个用户注册表设置或文件系统位置的操作都可能会失败。
  • 以本地系统运行的进程无法与用户交互,因此如果您的脚本弹出对话框,用户将看不到它。

尝试以真正的本地或域帐户而不是系统帐户运行您的任务。当然,您需要将密码嵌入到任务中才能使其正常工作。

相关内容