【问题标题】:What must be taken into account on executing a batch file as scheduled task?将批处理文件作为计划任务执行时必须考虑什么?
【发布时间】:2017-01-23 16:37:33
【问题描述】:

我有一个计划任务正在运行,但它似乎没有工作。此任务执行批处理文件。批处理文件只包含一行:

wscript c:\myfolder/myscript.vbs

此 VBScript 文件启动命令提示符,执行 vpncli,休眠一分钟,然后继续建立连接,将用户名/密码发送到命令行窗口。

当从命令提示符窗口运行批处理文件时,这可以正常工作,但使用计划任务没有成功。它运行任务的帐户是服务托管帐户。运行任务后,我在单独的命令行窗口vpncli中查看,发现连接仍然断开。

在计划任务中执行批处理文件以解决此问题必须考虑什么?

下面是我用来在 CMD shell 中执行的部分代码。执行如下子程序:

Sub VPN_open
  VPN_Profile = "vpn.myhost.com"
  VPN_User = "USERNAME"
  ' If the password contains special characters, enclose the characters in curly braces {}.
  VPN_Password = "PASSWORD"
  
  oShell.Run "cmd"      
  WScript.Sleep 100
  
  oShell.AppActivate "C:\Windows\System32\cmd.exe"      
  oShell.SendKeys "vpncli connect " & VPN_Profile & "~"
  
  WScript.Sleep 10000
  
  oShell.SendKeys VPN_User & "~"
  
  WScript.Sleep 5000
  
  oShell.SendKeys VPN_Password & "~"
  
  WScript.Sleep 10000
  
  oShell.SendKeys "exit~"      
End Sub 'VPN_open

【问题讨论】:

  • 根据Cisco VPN Client Command Line 应该可以运行vpnclivpnclientvpncli connect vpn.myhost.com user "USERNAME" pwd "PASSWORD" 这使得几乎整个VBScript 无用。
  • 在阅读一分钟文档后有趣的是配置文件vpn.myhost.com,它是必须先前配置的 *.pcf 文件中的连接条目的名称。 vpncli 怎么知道这个文件存储在哪里?它是从当前用户的注册表中读取的吗?还是从为当前用户定义的环境变量中定义路径的目录中读取?还是从%APPDATA%\Cisco\... 之类的用户帐户相关文件夹中读取?换句话说,包含vpn.myhost.com 的.pcf 文件的存储位置以及vpncli 期望该文件的位置是问题。
  • @Mofi,我找不到 .pcf 文件。在 Cisco 程序文件文件夹:C:\Program Files (x86)\Cisco 中,我只看到两个子文件夹,其中既不包含任何 pcf 文件,也不包含它们各自的子目录。这两个子目录是“Cisco AnyConnect VPN Client”和“Cisco AnyConnect Secure Mobility Client”
  • 嗯,*.pcf 文件肯定不在应用程序的程序文件文件夹中,因为该文件夹通常对任何标准用户都有写保护。我想它在我写的 application data 目录中。环境变量APPDATA 保存该文件夹的路径,该文件夹具有隐藏属性集。在命令提示符窗口 dir /A-D /B /S C:\*.pcf 中运行以在整个驱动器 C:上搜索扩展名为 pcf 的文件,包括隐藏文件夹和系统文件夹。
  • 我运行了命令,但没有找到文件。另外,我已经多次阅读了您在下面回答中的第一点。在尝试在脚本中设置 VPN 连接之前,我执行了 net stop vpnagentnet start vpnagent。另外,我需要运行这个任务whether or not the user is logged in。到目前为止,我已经能够以“管理员”组的身份执行此任务。如果我创建本地管理员并将这个新创建的用户添加到“管理员”组,它将无法成功运行。

标签: batch-file scheduled-tasks


【解决方案1】:

使用只有一个命令行的批处理文件作为计划任务通常没有多大意义。最好直接在计划任务中指定运行由批处理文件执行的应用程序及其参数,在本例中为%SystemRoot%\System32\wscript.exe,参数为"C:\myfolder\myscript.vbs"

仅使用控制台应用程序时,最好使用cscript - Windows 脚本宿主的控制台版本 - 而不是wscript - Windows 脚本宿主的 Windows GUI 版本。两个应用程序的帮助显示在命令提示符窗口cscript /? 中运行,帮助直接输出到控制台窗口,wscript /? 帮助显示在 GUI 窗口中。

作为定时任务运行,至少要考虑四点:

  1. 在计划任务的属性中配置的用户帐户。

    使用的帐户确定本地磁盘以及网络共享的权限。例如,本地管理员或系统帐户通常对本地网络上的任何资源没有访问权限,但对本地驱动器上的任何目录具有完全访问权限。它还为命令datetime 以及动态变量DATETIME 定义了可用的环境变量和所有区域和语言相关的设置,例如日期和时间格式Windows 命令处理器。

  2. 启动计划任务时设置的当前工作目录。

    如果在计划任务的属性中未配置其他文件夹以用作文件夹中的开始,则启动计划任务的默认目录为 %SystemRoot%\System32。双击带有驱动器号的驱动器上的批处理文件时,批处理文件的目录是当前工作目录。批处理文件执行的任何脚本都应考虑到这一点。最好的方法是编写独立于当前目录的脚本,对包括可执行文件在内的所有文件使用完全限定的文件名。

  3. 为计划任务定义的环境取决于使用的帐户。

    有用于所有用户帐户和用户帐户相关环境变量的系统环境变量。在使用不同的用户帐户(例如本地管理员或系统帐户)运行计划任务时,无法定义一些环境变量,这些环境变量是在使用自己的用户帐户运行相同的脚本时定义的。建议使脚本作为计划任务执行,尽可能独立于环境变量,Windows 自动定义的系统变量(如SystemRoot)除外。维基百科文章Windows Environment Variables 列出并描述了Windows 定义的环境变量。

  4. 作为网络驱动器连接的网络共享在运行计划任务时通常不可用。

    Windows 在当前用户的注册表中存储了哪个网络共享作为网络驱动器持久连接。这些网络共享在用户登录时连接(映射到驱动器号),并在用户注销时自动断开连接。使用与自己帐户不同的帐户将脚本作为计划任务运行会使网络驱动器对脚本不可用,因为网络共享既没有作为网络驱动器连接,也没有其他帐户最有可能访问网络资源。即使在计划任务的属性中配置为使用自己的用户帐户,网络驱动器也不可用,因为在运行计划任务之前没有登录,除非计划任务配置为仅在用户登录时运行。
    解决方案是在脚本 UNC 路径中使用对网络资源或地图具有所需访问权限的帐户,例如

    net use X: \\ComputerName\ShareName password /user:DomainName\AccountName /persistent:no

    用于驱动 X: 的共享并在退出脚本执行之前断开它与

    net use X: /delete /yes

    在命令提示符窗口中运行 net use /? 以获取有关此命令的帮助。

    通过将具有网络共享访问权限的帐户用于计划任务,无需在(批处理)脚本中指定密码和帐户名,这样更安全,否则对脚本文件具有读取权限的每个人都可以看到未加密密码和帐户名。 Windows 以加密方式存储计划任务的凭据。

因此,VB 脚本在使用当前用户帐户手动执行时工作正常,当前目录是批处理文件的目录,其中为当前用户帐户定义了环境变量,并且可能连接了脚本访问的网络驱动器和调用的应用程序必须对脚本进行调查,以找出脚本不能作为计划任务运行的原因,并为计划任务配置了属性。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2019-04-06
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多