Назад | Перейти на главную страницу

Отчетность по запланированным задачам Windows?

У нас одновременно подключено около 12-14 серверов Win200 [3,8] (некоторые виртуальные машины временные). Большинство из них запускают некоторые запланированные задачи. Как я могу получить список всех запланированных задач, запущенных на каждом сервере, и, что более важно, пользователя домена, от имени которого они работают? Мы, конечно, могли бы войти на каждый сервер и спросить, но мне интересно, есть ли какая-нибудь PowerShell или другая система для этого (или что-то в Active Directory?)

Приятно было бы, чтобы это работало и на наших рабочих столах с Windows XP ... Не требование, а скорее к сведению. Спасибо!

Schtasks - ваш друг для этого - AT старый и (SFAIK) не понимает задачи, созданные с помощью schtasks. К сожалению, объект WMI Win32_ScheduledTask основан на 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 строк и превращаете их во что-то полезное.

Встроенный планировщик задач должен поддерживать подключение к удаленному компьютеру (как и большинство инструментов Windows) и управлять задачами удаленного компьютера (на самом деле не пробовал его в XP, но Microsoft, кажется, говорит, что должна).

В по команде который обрабатывает и предположительно перечисляет запланированные задачи, также может быть предоставлен удаленному компьютеру для подключения. Поскольку это консольная команда, было бы легко написать сценарий для подключения к списку компьютеров и отображения всех задач. Теоретически все равно ^^