我有一个简单的任务,为了测试目的,它由一个包含两行的批处理文件组成:
whoami >result1.txt
copy \\server\share\test1.txt C:\Users\xxx\Documents > output.txt 2> error.txt
当我从交互式登录运行它时,它运行良好,因为我有允许我访问共享的域凭据。
当我从任务计划程序运行它时,它失败了。第一个命令成功了(顺便说一句,表明计划的任务正在以我的身份运行),但第二个命令失败了,大概是因为它没有使用正确的凭据进行连接。
任务运行后,error.txt
为空且output.txt
包含"Access is denied."
任务历史记录中没有有用的信息 - 只是Action Completed
因为Last Run Result
复制(0x1)
失败。
计划任务属性上的常规选项是使用我的域用户帐户运行,并且“无论用户是否登录都运行”。我尝试过设置和不设置“以最高权限运行” - 似乎没有任何变化。我还尝试更改“配置”选项 - 再次无效。“不存储密码”未选中 - 但我尝试检查它只是为了完整性,但它并没有改变行为。
在服务器端,我检查了安全事件日志。当命令失败时,我可以看到审计成功匿名登录登录事件,以及审计失败条目,看起来像是匿名登录正在尝试使用 SeBackupPrivilege:
A privileged service was called.
Subject:
Security ID: ANONYMOUS LOGON
Account Name: ANONYMOUS LOGON
Account Domain: NT AUTHORITY
Logon ID: 0x180e12c36
Service:
Server: Security
Service Name: -
Process:
Process ID: 0x4
Process Name:
Service Request Information:
Privileges: SeBackupPrivilege
然后审计成功匿名登录会话被销毁。
客户端是 Windows 10,服务器是 Windows 2008 R2。凭据是 Active Directory 中的域用户帐户。
如果我使用另一台服务器,即运行 IIS 和 WebDAV 的 Windows Server 2016 机箱,则任务可以通过任务计划程序顺利运行。因此,通过 WebDAV 时,我的凭据会被使用,而通过 CIFS 时则不会。
有人能解释一下为什么复制失败吗?是否有解决方法?接下来的测试步骤是什么?我通过在批处理文件中硬编码凭据来使其工作,但显然这是不可接受的。
有人认为这项政策可能相关,但它已被禁用,所以我认为并不相关:
Network access: Do not allow storage of passwords and credentials for network authentication
at
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
答案1
我见过更多轶事证据表明权限在交互时的行为与计划任务不同。事件日志消息似乎指向这样一个事实:它需要 seBackupPrivilige(这可能实际上意味着它想要更改对象所有者)。
将运行任务的用户放在目标服务器上的内置本地组(如备份操作员)中可能会起到作用(没有测试平台来测试这一点,但如果不确定,请从两台服务器上的本地管理员开始,然后使用消除)。
理论上,您还可以使用域 GPO 为特定用户或更好的组设置类似的权限。
已编辑:您是否尝试过忽略或更改错误输出?安全事件可能是一种干扰(例如,NTLM 身份验证将始终有一个失败的匿名条目)。
如果我运行你的脚本,它会在计划任务中出错,因为 > output.txt 和 2> error.txt 前面没有路径 - 但这有效:
copy \\two.moh.local\test\test1.txt C:\temp\ > c:\temp\output.txt 2> c:\temp\error.txt
如果您从命令提示符或双击运行脚本,它将起作用,因为它将使用父目录,这与不以交互方式运行时的工作方式不同(我假设它试图在域管理员具有权限而您的用户没有权限的地方写入)。
答案2
首先,“任务计划程序错误 0x1”很难调试,需要尝试几种解决方案才能在您的环境中找到原因。
阅读问题和答案后,我建议:
- 尝试明确说明脚本或批处理文件中使用的所有路径。不要使用短路径。将目标路径 C:\Users\xxx\Documents 编辑为 D:\test 之类的路径。
- 尝试包含错误和输出文件的完整路径。
此外,我建议检查“操作选项卡”中的选项。尝试在带有空格的路径上使用引号。
您还可以在此找到有关返回错误 0x1 的宝贵信息来源