我被要求设置一个监控活动目录的进程,特别是某些帐户,以检查它们是否未锁定,以便在发生这种情况时,支持团队可以获得预警。
我找到了一些代码来启动,它基本上设置了请求并将它们添加到通知队列中。然后将此事件分配给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的特定属性而不必遍历它们。
我希望这是有道理的 - 请问我是否可以提供任何其他信息。
感谢
马丁
答案 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 ...
}
}
正如我所说,如果您手头有其他东西,请告诉我们,我可以修改代码示例。