■WSUS同期レポート強化
WSUSの同期レポートは標準だと現在日時から過去へのログしか出力できない。何かあったときに任意期間でのレポートが出せないと困るときがあるので、改造して日付の範囲指定でレポート出せるようにしてみる。
| 標準 | 改変 |
|---|---|
|
|
|
■日付入力用テキストボックスの追加
「administration\reporting\toc.aspx」の下記の行の後にテキストボックスを追加
(略) 86: </select> 87: <div class="Spacer"></div> + <div style="margin-top: 8px;margin-bottom: 2px;">同期の期間</div> + <input name="FromDate" style="width: 70px" />~ + <input name="ToDate" style="width: 70px" /> + <div class="Spacer"></div> (略)
■追加した期間を処理するコードを追加
「administration\reporting\subscriptionlogs\subscriptionlogs.aspx」の1行目を下記のように変更
<%@ Page language="c#" validateRequest="false" CodeFile="SubscriptionLogs.aspx.cs" AutoEventWireup="false" Inherits="SubscriptionLog" %>
■対応するクラスの記述
Reflector for .NET (Lutz Roeder's Programming.NET C# VB CLR)なんぞやで「administration\bin\administration.dll」を逆コンパイルしてみると「Administration.Reporting.SubscriptionLogs」があるのでそれをいじることにする。
パラメータは
string rangeDate = base.Request.QueryString["Range"]; string fromDate = base.Request.QueryString["FromDate"]; string toDate = base.Request.QueryString["ToDate"];
でとれる。
標準では、送られたパラメータは
XPostHandler handler1 = new XPostHandler(proxy1.GetSynchronizationHistory(Convert.ToInt32(rangeDate)));
とSubscriptionLogsProxyの「GetSynchronizationHistory(int range)」で処理しているようなので新しく「GetSynchronizationHistory(DateTime fromDate, DateTime toDate)」を作ってfromDateやtoDateが入力されていた場合はこっちを呼ぶように変更する。
「GetSynchronizationHistory(DateTime fromDate, DateTime toDate)」は「GetSynchronizationHistory(int range)」を元に
- subscription1.GetSynchronizationHistory()
- Global.UpdateServer.GetUpdates()
の2カ所で与えられているDateTime型をそれぞれfromDateとtoDateに置き換えて、それに併せていくつか微調整。書き換えたファイルを「SubscriptionLogs.aspx.cs」として「administration\reporting\subscriptionlogs」に保存して基本的に完了。(必要なusingディレクティブの追加などいくつか調整が必要)
あとは変更したやつで、ISubscriptionを用いているので「service\bin\microsoft.updateservices.administration.dll」が必要になるから「administration\bin」にコピーしてあげると改造完了
■注意
WSUSは複数言語に対応するためにそれぞれの言語に合わせてリソースを用意しているけれど、今回の改造はそれを無視しているので当然複数言語には対応してないです。
■追記(10/23)
今日会社のWSUSをいじってみたところ、ASP.NET1.1で動いてる場合は↑ではうまくいかないことが判明。WSUS関連のフォルダすべて(WSUSAdminやClientServiceなど)のランタイムをASP.NET2.0に切り替えてアプリケーションプールを別の物にすることで解決。