
多くのスコープを持つWindows DHCPサーバー上のアドレスの新しいリースを監視する方法の1つについてお話したいと思います。 タスクは次のとおりでした。新しいリースを見つけて、リストをたどって、不快なホストを探し、それ以降の禁止を行います。
これを解決するために、SQLiteデータベースを作成し、そのデータベースに既存のリースに関する情報を保存し、クエリを使用して、以前に取得したテーブル(たとえば、昨日または1週間前)を現在のデータと比較します。
最初は、私はプログラマーではないことに注意してください。おそらく、ここで紹介するコードはあまり効果的ではありませんが、問題は解決します。 スクリプトは、PowerShell 3.0で初めて登場したコマンドレットを使用し、Windows Server 2012 R2で作業がテストされ、Windows Server 2008 R2はDHCPサーバーとして機能しました。
SQLiteを使用するには、System.Data.SQLite.dllとSQLite.Interop.dllの2つのライブラリが必要です。 System.Data.SQLiteの一部として
ここからダウンロードできます。 非バンドルバージョンが必要です。 フレームワークバージョン4.5がコンピューターにインストールされているため、sqlite-netFx45-setup-x64-2012-1.0.96.0.exeを選択しました
ライブラリを接続します。この場合、dllはスクリプトと同じフォルダーにあります。
便宜上、既存のメソッドをスクリプト関数でラップします。
現在のリースについてDHCPサーバーをポーリングします。 -IncludeReservationsパラメーターが起動時に指定されなかった場合、予約をスキップします。
データベースを作成するか、既存のデータベースとの接続を確立し、SQLite.SQLiteCommandオブジェクトのインスタンスも作成します。
クエリを使用して「今日の」テーブルを作成します。
CREATE TABLE $CurrentTableName (IPAddress PRIMARY KEY, ScopeId, AddressState, ClientId, HostName);
サーバーから受け取った値を入力します。 以前に定義されたstr()関数は、nullではなく空の文字列を返します。
INSERT OR IGNORE INTO $CurrentTableName VALUES('$(str($Lease.IPAddress))', '$(str($Lease.ScopeId))', '$(str($Lease.AddressState))', '$(str($Lease.ClientId))', '$(str($Lease.HostName))');
最後の2つを名前(同じ日付)のテーブルで選択して、内容を比較します。
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name DESC LIMIT 2;
そして比較してください:
SELECT * FROM $LastTableName WHERE $LastTableName.ClientId NOT IN (SELECT ClientId FROM $PrevTableName);
結果をコンソールに出力します。
$Result | ft -Wrap -AutoSize
出力テーブルの例:
IPAddress ScopeId AddressState ClientId HostName --------- ------- ------------ -------- -------- 10.10.10.22 10.10.10.0 Active a5-b4-c3-d2-e1-f0 UsersOwnDevice.domain
データベースへの接続を閉じて、オブジェクトを破棄します。
たとえば、結果をメールに送信し、スクリプト自体をスケジュールに従って実行できます。
実行例:patrol.ps1 -ComputerName mydhcp.domain -DBDirectory D:\ Temp