首页 文章

Powershell脚本作为计划任务

提问于
浏览
1

我有一个删除旧临时文件的脚本,它在以下场景下运行良好:

  • 从控制台主机

  • 来自PowerShell ISE

  • 从“运行”命令 . 换句话说,开始>>运行 . 输入 powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1

但我想将其设置为计划任务,因为它可能需要一些时间才能完成 . 我的理解是,如果命令在Run行上运行,那么我只需要将该命令复制到Task Scheduler中的正确字段中 . 即'Actions'选项卡下的'Program/script'文本框 . 调度程序将'powershell.exe'之后的措辞移动到'Arguments'字段,一切都应该是好的 . So saith Ed Wilson, Scripting Guy .

但有些事情会破裂定期启动时,脚本从文本文件中获取服务器名称,检查每个服务器上的临时文件夹,并删除旧文件,如下所示:

Get-ChildItem -Path \\$server\C$\Windows\Temp -File | Where-Object {$_.LastAccessTime -lt $cutoffdate} | Remove-Item -Recurse

在我测试的每台服务器上,至少找到并删除了一些内容,正如预期的那样 . 但是当我设置计划任务时,会找到/删除零文件 .

一些故障排除后,我发现,当我点击开始>>运行>> PowerShell中,它会打开我的用户配置文件,但是当计划任务启动PowerShell的,它打开 C:\Windows\System32\WindowsPowerShell\v1.0\Powershell.exe . 因为我的脚本是为了假设我的源文件在我的 Profiles 中而写的,所以PS无法找到它 . 我认为填写计划任务中的"Start In"文本框意味着PowerShell会在该文件夹中打开,但我想不会 .

为了解决这个问题,我在我的脚本(ick)中硬编码了源文件的位置,并将 Set-Location C:\Users\<userprofile> 放在我的脚本顶部 . 但这并没有改变任何事情 .

我还尝试了以下操作:

powershell -noprofile -noexit -executionpolicy bypass -file C:\Users\<userprofile>\Delete-TempFolders.ps1

同样,作为任务启动时的脚本正常工作,除了它无法找到或删除任何旧的临时文件 . 我根本无法弄清楚它失败的地方 .

2 回答

  • 1

    要将我以前的评论正式化为答案,这里是TechNet article on the subject的摘录:

    如果选中标记为“不存储密码”的复选框,则任务计划程序将不会存储本地计算机上提供的凭据,但会在正确验证用户身份后将其丢弃 . 当需要运行任务时,Task Scheduler服务将使用Kerberos身份验证协议的“Service-for-User”(S4U)扩展来检索用户的令牌 . 使用S4U时,服务使用帐户安全上下文的能力受到限制 . 特别是,该服务只能使用安全上下文来访问本地资源 . 如果您的任务需要访问网络资源,则无法使用S4U;这样做会导致您的任务失败 . 唯一的例外是在操作所涉及的计算机之间 Build 约束委派的情况 . 如果您使用的是S4U功能,则该任务将无法访问加密文件 .

    换句话说,您有三种选择:

    1)存储任务本地需要的所有内容(或将任务本身移动到文件所在的计算机) .

    2)使用不能使用方便的库存cmdlet的网络协议,例如 Get-ChildItem .

    3)设置Kerberos constrained delegation . 说起来容易做起来难,但仍有可能 .

  • 0

    这并不直接试图回答你的问题 . 相反,通过将输出重定向到日志文件,提供了一种更好地进行故障排除的方法 . 使用 powershell 作为命令并使用 -NonInteractive -windowstyle minimized -c "powershell -c "C:\Users\<userprofile>\Delete-TempFolders.ps1" -verbose >> "C:\LogPath\ConsoleLogs\TempFoldersPS1.log" 2>&1" 作为参数运行脚本 .

    希望这可以帮助 . 另外,让我知道我会把它拿下来 .

相关问题