我们同时有大约 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 行中的每一行变成有用的内容。