私の仕事の一部は、特定の OU 内のコンピューターについて、実際に使用されているもの = AD にリストされているもの = SCCM にリストされているものを確認することです。これは 25 万台の PC がある環境の場合ですが、特に 1 つの部門の 7 万台が気になります。AD と SCCM を比較するのは簡単ですが、実際には存在しないコンピューターを追跡するのは困難です。私はこれを理解するための創造的な方法を考えようとしています。
私の質問は、X 日間ログインしていないコンピューターを Powershell で AD に照会して、存在しないマシンを見つける良い方法はありますか?
私は、PowerShell で次のようなはるかに複雑なタスクを考えました。AD から dnshostnames を取得し、OU 内のすべてのホストに ping を実行し、成功したらリストから削除します。これを 1 週間、たとえば 6 時間ごとに実行し、ping が成功したマシンを削除し続けます。ラップトップは別の方法で処理する必要があります。
他に何かアイデアや提案などはありますか?
答え1
Patrick の包括的な提案のバリエーションとして、複製されたLastLogontimeStamp
属性を使用して検索を絞り込みます。
Import-Module ActiveDirectory
$threshold = (Get-Date).AddDays(-44)
$computers Get-ADComputer -Filter * -SearchBase "ou=desiredou,dc=domain,dc=tld" -Properties LastLogontimeStamp
$oldComps = $computers | where {[Date.Time]::FromFileTime($_.lastlogontimestamp) -lt $threshold}
$oldComps
その後、少なくとも 30 日間ログオンしていないすべてのコンピューターが保持されます。
しきい値が 44 日というのは少し直感に反しますが、 へのレプリケーション更新の氾濫を防ぐため、LastLogontimeStamp
属性は値が 9 日以上古い場合にのみ更新されます。値が 9 日から 14 日古い場合は、ランダムなプロセスによって更新するかどうかが決定されます。
ここに素晴らしい説明があります:http://blogs.technet.com/b/askds/archive/2009/04/15/the-lastlogontimestamp-attribute-what-it-was-designed-for-and-how-it-works.aspx
答え2
次のようなものが必要なようです古いcmp:http://www.joeware.net/freetools/tools/oldcmp/
指定されたドメインまたは組織単位で、過去1週間ログインしていないマシンを検索します。バツ日間有効で、レポート機能やそれらのコンピュータ アカウントを無効にする機能も提供します。
Active Directoryのツールと表現はドメインが知っていることだけを表現するので、レポートプロセスを構築する必要があります。外部のActive Directory 環境に追加して、使用されていないと報告されたマシンを追跡し、それらのマシンが実際に組織から出ており、削除する必要があるかどうかを確認できるようにします。ここでの代表的な例はラップトップです。ツールはラップトップが使用されていないと報告することがありますが、実際にはラップトップがオフラインで使用されているという事実が隠されています。
SCCM のレポートを使用して、マシンが最後にハートビートを送信できた時間を調査する同様のアプローチも利用できます。マシンに機能している SCCM クライアントがある場合、レポートを取得して ping を試みるよりも、このアプローチの方がおそらく優れています。この手法は、非常に手間がかかり、誤検知の結果になりやすいです。
答え3
コンピュータの AD オブジェクトには LastLogon タイムスタンプがあり、コンピュータの現在の状態を示す便利な指標となります。
サードパーティのコマンドレットをインストールできる場合は、クエスト アクティブ ディレクトリコマンドレットは非常に役立ちます。
$result = @()
$OU = "DC=ncp,DC=co,DC=uk"
Foreach($computer in (Get-QADComputer -SearchRoot "$ou" -sizelimit 0))
{
$result += "$((Get-QADComputer $computer -IncludeAllProperties).lastLogon), $computer"
}
$result は、指定された OU 内のすべてのコンピューターとその最終ログオン日を次のように一覧表示します。
06/10/2013 08:48:25, NATTHN21$
05/13/2011 14:54:04, NATTHN02$
06/10/2013 08:42:51, NATRHN01$
06/10/2013 08:45:38, NCPHON01$
このコンピュータがログオンする可能性のあるすべての DC に対してこれを実行する必要があります。あなたの規模の組織では、これはおそらく非現実的です。
代替手段として、コンピューター AD オブジェクトのオブジェクト プロパティ「whenChanged」は、マシン アカウント パスワードです。これは、30 日後に自動的に更新されます (通常、Win 2K 以降では既定です。既定のドメイン グループ ポリシー オブジェクトを確認すると、これを確認できます)。
「whenChanged」が 30 日以上経過しているコンピュータ アカウントが見つかった場合、これらはこの期間にログオンしていないマシンです。この数値は「lastLogon」が複製されない場合に複製されるため、これは大規模なマルチ DC ネットワークに適しています。
上記のスクリプトの行を修正して、「.lastLogon」を削除し、「.whenChanged」に置き換えるだけです。
Quest AD をインストールできない場合は、RSAT がインストールされているマシン (または DC) を使用して、Get-ADComputer コマンドレット (「Import-Module ActiveDirectory」と入力) を使用する必要があります。
将来の使用状況を追跡するための 3 番目のオプションは、ログオン スクリプトを使用することです。数年前にクライアントでこれを実行しましたが、約 70,000 台ではなく、数百台のマシンを使用していたにもかかわらず、うまく機能しました。
当時のログオン スクリプトは .BAT ファイルでした。NETLOGON で次の行を含む新しい .BAT を作成します (例: LogonTrack.BAT)
::LogonTrack.BAT
ECHO %date% >Z:\%computername%
70Kのユーザーが使用する可能性のあるログオンバッチファイルの末尾に次の行を追加します。
call LogonTrack.BAT
これにより、コンピュータの名前が付いたファイルが作成され、ファイルの日付はマップされた場所への最後のログオンになります。
私はこれをお勧めしませんが、この情報についてはイベントログを監査することができます。ただし、私は可能な限りログダイビングを避けています。イベント 4624。
最後に、私はLANスイーパークライアントでは素晴らしいです。古いコンピューターに関する優れたレポートがあります。ただし、有料製品であるため、別途インストールとサーバーが必要なので、あまり役に立たないかもしれません。さらに、250K システムの場合、そこら中に転用された VM ではなく、かなり強力なバックエンドが必要になります。