web-dev-qa-db-ja.com

Windowsのスケジュールされたタスクレポート?

一度に約12〜14台のWin200 [3,8]サーバーがオンラインになっています(一部のVMは一時的です)。これらのほとんどは、いくつかのスケジュールされたタスクを実行します。各サーバーで実行されているすべてのスケジュールされたタスクのリスト、さらに重要なことに、それらが実行されているドメインユーザーのリストを取得するにはどうすればよいですか?確かに各サーバーにログインして質問することはできますが、これを行うためのPowerShellまたは他のシステム(またはActive Directoryに何か)があるかどうか疑問に思っています。

これがWindowsで実行できるようになっていると便利ですXPデスクトップも...要件ではありませんが、参考までに。ありがとうございます。

2
Matt Rogish

Schtasksはこのためのあなたの友達です-ATは古く、schtasksで作成されたタスクを(SFAIK)理解しません。残念ながら、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行をそれぞれ取得して、何か便利なものにします。

3
user2278

組み込みのタスクスケジューラは、(ほとんどのWindowsツールと同様に)リモートコンピューターへの接続をサポートし、リモートコンピューターのタスクを管理する必要があります(実際にはXPではなく Microsoftはそうすべきだと言っているようです )。

スケジュールされたタスクを処理し、おそらくリストする at command は、接続するリモートコンピューターを指定することもできます。これはコンソールコマンドであるため、スクリプトを作成してコンピューターのリストに接続し、すべてのタスクを表示するのは簡単です。とにかく理論的には^^

2
Oskar Duveborn