【问题标题】:how to use PowerShell to inventory Scheduled Tasks如何使用 PowerShell 来清点计划任务
【发布时间】:2013-03-04 14:07:52
【问题描述】:

是否有人拥有使用 PowerShell 来清点服务器上的计划任务(包括操作)的链接或脚本?

我能够获取 Scheduled Service com 对象以及我称之为“顶级”属性(名称、状态、lastruntime)的内容,但还想从 Schedule Tasks 的“Actions”部分获取信息(本质上是,计划任务的名称及其命令行)。

例如:

$schedule = new-object -com("Schedule.Service") 
$schedule.connect() 
$tasks = $schedule.getfolder("\").gettasks(0)

$tasks | select Name, LastRunTime

foreach ($t in $tasks)
{
foreach ($a in $t.Actions)
{
    $a.Path
}
}

上面的 sn-p 代码在列出任务方面起作用;但是 Actions 上的循环似乎没有做任何事情,没有错误,没有任何输出。

任何帮助将不胜感激。

【问题讨论】:

    标签: powershell scheduled-tasks


    【解决方案1】:

    从 W7 RK 获取 PowerShellPack,然后尝试 get-scheduledtask

    http://archive.msdn.microsoft.com/PowerShellPack

    摘自 MSDN:

    Windows 7 Resource Kit PowerShell Pack 包含 10 个模块,可用于使用 PowerShell 完成各种有趣的事情。 Import-Module PowerShellPack 实际上导入了 10 个模块供您使用。以下是每个模块的简要概述。

    • WPK 从 Windows PowerShell 快速轻松地创建丰富的用户界面。想想 HTA,但很容易。超过 600 个脚本可帮助您构建快速的用户界面
    • TaskScheduler 列出计划任务、创建或删除任务
    • 文件系统监控文件和文件夹,检查重复文件,检查磁盘空间
    • IsePack 使用超过 35 个快捷方式增强您在集成脚本环境中的脚本编写能力
    • DotNet 探索加载的类型,查找可用于类型的命令,并探索如何将 PowerShell、DotNet 和 COM 结合使用
    • PSImageTools 转换、旋转、缩放和裁剪图像并获取图像元数据
    • PSRSS 利用 PowerShell 的 FeedStore
    • PSSystemTools 获取操作系统或硬件信息
    • PSUserTools 获取系统上的用户,检查提升,并启动进程管理员
    • PSCodeGen 生成 PowerShell 脚本、C# 代码和 P/Invoke

    【讨论】:

    • 链接已损坏。请修复
    【解决方案2】:

    另一种方法是我编写的名为 Get-ScheduledTask.ps1 的脚本,可在本文中找到:

    How-To: Use PowerShell to Report on Scheduled Tasks

    这样你只需要这个单一的脚本,你不需要下载或安装其他任何东西。

    比尔

    【讨论】:

      【解决方案3】:

      这可能与当前的答案非常相似,但我写了一个快速脚本来帮助你。当前脚本的问题是任务中没有 Actions 属性。您需要从 comobject 提供的 xml 任务定义中提取它。以下脚本将返回一组对象,每个计划任务一个。它包括动作如果动作是运行一个或多个命令。这只是为了让您继续前进,因此您需要对其进行修改以包含更多需要的属性。

      function getTasks($path) {
          $out = @()
      
          # Get root tasks
          $schedule.GetFolder($path).GetTasks(0) | % {
              $xml = [xml]$_.xml
              $out += New-Object psobject -Property @{
                  "Name" = $_.Name
                  "Path" = $_.Path
                  "LastRunTime" = $_.LastRunTime
                  "NextRunTime" = $_.NextRunTime
                  "Actions" = ($xml.Task.Actions.Exec | % { "$($_.Command) $($_.Arguments)" }) -join "`n"
              }
          }
      
          # Get tasks from subfolders
          $schedule.GetFolder($path).GetFolders(0) | % {
              $out += getTasks($_.Path)
          }
      
          #Output
          $out
      }
      
      $tasks = @()
      
      $schedule = New-Object -ComObject "Schedule.Service"
      $schedule.Connect() 
      
      # Start inventory
      $tasks += getTasks("\")
      
      # Close com
      [System.Runtime.Interopservices.Marshal]::ReleaseComObject($schedule) | Out-Null
      Remove-Variable schedule
      
      # Output all tasks
      $tasks
      

      例如。产量

      PS > .\Untitled1.ps1 | ? { $_.Name -eq "test" }
      
      
      Actions     : notepad.exe c:\test.txt
                    calc.exe 
      Path        : \test
      Name        : test
      LastRunTime : 30.12.1899 00:00:00
      NextRunTime : 17.03.2013 13:36:38
      

      【讨论】:

      • 谢谢你,帮助很大!我想我一直难以将东西翻译成 Powershell(来自 C# 和 .NET 背景),或者找到让您知道 PS 脚本的对象模型是什么的文档。
      • Get-Member 是您探索新类型时的朋友 :) 例如。 $tasks | Get-Member 将为您提供 $tasks 数组中的对象的属性、方法等。
      【解决方案4】:

      我知道我迟到了,但@Frode F. 提供的答案虽然有效,但在技术上并不正确。

      您可以通过 PowerShell 访问计划任务的 Actions 集合的项目,但这并不是很明显。我今天也必须自己解决这个问题。

      这是在 PowerShell 中完成所有这些操作的代码,而无需使用 XML:

      # I'm assuming that you have a scheduled task object in the variable $task:
      $taskAction = $task.Definition.Actions.Item.Invoke(1) # Collections are 1-based
      

      这就是在不使用foreach 的情况下从集合中获取单个项目的全部内容。

      因为Actions 属性是一个包含参数化属性Item 的集合(例如,在C# 中你会写myTask.Actions[0] 或在VB 中myTask.Actions.Item(1)),PowerShell 将Item 属性表示为PSParameterizedProperty目的。要调用与属性关联的方法,请使用 Invoke 方法(用于 getter)和 InvokeSet 方法(用于 setter)。

      我对运行 OP 的代码进行了快速测试,它对我有用(不过,我正在运行 PowerShell 4.0,所以可能与它有关):

      $schedule = new-object -com("Schedule.Service") 
      $schedule.connect() 
      $tasks = $schedule.getfolder("\").gettasks(0)
      
      $tasks | select Name, LastRunTime
      
      foreach ($t in $tasks)
      {
          foreach ($a in $t.Actions)
          {
              Write-Host "Task Action Path: $($a.Path)" # This worked
              Write-Host "Task Action Working Dir: $($a.workingDirectory)" # This also worked
          }
      
          $firstAction = $t.Actions.Item.Invoke(1)
          Write-Host "1st Action Path: $($firstAction.Path)"
          Write-Host "1st Action Working Dir: $($firstAction.WorkingDirectory)"
      }
      

      HTH。

      【讨论】:

        【解决方案5】:

        这里有一个快速的基于:https://blogs.technet.microsoft.com/heyscriptingguy/2015/01/17/weekend-scripter-use-powershell-to-document-scheduled-tasks/

        使用 Powershell:Get-ScheduledTaskGet-ScheduledTaskInfo

        ### run like >>  Invoke-Command -ComputerName localhost, server1, server2 -FilePath C:\tmp\Get_WinTasks.ps1
        
        $taskPath = "\"
        $outcsv = "c:\$env:COMPUTERNAME-WinSchTaskDef.csv"
        Get-ScheduledTask -TaskPath $taskPath |
            ForEach-Object { [pscustomobject]@{
             Server = $env:COMPUTERNAME
             Name = $_.TaskName
             Path = $_.TaskPath
             Description = $_.Description
             Author = $_.Author
             RunAsUser = $_.Principal.userid
            LastRunTime = $(($_ | Get-ScheduledTaskInfo).LastRunTime)
             LastResult = $(($_ | Get-ScheduledTaskInfo).LastTaskResult)
             NextRun = $(($_ | Get-ScheduledTaskInfo).NextRunTime)
             Status = $_.State
             Command = $_.Actions.execute
             Arguments = $_.Actions.Arguments }} |
             Export-Csv -Path $outcsv -NoTypeInformation
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-25
          • 1970-01-01
          • 2021-08-25
          • 2014-12-28
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          相关资源
          最近更新 更多