在没有用户登录的情况下在 Windows 启动时运行脚本

Posted

技术标签:

【中文标题】在没有用户登录的情况下在 Windows 启动时运行脚本【英文标题】:Run a script on Windows startup without a user logged on 【发布时间】:2010-10-11 12:21:54 【问题描述】:

这是一台 Windows 2003(或更高版本)机器,每天早上都会开机,但直到几个小时后才有人登录。

我想利用这段时间运行备份脚本 c:\script\backup.cmd

机器启动后如何在无人看管的情况下启动?

我尝试了 2 个注册表项,但这导致脚本在用户登录后运行(为时已晚):

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices

最后我用的是Windows TaskScheduler,谁有这样的选择,但我想知道是否还有另一种可能?

【问题讨论】:

【参考方案1】:

简答: GPEDIT.MSC(开始、运行、GPEdit.msc)

Windows 2000 及更高版本 [1] 在策略编辑器中提供计算机启动脚本集合:

计算机设置 -> Windows 设置 -> 脚本(启动/关机)

在用户配置位中有一个等效的登录脚本区域(即计算机启动后,当用户登录时)。

更长:

GPEDIT.MSC 是组策略编辑控制台,在直接使用时针对本地计算机的本地组策略存储运行,因此对于设置仅限本地参数很有用。使用 Active Directory 时,类似的界面用于编辑 AD 林托管的组策略对象 (GPO),因此相同的设置可在多台计算机上使用。

计算机启动脚本在计算机上下文中运行,即作为 LocalSystem,如您所述,因此它们通常无法访问需要特定用户或组成员身份工作。当域成员计算机访问网络资源时,它们通常(有例外)使用他们的 MACHINENAME$ 帐户进行身份验证 - 您可以设置共享/NTFS 权限以允许计算机访问这些资源。

启动脚本是在机器启动时让进程运行的一种快速简便的方法。

不过,计算机启动过程会受到程序运行时间的影响,因此您可能需要确保使用批处理文件中的 START 命令调用它,或者指定不等待可执行文件完成以您使用的任何脚本语言。 (关键点是:异步运行脚本,除非它很关键,或者不需要异步运行,因为它总是完全没有时间。长靴= 不满意的用户)。

使用 Win32 服务是另一种选择 - 您可以使用资源工具包中的 SRVANY 实用程序来“服务化”几乎任何可执行文件。 VS.Net 2002 及更高版本还允许您直接构建托管服务。

Task Scheduler 从 Vista/2008 开始获得了更多的功能,能够在启动时、空闲时和/或在生成事件日志或某些特定事件时运行脚本满足其他条件:很酷!计划任务可能具有的优势是能够指定运行任务的用户帐户,如果这对您很重要的话。

警告脚本: http://support.microsoft.com/kb/256320

异步运行启动脚本: http://msdn.microsoft.com/en-us/library/ms811602.aspx

Vista 任务计划程序(新增功能): http://technet.microsoft.com/en-us/appcompat/aa906020.aspx

[1] Windows XP、2003、Vista/2008、Windows 7/2008R2、Windows 8/2012、Windows 8.1/2012R2、Windows 10/Windows Server 2016。一切。但 NT4 没有!

【讨论】:

谢谢,你从任何角度回答都很明显。 Computer Settings/Configuration --> Windows Settings --> Scripts 这可以通过打开本地组策略编辑器找到,因为没有人解释如何进入这个窗口。 @TristanK ,我有一个 Windows 2K ,我们克隆它(vmware)并将其与网络隔离(切断网络适配器),对我们的数据库进行一些测试。但是,LOCAL GPO 启动/关闭脚本不再启动。本地 GPO 启动脚本依赖于活动网络或 AD 可用? 等等,你有 Windows 2000 机器吗?他们有时是网络连接?这是 2017 年的非常非常糟糕组合。无论如何,我很确定我曾经在 Windows 2000 中将此系统与工作组机器一起使用...不知道它会失败的任何具体原因当网络断开时,除非那里有根本性的错误 - 例如特定于脚本本身,或者它存储在 AD/on Sysvol 而不是本地硬盘驱动器等。【参考方案2】:

您已经概述了一个很好的解决方案:

将计划任务设置为在启动时运行,并允许作业在用户未登录时运行。

【讨论】:

是的,这很好用。但我想禁用任务计划程序,所以我正在寻找一种不同的方法。【参考方案3】:

您可以在系统启动时使用组策略 gpedit.msc 运行脚本

【讨论】:

这看起来又快又容易。该进程将以哪个用户身份运行?本地系统`?【参考方案4】:

你做这件事的方式对我来说似乎很好;但是,如果您想要一种替代方法,那么服务会在机器启动时启动,这样您就可以编写一个服务来检测它是否是新的一天(以允许重新启动),然后运行您的备份。

如果 将其作为一项服务来执行,我会使用 TCL,因为我知道并喜欢它,并且它有一个扩展名 twapi,允许您将脚本作为服务运行。其他脚本语言可能也有类似的功能。

【讨论】:

谢谢,这看起来很有趣。当我有一天必须编写服务时,我会看看 TCl / twapi【参考方案5】:

有,如果您使用的是 Active Directory。如果您可以将计算机隔离到它自己的 OU 或使用 WMI 过滤,则可以分配一个具有计算机启动脚本的 GPO。这将确保即使有人通过安全模式进入并禁用了任务计划程序,在启动并连接到域时,脚本也会运行。

【讨论】:

谢谢,这是一件好事,我在 AD 有一些机器,有一天会试试这个。

以上是关于在没有用户登录的情况下在 Windows 启动时运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

在没有可见命令提示符窗口的情况下在 Windows 上自动启动 websocket 服务器

如何在没有Javascript调试的情况下在网站启动时在Visual Studio中启动新的Chrome实例?

是否可以在不重新启动服务器的情况下在远程 weblogic 上重新部署应用程序?

如果在没有任何用户登录的情况下从任务计划程序启动应用程序是不可见的

我可以在没有 POST 的情况下在 python 中实现 Web 用户身份验证系统吗?

在没有全屏的情况下在 UIWebView 中播放 Youtube 视频