使用C#检索特定的Active Directory记录属性

时间:2012-08-30 15:21:52

标签: active-directory

我被要求设置一个监控活动目录的进程,特别是某些帐户,以检查它们是否未锁定,以便在发生这种情况时,支持团队可以获得预警。

我找到了一些代码来启动,它基本上设置了请求并将它们添加到通知队列中。然后将此事件分配给change事件,并将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);
                }
            }
        }
    }

我想要检查对象以及特定字段(如name)是否为特定值,然后检查IsAccountLocked属性是否为True,否则跳过记录并等待下一个通知到来in。我正在努力如何访问ResultEntry的特定属性而不必遍历它们。

我希望这是有道理的 - 请问我是否可以提供任何其他信息。

感谢
马丁

1 个答案:

答案 0 :(得分:0)

根据您的确切业务要求,这可能会变得非常粗糙。如果你想更详细地谈谈我离线,我很乐意通过电子邮件/电话/即时通讯提供帮助。

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

对于你的确切问题,我假设你的结果实际上是一个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 ...
    }
}

正如我所说,如果您手头有其他东西,请告诉我们,我可以修改代码示例。