0

環境内のすべての 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.

4

1 に答える 1

0

答えが見つかりました!:-)

C# コードを変更して、想定される最終ログオン データのファイル時刻を返すようにしました。また、詳細な ps スクリプトを実行して、ユーザーのすべての変数を一覧表示し、C# によって返された関連プロパティを見つけられるようにしました。

PSスクリプトは次のとおりです。

Get-ADUser TestUser | Get-ADObject -Properties *

この行は、特定のユーザーに関して AD に格納されているすべてのプロパティを返します。とりわけ、私が気にかけている値は 2 つあります。

lastLogonlastLogonTimestamp

この後、c# によって返されたlastlogonプロパティの filetime バージョンを確認したところ、この値は実際にはlastLogonTimestampと同じであり、正確なlastlogonデータを要求する方法がない (または見つからなかった) ことがわかりました。

適切な解決策は、API 呼び出しの代わりに LDAP クエリで動作するコードを再設計することです。そのための小さな助けがここにあります

于 2015-07-13T06:50:34.050 に答える