環境内のすべての DC でユーザーの最終ログオン時間を監査できる小さなアプリケーションを作成しています。少しの助けを借りて、すべての DC を反復処理し、ユーザーの最終ログオン時刻を照会するコードを作成することができました。前に読んだように、この値は DC 間で同期されておらず、これは MS の設計によるものです。すべての DC でユーザーをチェックするために使用するコードは次のとおりです。
foreach (string DCInstance in DC_Collection)
{
try
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain,DCInstance))
{
using (UserPrincipal userPrincipal = new UserPrincipal(context))
{
userPrincipal.Name = "TestUserName";
using (PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal))
{
using (PrincipalSearchResult<Principal> results = searcher.FindAll())
{
foreach (UserPrincipal FoundUser in results)
{
Console.WriteLine(FoundUser.SamAccountName + "," + FoundUser.LastLogon + "," + DCInstance);
}
}
}
}
}
}
catch (PrincipalServerDownException PSDE)
{
MessageBox.Show(PSDE.Message + ": " + DCInstance);
}
}
ブラケットの多くが不要であることはわかっていますが、この方法の方が読みやすいです。
これがプログラムの核心です。ただし、見つかったユーザーの最終ログオン時刻は各 DC インスタンスで同じであることがわかりました。この問題を確認するために、同じことを行う小さな PS スクリプトを作成したので、結果を比較できます。PSスクリプトは次のとおりです。
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName -Server $hostname | Get-ADObject -Properties lastLogon
}
繰り返しますが、これは実際の作業を行うスクリプトのコアにすぎません。
しかし、結果はまったく異なります。PS スクリプトの結果は、ほぼすべての DC でかなり異なります (すべてが他の DC と異なるわけではありませんが、ほとんどの DC と異なります)。ただし、.Net プログラムはすべての DC インスタンスから同じ時間を返し、さらに PS スクリプトに表示されない時間を返します。
今、私はかなり混乱しています。私は PS スクリプトが正しいと信じていますが、.Net バージョンで何が欠けていたのか本当にわかりません。
プログラムでデバッグを行いましたが、見つかったユーザーには、プログラムが表示する時間だけが含まれており、PS バージョンとは異なるファイル時間の値さえ含まれています。日時変換の問題についても考えましたが、結果の構造は異なる値で同じでなければなりませんが、そうではありません。
あらゆる種類のヘルプが必要な場合は、事前に Thx.