【问题标题】:Powershell script as Scheduled TaskPowershell 脚本作为计划任务
【发布时间】:2015-09-25 16:27:54
【问题描述】:

我有一个删除旧临时文件的脚本,它在以下情况下完美运行:

  1. 从控制台主机
  2. 来自 PowerShell ISE
  3. 来自运行命令。换句话说,开始>>运行。输入powershell.exe -file C:\Users\<userprofile>\Delete-TempFiles.ps1

但我想将其设置为计划任务,因为它可能需要一些时间才能完成。我的理解是,如果命令在 Run 行有效,那么我只需将该命令复制到 Task Scheduler 中的适当字段中。即,“操作”选项卡下的“程序/脚本”文本框。调度程序将“powershell.exe”之后的措辞移动到“参数”字段,一切都应该很好。 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。因为我的脚本是假设我的源文件在我的个人资料中,所以 PS 找不到它。我以为在计划任务中填写“开始于”文本框意味着 PowerShell 会在该文件夹中打开,但我想不会。

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

我还尝试了以下操作:

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

同样,脚本在作为任务启动时正常工作,但它无法找到或删除任何旧的临时文件。我就是不知道哪里出了问题。

【问题讨论】:

  • 计划任务是以什么用户身份运行的?
  • @briantist - 大约 90% 的计划任务问题就在那里。
  • @EBGreen 是的,尤其是在涉及 UNC 路径时。
  • 以我自己的用户ID运行,设置为无论用户是否登录都运行,不存储密码(由于安全限制不能),最高权限。该脚本从我使用“Get-Credential |”创建的 xml 文件中获取我的域密码。 Export-Clixml -path .\creds.xml'
  • 密码未存储=您只能访问本地资源。 “本地”在这里有点误导,因为 HTTP 可能会工作,但没有 UNC 路径或任何需要 NTLM 身份验证的东西。

标签: windows powershell scheduled-tasks


【解决方案1】:

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

如果您选中标记为 不存储密码 的复选框,则任务 调度程序不会将提供的凭据存储在本地 计算机,但在正确验证后将丢弃它们 用户。当需要运行任务时,任务计划程序服务将 使用 Kerberos 的“用户服务”(S4U) 扩展 用于检索用户令牌的身份验证协议。

在使用 S4U 时,服务使用安全上下文的能力 帐户的数量受到限制。特别是,该服务只能使用 访问本地资源的安全上下文。如果您的任务需要 访问网络资源,不能使用S4U;这样做会导致 你的任务失败。唯一的例外是受约束的情况 在涉及的计算机之间建立了委派 手术。如果您使用的是 S4U 功能,该任务将不会 可以访问加密文件。

换句话说,你有三个选择:

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

2) 使用不需要域身份验证的网络协议。这可能不安全,您可能无法使用方便的常用 cmdlet,例如 Get-ChildItem

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

【讨论】:

    【解决方案2】:

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

    希望这会有所帮助。否则,请告诉我我会删除它。

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 2015-11-06
      相关资源
      最近更新 更多