0

我被要求设置一个监控活动目录的进程,特别是某些帐户,以检查它们是否没有被锁定,这样如果发生这种情况,支持团队可以得到早期警告。

我找到了一些让我开始的代码,它基本上设置了请求并将它们添加到通知队列中。然后将此事件分配给一个更改事件,并将一个 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

根据您的确切业务需求,这可能会变得很棘手。如果您想更详细地交谈,请离线联系我,我很乐意通过电子邮件/电话/IM 提供帮助。

所以我要注意的第一件事是,根据查询之前的样子,这可能非常昂贵或容易出错(即丢失结果)。这让我有些担心,因为那里的大多数示例代码都会出错。:) 你如何得到改变的东西?虽然这听起来很简单,但在目录领域这实际上是一个有点棘手的问题,因为 AD 支持的语义以及它是一个多主系统的事实,其中写入发生在所有地方(并在事后复制)。其他变量可能是您运行此程序的频率、AD 中数据集的大小等。AD 有一些 API 可以帮助您(想到的大 API 称为 DirSync),但如果您以前没有使用过它,这可能会有些复杂。这就是“

对于您的确切问题,我假设您的结果实际上是 SearchResultEntry (如果不是我可以修改,请告诉我您手头有什么)。如果是这种情况,那么你会发现那个人身上挂着一个属性字段,从那里有 AttributeNames 和 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 回答