ドメイン内の非アクティブなユーザーアカウントの検索

Active Directoryは、ユーザー、コンピュータ、および関連オブ 非アクティブなユーザーアカウントを見つける方法は次のとおりです。

これは、有用かつ関連性のある時間の経過とともにメンテナンスを必要とするリレーショナル情報のデータベースです。 ディレクトリにはアカウントが使用されなくなります。 Active Directoryでこれらのアカウントを見つけることは、一見したように簡単ではありません。 非アクティブなユーザーアカウントの検索と削除の自動化について説明します。

検索条件の定義

このプロセスに必要なものを定義しましょう。 私たちの目標は、長期間ネットワークにログインしていない従業員アカウントを見つけることです。 私はいつも90日または120日を使用していましたが、その数は14日と低くなる可能性があります。 あなたは、あなたの組織のために右であるかを決定する必要があります。 90日は休暇、家族の緊急事態、または延長医学の葉のためのオフィスから人々を可能にするには十分に大きいクッションを与える。 アカウントが90日間の非アクティブになったら、それらのアカウントを無効にして別のOUに移動します。

最初に探しているものを定義することで、従うための簡単なルールセットを構築することができます。 私たちのルールセットは次のようになります:

  • 90日間ログオンアクティビティがないアクティブなアカウントを検索して無効にします。
  • 無効になった各アカウントをDisabled-Users OUに移動
  • 無効になった各ユーザーに、自動化されたプロセスが無効にしたというコメントをマークします。

アカウントの非アクティブプロパティを検索

各ユーザーアカウントには、ログイン情報を含むいくつかの属性があります。 最後のログイン時間を示す属性を見つけたいと思います。 これらの属性を見つけることができれば、特定の日付以降にログインしていないアカウントを照会するためにそれらを使用できます。 PowerShellを使用して、すべてのルールセットを表示し、使用する属性を選択できます。

Get-ADUserは、ユーザー情報を表示するために最も使用されるコマンドレットです。 Get-ADObjectとSearch-ADAccountを使用できますが、Get-ADUserは私たちのタスクに最適なコマンドレットです。 すべてのユーザープロパティを表示するには、コマンドレット構文に-properties*を追加する必要があります。 この構文を省略すると、デフォルトのプロパティのみが表示され、これは10個のプロパティのみです。

Get-ADUser Michael_Kanakos -Properties *

クエリからフィールドの長いリストを返します(150以上!). ワイルドカードを使用して、特定の単語を含む属性を検索できます。 これは、私たちの仕事に役立つ属性を見つけるのに役立ちます。 ログオン情報を見つけたいので、Logonという単語を含む属性を検索しましょう。

PowerShellにすべてのプロパティを取得するように指示したら、プロパティのリストをword Logonに一致するプロパティのみを表示するように制限できれば役 Select-Objectは、ワイルドカードの一致を行い、結果を制限する機能を提供します。 /文字(”パイプ”と呼ばれる)は、左側の結果を取得し、それらをSelect-Objectに渡します。 Select-Objectは、ワイルドカードの照合を実行し、ワイルドカードの基準に基づいて結果を制限します。

Get-ADUser username -Properties * | Select-Object *logon*
BadLogonCount : 0
lastLogon : 132181280348543735
LastLogonDate : 11/11/2019 9:08:45 PM
lastLogonTimestamp : 132179981259860013
logonCount : 328
LogonWorkstations :
MNSLogonAccount : False
SmartcardLogonRequired : False

結果は、Active Directoryのドメインの機能レベルに基づいて少し異なります。 私の検索は8つの属性を返します。 Lastlogon、LastLogonDateとLastLogonTimeStamp:三つは有望に見えます。 Active Directoryが特定の属性に日付/時刻情報を格納する方法に慣れていない場合、値の一部が少し奇妙に見えることがあります。 一部の日付情報は従来の日時情報であり、一部は”ティック”として保存されます。”

PowerShellおよび.NET Frameworkの日付と時刻の値は、12:00AM January1,0001以降のティック数として日付を表します。 ティックは、ミリ秒あたり10,000ティックがあることを意味し、秒の1000万分の1に等しいです。 目盛りを標準の日付形式に変換できる数学コマンドレットがあります。

PowerShellには、日付/時刻を表す実際の目盛りが表示されます。 目盛りを日付形式に変換したい場合は、Active Directory User and ComputersまたはActive Directory Administrative Centerでこれらのフィールドを確認できます。 両方のアプリでは、目盛りは時刻と日付の形式で表されます。

ADUser-Logon-Propertes

ADUser-Logon-Properties

ログオン属性の説明

検索では、日付/時刻ログオン情報を表示する複数のプロパティが見つかりました。 二つのプロパティは同じ日付と時刻を持ち、一つはそうではありません。 ここで何が起こってるの?

日時情報の分散は設計上のものであり、すべてのログオン情報を同期させようとするレプリケーショントラフィックによってDCが押しつぶさ Lastlogonプロパティは認証するたびに更新されますが、データは認証されたDCに保存され、他のDCには複製されません。lastlogontimestampプロパティとLastLogonDateプロパティはすべてのDCに複製されますが、レプリケーションはまれにしか発生しません。

日付を見ると、遅延レプリケーションがクエリにどのように影響するかがわかります。 この例では、LastLogonTimeStampは実際には2日遅れていることに注意してください。 ユーザーが対話的にログインしたり、ネットワークファイル共有にアクセスしたり、ネットワークがアカウントを認証する必要があるその他の活動を実 誰かがネットワーク上の何かに触れるたびにdcがそのデータを複製した場合、DCは大規模な環境で圧倒される可能性があります。 その結果、一部のログオン情報は正確ですが複製されず、一部のログオン情報は複製されますが、まれにしか複製されません。

私たちの要件のために、正確なログオンタイムスタンプは必要ありません。 長い時間(90日を超える)でログオンしていないアカウントのみを検索する必要があります。 日付が数日オフの場合でも、任意の値が便利です。 私のログオン日を例として使用する場合、クエリされる時間は、使用する値に応じて11/11または11/13になります。 三ヶ月早送りし、私は再びログオンしたことがないと仮定します。 ある日付は90日以上は非アクティブとしてフラグが立てられ、あるフィールドは非アクティブとしてフラグが立てられません。 しかし、このプロセスを毎月実行するように設定した場合、次回チェックするときにアカウントを取得します。 それが重要な部分です。 これを定期的に行うと、一貫してチェックする限り、いずれかのフィールドを使用できます。

私は二つの理由のためにLastLogonDateプロパティを使用しました。 まず、それはすでに日付値なので、値の変換に対処する必要はありません。 第二に、それは複製された価値であり、それは私の人生を楽にします。 私がLastLogonを使用した場合、私のネットワーク内の他のドメインコントローラに対して認証している人にとっては最新の日付ではない日付があります。 最新のタイムスタンプを取得するには、各ユーザーのローカルDCを照会する必要がありますが、これは多くの作業であり、あまり効率的ではありません。

単一のアカウントの情報を取得するには、コードは簡単です。

get-aduser Michael_Kanakos -properties LastLogonDate | Select-Object Name, LastLogonDate
Name LastLogonDate
---- -------------
mkanakos 11/11/2019 9:08:45 PM

すべてのユーザーに対してこれを行うには、もう少しコードが必要です。 すべてのユーザーアカウントを照会するには、フィルターを使用する必要があります。

Get-ADUser -filter * -properties LastLogonDate | Select-Object Name, LastLogonDate

ここでは、ログオン日が90日より古いアカウントのみを検索しましょう。 比較演算子として使用するには、現在の日付を保存する必要があります。

$date = (get-date).AddDays(-90)
Get-ADUser -Filter {LastLogonDate -lt $date} -properties LastLogonDate | Select-Object Name, LastLogonDate

このコードは、90日以上ログインしていないすべてのユーザーを取得します。 90日前の日付を変数に保存します。 広告フィルタを作成して、その日付よりも少ないログオンを見つけることができます。 次に、アクティブなアカウントのみを照会する要件を追加する必要があります。 この例では、構文が非常に長いため、コードを読みやすくするためにsplattingを使用しています。 SPLATTING ADコマンドレットは難しい場合があるため、splattingの例の下にある構文の長い形式のバージョンも示しました。

$date = (get-date).AddDays(-90)
$paramhash = @{
Filter = "LastLogonDate -lt $date -and Enabled -eq $true"
Properties = 'LastLogonDate'
}
$SelectProps = 'Name','LastLogonDate','Enabled','DistinguishedName'
$InactiveUsers = Get-Aduser @paramhash | Select-Object $SelectProps
$InactiveUsers = Get-ADUser -Filter {LastLogonDate -lt $date -and Enabled -eq $true} -properties LastLogonDate, DistinguishedName | Select-Object Name, LastLogonDate, Enabled, DistinguishedName

これにより、有効になっている非アクティブなユーザーが表示されます。 結果を変数に保存して再利用します。 DistinguishedNameプロパティは、後で必要になります。 ユーザーを見つけたら、次のステップであるアカウントの無効化に取り組むことができます。 Adユーザーアカウントを変更するには、Set-ADUserコマンドレットを使用します。

$Today = Get-Date
$DisabledUsers = (
$InactiveUsers | Foreach-object {
Set-User $_.DistinguishedName -Enabled $false -Description "Acct disabled on $Today via Inactive Users script"}
)

ユーザーアカウントを無効にしました。 それは新しいOUにそれらを移動する時間です。 この例では、Disabled-Usersという名前のOUを使用します。 このOUの識別名は”Ou=Disabled-Users,DC=Contoso,DC=Com”ですMove-ADObjectコマンドレットを使用して、ユーザーをターゲットOUに移動します。最後のステップでは、Move-ADObjectを使用してユーザーを新しいOUに移動しました。 これで、信頼性の高い反復可能な自動化タスクを作成するために必要なコアコードが得られました。 だから次は何ですか? それはあなたの個々の要件に依存します。 このコードは、毎月同時に自動的に実行されるように設定することができ、設定する必要があります。 これを行う簡単な方法の1つは、コードを月単位で実行するスケジュールされたジョブを作成することです。

このコードには、より良いものにするために追加できるものがあります。 エラーチェックと追加のユーザー情報フィールドのコードは、二つの有用な追加です。 これらのタイプのタスクを実行しているほとんどのチームは、誰かがレビューするために無効になったもののレポートを生成するので、追加のフィー レポートをより便利にするために、Active Directoryのより多くのフィールドを含めることができます。 6ヶ月後に無効になったユーザーを削除する別のタスクを作成することで、このタスクをさらに一歩進めることができます。

タスクが管理可能な部分に分割されている場合、困難な自動化要求を解決する方がはるかに簡単です。 別の変数を追加しようとする前に、各ステップが機能することを確認します。 これにより、私たちはこのタスクを理解しやすくし、うまくいけば素晴らしい学習体験をしました。

Leave a Reply

メールアドレスが公開されることはありません。