一度に約12〜14台のWin200 [3,8]サーバーがオンラインになっています(一部のVMは一時的です)。これらのほとんどは、いくつかのスケジュールされたタスクを実行します。各サーバーで実行されているすべてのスケジュールされたタスクのリスト、さらに重要なことに、それらが実行されているドメインユーザーのリストを取得するにはどうすればよいですか?確かに各サーバーにログインして質問することはできますが、これを行うためのPowerShellまたは他のシステム(またはActive Directoryに何か)があるかどうか疑問に思っています。
これがWindowsで実行できるようになっていると便利ですXPデスクトップも...要件ではありませんが、参考までに。ありがとうございます。
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行をそれぞれ取得して、何か便利なものにします。
組み込みのタスクスケジューラは、(ほとんどのWindowsツールと同様に)リモートコンピューターへの接続をサポートし、リモートコンピューターのタスクを管理する必要があります(実際にはXPではなく Microsoftはそうすべきだと言っているようです )。
スケジュールされたタスクを処理し、おそらくリストする at command は、接続するリモートコンピューターを指定することもできます。これはコンソールコマンドであるため、スクリプトを作成してコンピューターのリストに接続し、すべてのタスクを表示するのは簡単です。とにかく理論的には^^