我在尝试设置一些自动任务来执行批处理文件并进而运行 python 脚本时遇到了大量问题。
当我以我的用户名运行这些任务并且我已登录时,它们都能正常运行,但是当我将它们设置为在未登录的服务帐户下运行时,1)我无法让它们运行,2)我真的不知道如何排除故障。
我进行的一些测试包括
- 只需获取一个批处理文件来执行并将一行文本写入指示域\用户和时间的文件中。
- 除了执行将一行文本写入文件的 Python 脚本外,执行的操作相同。这表明服务帐户可以访问 Python,并且能够写入文件。
- 再次发生同样的事情,但这次执行位于共享目录中的 python 脚本并写入同一位置的文件,表明该任务可以执行脚本并访问同一位置。
- 我在看这个问题并且确信我已经正确设置了所有内容,例如本地安全策略、运行批处理作业的权限等。
- 我确保我的脚本使用 UNC 路径而不是驱动器映射
从那以后,事情就变得更加棘手了。首先,也许我在这里做错了什么,TaskScheduler 中的历史记录选项卡似乎对我没什么帮助。没有任何类似“此任务尝试读取此文件但没有权限”的内容。此外,当服务帐户运行任务时,没有控制台窗口,所以我看不到任何输出。我通常会得到操作码 2(未找到文件?)或 1(调用了错误的函数),但历史记录选项卡没有关于未找到内容的详细信息。
在一种情况下,我可以运行 Python 脚本并写入文件,但当我添加代码来连接数据库时,它就死机了。在另一种情况下,当我删除脚本中的导入时,它可以运行,但放回去后就不行了。
任务计划程序中的设置(这适用于我尝试过的许多测试和脚本)是在“用户以下帐户”下设置服务帐户的域\用户,然后单击“无论用户是否登录都运行”复选框。我还选中了“以最高权限运行”,并确保我在“操作”下列出了批处理文件的位置。
以下是批处理文件的文本:
echo testing batch file : %time% %USERDOMAIN%\%USERNAME% >> statenet-test.log
IF %ERRORLEVEL% NEQ 0 ECHO %date% %USERDOMAIN%\%USERNAME% >> statenet-test.log mycommand wasn't found
python --version >> statenet-test.log mycommand wasn't found
if exist %script_dir%\statenet_connect_test.py (
echo script file exists %time% %USERDOMAIN%\%USERNAME% >> statenet-test.log
python %script_dir%\statenet_connect_test.py
) else (
echo can't find script file %time% %USERDOMAIN%\%USERNAME% >> statenet-test.log
)
以下是历史记录选项卡的屏幕截图:
任务历史截图
和操作选项卡 操作选项卡屏幕截图
还有一个问题...任务实际上已经停止运行了很长时间,但仍然显示为仍在运行。我在批处理文件中看不到任何可以让它继续运行的内容(末尾没有“暂停”)。这可能与根本原因有关吗?
在我看来,这确实应该可以正常工作,并且我将非常感激任何故障排除建议。
谢谢!
更新
当服务帐户被授予登录权限时,此问题已解决。当我以服务帐户身份登录并尝试运行批处理文件时,pip 包是为我的主要用户安装的,而不是为服务帐户安装的。