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

Active directory 使用C检索特定的Active Directory记录属性#,active-directory,Active Directory,我被要求设置一个进程来监视active directory,特别是某些帐户,以检查它们是否未被锁定,以便在发生这种情况时,支持团队可以得到早期警告 我发现了一些代码,可以帮助我开始创建请求,并将它们添加到通知队列中。然后将此事件指定给更改事件,并向其传递ObjectChangedEventArgs对象 目前,它遍历属性并将其写入文本文件,如下所示: private static void NotifierObjectChanged(object sender,

我被要求设置一个进程来监视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);
                }
            }
        }
    }
我希望检查对象,如果特定字段(如name)是特定值,则检查IsAccountLocked属性是否为True,否则跳过记录并等待下一个通知。我正在努力学习如何访问ResultEntry的特定属性,而不必遍历它们

我希望这是有意义的-请询问我是否可以提供任何其他信息

谢谢

Martin

这可能会非常棘手,具体取决于您的具体业务需求。如果您想更详细地交谈,请在脱机状态下与我联系,我很乐意通过电子邮件/电话/即时通讯提供帮助

因此,我要注意的第一件事是,根据在此之前查询的外观,这可能非常昂贵或容易出错(即缺少结果)。这让我有些担心,因为大多数示例代码都会出错。:)你是如何得到已经改变的东西的?虽然这听起来很简单,但考虑到AD支持的语义以及它是一个多主机系统,到处都有写操作(并在事后进行复制),这在directory land中实际上是一个有点棘手的问题。 其他变量可能是,您运行此操作的频率,AD中的数据集可能有多大,等等。 AD已经构建了一些API来帮助您(脑海中出现的一个大API叫做DirSync),但是如果您以前没有使用过它,这可能会有点复杂。这就是“ping me offline”部分的用武之地

对于您的确切问题,我假设您的结果实际上是SearchResultEntry(如果不是,我可以修改,告诉我您手头有什么)。如果是这样的话,你会发现一个属性字段挂在那个家伙身上,从那里有属性名和值。我想如果你手头有价值观,你会看到它是如何运作的,例如:

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 ...
    }
}

正如我所说,如果您手头有SearchResulty以外的内容,请告诉我们,我可以修改代码示例。

谢谢Eric,这非常有帮助。好的,现在这个查询有一个子树范围,我可以给你提供一个示例查询,但是它当前返回任何用户ID的所有字符串属性,这些用户ID已经应用了更改,比如他们已经登录、注销、更改了密码等等。所以我不想要的是那个人的所有数据,但要检查此人是否是服务帐户列表中的一员,如果是,则检查以确保该帐户未被锁定。可以向支持团队发送警报,以便在有人可用时立即解锁。我非常感谢您提供的任何帮助,因为尽管我对AD有模糊的理解,但听起来您比我知道的要多得多!:)MartinFYI通知人收到的查询是:OU=Associates,OU=User Accounts,OU=XXX,OU=Migration,DC=AAA,DC=BBB,DC=ccc如果我们超出合理范围,请随时给我发电子邮件。因此,要限制属性,您只需要从请求*属性集切换到您想要的确切属性。这就是说,在确定账户是否被锁定方面有很多细微差别。帐户进入各种状态,身份验证可能会开始失败。为了让生活更轻松,Microsoft为您提供了一个构造属性(),使生活更轻松。寻找锁定位。谢谢@Eric。我相信这个链接会很有帮助,但是是的,我想当我无法理解的时候,我可能会求助于电子邮件…:)