0

Active Directory、特に特定のアカウントを監視するプロセスをセットアップして、ロックされていないことを確認するように依頼されました。これにより、サポート チームは早期に警告を受けることができます。

基本的にリクエストを設定して通知キューに追加するコードをいくつか見つけました。次に、このイベントは変更イベントに割り当てられ、ObjectChangedEventArgs オブジェクトが渡されます。

現在、次のように、属性を反復処理してテキスト ファイルに書き込みます。

private static void NotifierObjectChanged(object sender, 
                                              ObjectChangedEventArgs e)
    {
        if (e.ResultEntry.Attributes.AttributeNames == null)
        {
            return;
        }

        // write the data for the user to a text file...
        using (var file = new StreamWriter(@"C:\Temp\UserDataLog.txt", true))
        {
            file.WriteLine("{0} {1}", DateTime.UtcNow.ToShortDateString(), DateTime.UtcNow.ToShortTimeString());
            foreach (string attrib in e.ResultEntry.Attributes.AttributeNames)
            {
                foreach (object item in e.ResultEntry.Attributes[attrib].GetValues(typeof(string)))
                {
                    file.WriteLine("{0}: {1}", attrib, item);
                }
            }
        }
    }

オブジェクトをチェックして、名前などの特定のフィールドが特定の値であるかどうかを確認し、IsAccountLocked 属性が True であるかどうかを確認し、それ以外の場合はレコードをスキップして、次の通知が来るまで待ちます。 ResultEntry の特定の属性にアクセスする方法に苦労しています。それらすべてを反復処理する必要はありません。

これが理にかなっているといいのですが、追加情報を提供できるかどうか尋ねてください。

ありがとう
マーティン

4

1 に答える 1

0

これは、正確なビジネス要件によっては厄介になる可能性があります。オフラインで私にpingを送信して、より詳細に話したい場合は、電子メール/電話/IMでサポートさせていただきます。

したがって、最初に注意するのは、この前のクエリの外観によっては、これは非常にコストがかかるか、エラーが発生しやすい(つまり、結果が欠落している)可能性があるということです。そこにあるほとんどのサンプルコードがこれを間違えるので、これは私を幾分心配します。:)どのように変化したものを手に入れていますか?これは単純に聞こえますが、ADでサポートされているセマンティクスと、書き込みがあらゆる場所で行われる(そして事後に複製される)マルチマスターシステムであるという事実を考えると、これは実際にはディレクトリランドではやや難しい質問です。他の変数は、これを実行する頻度、ADでのデータセットの大きさなどです。ADにはここで役立つAPIがいくつか構築されています(頭に浮かぶ大きなAPIはDirSyncと呼ばれます)が、これまで使用したことがない場合、これはやや複雑になる可能性があります。これは、「

あなたの正確な質問に対して、私はあなたの結果が実際にはSearchResultEntryであると仮定しています(私が修正できない場合は、あなたが手にしているものを教えてください)。その場合は、その人からぶら下がっている属性フィールドがあり、そこからAttributeNamesとValuesがあります。たとえば、Valuesが手元にある場合は、そこからどのように機能するかがわかると思います。

foreach (var attr in sre.Attributes.Values)
{
    var da = (DirectoryAttribute)attr;
    Console.WriteLine(da.Name);
    foreach (var val in da.GetValues(typeof(byte[])))
    {
        // Handle a byte[] val ...
    }
}

先ほど申し上げましたように、SearchResultEntry以外のものをお持ちの場合は、お知らせください。コードサンプルを修正できます。

于 2012-08-31T20:42:49.060 に答える