Windows 计划任务报告?

Windows 计划任务报告?

我们同时有大约 12-14 台 Win200[3,8] 服务器在线(一些虚拟机是临时的)。其中大多数运行一些计划任务。我如何才能获取每台服务器上正在运行的所有计划任务的列表,更重要的是,获取它们以哪个域用户身份运行?我们当然可以登录每台服务器并询问,但我想知道是否有一些 powershell 或其他系统可以执行此操作(或 Active Directory 中的某些东西?)

最好能在我们的 Windows XP 桌面上运行它...这不是必需的,但更像供参考。谢谢!

答案1

Schtasks 是您的好帮手 - AT 比较老旧,并且(SFAIK)无法理解使用 schtasks 创建的任务。不幸的是,Win32_ScheduledTask WMI 对象基于 AT,否则它将非常适合此用途。

不幸的是,AT 和 schtasks 都没有报告运行该作业的用户。可能某个地方有一个 COM 对象可以让您获得这些信息;也许您可以在 stackoverflow 上提问?

如果您想要编写脚本,您可能会做这样的事情:

$servers = 'server1','server2','server3'
$allTasks = @()
$servers | %{ 
    $data = schtasks /query /S $_ /fo list
    # Data looks like this:
    # <blank line> 
    # HostName:      [SERVER]
    # TaskName:      [TASK NAME]
    # Next Run Time: 12:00:00 PM, 5/9/2009
    # Status:        [BLANK or SOME ERROR]
    foreach ($line in $data){
        $blob=""|select Host, Task, Next, Status
        [void]$foreach.MoveNext(); $l = $foreach.Current.length;
        $blob.Host = $foreach.current.substring(15, $l-15)
        [void]$foreach.MoveNext(); $l = $foreach.Current.length;
        $blob.Task = $foreach.current.substring(15, $l-15)
        [void]$foreach.MoveNext(); $l = $foreach.Current.length;
        $blob.Next = $foreach.current.substring(15, $l-15)
        [void]$foreach.MoveNext(); $l = $foreach.Current.length;
        $blob.Status = $foreach.current.substring(15, $l-15)
        $allTasks += $blob
    }
}
$allTasks|format-table

这已成为一篇邪恶的代码文章 - 使用 /FO csv 选项将数据转储到文本文件,然后使用 import-csv 将数据返回到 PS 会更容易,但这样会丢失服务器名称。因此,您可以炫耀一下,创建自定义对象并使用 foreach 枚举器进行破解。调用 MoveNext 会将您移动到列表中的下一个项目,因此您可以跳过第一个空的输出行,然后将接下来的 4 行中的每一行变成有用的内容。

答案2

内置的任务计划程序应该支持连接到远程计算机(像大多数 Windows 工具一样)并管理远程计算机的任务(实际上还没有在 XP 中尝试过,但是微软似乎表示应该)。

在命令它可以处理并大概列出计划任务,也可以给远程计算机连接。由于它是一个控制台命令,因此很容易编写脚本来连接到计算机列表并显示所有任务。理论上是这样 ^^

相关内容