跟踪活动目录中的用户更改

时间:2011-04-04 14:52:15

标签: c# active-directory

我正在编写一个应用程序,需要知道自上次运行应用程序以来用户活动目录对象(例如组成员身份)上是否有任何更改。

我正在查看whenChanged属性,但只有在用户更改密码时才会显示更改。我只需要我可以在配置文件中保存的内容,并在下次运行应用程序时在活动目录中检查该值。

任何人都知道我能可靠使用的任何东西吗?

干杯 卢克

2 个答案:

答案 0 :(得分:1)

您可以随时检查目录的属性是否有上次写入或修改时间,并且可能会保留一些XML或一些跟踪文件上次写入时间的数据。

答案 1 :(得分:1)

鉴于您主要关注群组,我认为您必须创建哈希 - 修改群组成员资格不会影响用户对象。

这是一个我被淘汰的快速例子。

public static string HashGroups(string user)
{
    DirectoryEntry directoryEntry = default(DirectoryEntry);
    DirectorySearcher dirSearcher = default(DirectorySearcher);

    List<string> result = new List<string>();

    directoryEntry = new DirectoryEntry("LDAP://<YOUR_DOMAIN>");
    directoryEntry.RefreshCache();

    // Get search object, specify filter and scope, 
    // perform search. 
    dirSearcher = new DirectorySearcher(directoryEntry);
    dirSearcher.PropertiesToLoad.Add("memberOf");
    dirSearcher.Filter = "(&(sAMAccountName=" + user + "))";

    SearchResult sr = dirSearcher.FindOne();

    // Enumerate groups 
    foreach (string group in sr.Properties["memberOf"])
    {
        result.Add(group);
    }

    // OrderBy is important! Otherwise, your hash might fail because 
    // the groups come back in different order.
    MD5 md5 = MD5.Create();
    Byte[] inputBytes = Encoding.ASCII.GetBytes(result.OrderBy(s1 => s1).SelectMany(s2 => s2).ToArray());
    byte[] hash = md5.ComputeHash(inputBytes);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
        sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
}

以前(垃圾)答案 根据文档,Modify-Time-Stamp属性是“表示上次更改此对象的日期的计算属性”。这听起来像你想要的。它可以在2000年以后的所有版本中使用。

编辑看起来这是从whenChanged计算的,所以如果这对您不起作用,那么这可能不会。