我编写了一个 .cmd 文件,它调用了十个不同的 .exe 文件。我能够在我的服务器上本地运行这个 .cmd 文件,并且它运行正常。
当我使用 [gpedit.msc](组策略编辑器)进行“计算机配置,Windows 设置”并将我的 .cmd 文件设置为启动脚本时,似乎没问题。
当我重新启动服务器时,启动脚本从未被调用。我不知道为什么。我的目标是每次启动服务器时都执行此脚本。(不是登录)。
我正在测试的这台服务器不是域控制器。我不确定这是否与问题有关?帮忙吗?
附言:这些是 EC2 Amazon 云服务器。对我来说很麻烦。
答案1
从“策略结果集”( rsop.msc
) 开始,查看包含脚本的 GPO 是否正在被处理。我发现,大多数情况下,策略应用问题最终都是由于系统管理员对 GPO 链接位置的理解与操作系统实际计算适用于特定用户或计算机的 GPO 列表的方式不一致。
如果正在处理 GPO 但脚本未执行,我会检查脚本上设置的权限是否允许主题计算机的计算机帐户读取/执行脚本,以及 GPO 中引用的路径是否在主题计算机上正确解析。
编辑:
您在策略结果集工具中查找的位置不对。“软件设置”是组策略中可以“强制”安装软件的位置。您感兴趣的是“计算机设置 / Windows 设置 / 脚本(启动/关机)”。
我最感兴趣的是查看您指定脚本的 GPO 是否列在 RSoP 中“计算机设置”节点的“属性”的“常规”选项卡上。我怀疑您会发现 GPO 未列在那里,因此未被处理。
您将创建的指定启动脚本的 GPO 链接在哪里?
编辑2:
因此,您会在 RSoP 中的“脚本(启动/关闭)”节点下看到脚本的路径。您应该在那里有一个“上次执行”列。如果那里列出了日期/时间,则表示组策略客户端已尝试执行您的脚本。如果没有列出时间,则表示它尚未尝试执行它。
希望您已经查看了应用程序事件日志并确认没有记录任何有关执行脚本的错误。如果没有,请查看那里。
假设脚本正在执行,我会考虑添加一行以在计算机上留下某种“标记”,以确认脚本正在执行。类似的东西echo foo > %TEMP%\foo.txt
会给你一个系统范围的 %TEMP% 目录(通常是“C:\WINDOWS\TEMP”)中的文件,它可以告诉你脚本是否正在执行。我开始怀疑你的脚本正在执行,但计算机的 SYSTEM 上下文由于某种原因无法访问你试图执行的 EXE。
答案2
由于脚本执行时您不会登录,因此它不会具有与您登录时相同的环境。%variables 可能不起作用等。确保所有路径都是本地完整路径,因为正如 Evan 提到的那样,由于它在计算机帐户下运行,因此它将无法访问网络资源。
如果您只在一台机器上运行此程序,请考虑使用计划任务而不是 GPO,因为它对此类事情有更好的日志记录,并且您可以以您选择的用户帐户运行它。您甚至可以使用组策略首选项通过 GPO 将计划任务(和 .cmd 本身)推送到计算机。