这个链接 http://msdn.microsoft.com/en-us/library/aa772153(VS。85).aspx 说:

你可以登记最多的五个通知要求上的一个单一的LDAP连接。你必须有一个专用线,等待通知和进程。当你打电话的ldap_search_ext功能登记一个通知请求,功能返回的消息标识,标识,请求。然后,使用ldap_result功能要等待更改通知。发生变化时,在服务器发送你LDAP消息,其中包含的信息的识别符的通知要求生成的通知。这导致ldap_result功能返回与搜索结果中确定的对象,改变。

我找不到类似的行为寻找通过。净文件。如果有人知道如何做到这一点在C#我会很感激知道。我想看看当属性的变化对所有用户的系统所以我可以执行定义的行动取决于什么改变。

我已经看过计算器和其他来源没有运气。

谢谢。

有帮助吗?

解决方案

我不知道它做什么你需要的,但是看一看 http://dunnry.com/blog/ImplementingChangeNotificationsInNET.aspx

编辑:添加的文字和代码,从文章:



有三个办法搞清楚的事情已经改变,在主动目录(或ADAM)。这些已经记录了一段时间在MSDN在恰如其分地题为"概况的变化跟踪技术".在摘要:

  1. 投票的变化使用uSNChanged.这种技术检查'highestCommittedUSN价值的启动和随后执行搜索'uSNChanged'值较高的后。该'uSNChanged'属性之间不复制领域控制器,所以你必须回到同一领域控制器,每次对一致性。实际上,执行搜索寻找最高'uSNChanged价值+1然后阅读的结果跟踪他们你希望的任何方式。
    • 好处
      • 这是最兼容的方式。所有的语言和所有版本。净支持这种方式,因为它是一个简单的搜索。
    • 缺点
      • 有很多在这里为开发商照顾。你让整个对象回来了,你必须确定什么改变了的对象(并且如果你关心的是改变)。
      • 处理删除的对象是一个痛苦。
      • 这是一个投票的技术,所以它只是作为实时你如何经常查询。这可能是一个良好的事情取决于应用程序。注意,中间值不会跟踪这里。
  2. 投票的变化使用目录同步控制.这种技术使用的ADS_SEARCHPREF_DIRSYNC选择在堆和LDAP_SERVER_DIRSYNC_OID控制下的涵盖。只是做一个初步的搜索、储存cookie,然后再次搜索并发送的cookie。它将只返回的对象已经改变。
    • 好处
      • 这是一个简单的模式可循。这两个系统。DirectoryServices和系统。DirectoryServices.协议支持这一选择。
      • 筛选可以减少什么你要打扰。作为一个例子,如果我的初步搜索所有的用户"(objectClass=户)",我可以随后的过滤器上的投票与"(sn=邓)"只有得到两者的组合筛选,而不是具有处理一切从头文字滤波器。
      • Windows2003+选项中删除的行政限制使用这个备选办法(对象的安全)。
      • Windows2003+选择也将给予你的能力只返回的增值更改在大多值的属性。这真是个不错的功能。
      • 交易以及与已删除的对象。
    • 缺点
      • 这是。网2.0+或后来唯一的选择。用户。净1.1将需要使用uSNChanged跟踪。脚本语言不能使用这种方法。
      • 你只能范围搜索到一个分区。如果你想的轨道的唯一特定组织单位或对象,也必须理清这些结果自己以后。
      • 使用这与非Windows2003模式域设有的限制,必须具有复制得到改变的权限(默认只有管理)使用。
      • 这是一个投票的技术。它不轨道的中间值。因此,如果一个象你想要跟踪变化之间的搜索多个时候,你只会得到最后改变。这可以是一个优势,取决于应用程序。
  3. 改变通知的活动目录.这种技术注册了一个搜索在一个单独的线会接收通知时,任何对象的改变相匹配滤波器。你可以登记最多5通知每异步连接。
    • 好处
      • 即时通知。其他技术需要投票。
      • 因为这是一个通知,您将得到所有的变化,即使中间那些已经失去了另外两个技术。
    • 缺点
      • 相对资源密集型的。你不想做一个整体吨的这些,因为它可能导致可扩展性问题与你的控制器。
      • 这个只告诉你,如果对象已经改变,但是它并没有告诉你什么变化。你需要找出如果属性关心发生了变化,或者不。这就是说,它很容易告诉我们,如果对象已被删除(比uSNChanged投票的至少).
      • 你只能做到这一在不受管理的代码或有系统。DirectoryServices.协议。

大部分,我们发现,目录同步有适合该法案对我来说几乎在每一种情况。我从不介意尝试任何其他技术。然而,读者询问是否有一个方式做的更改通知。网。我想这是可能的使用SDS。P,但从来没有尝试过。事实证明,它是可能的并且实际上不算太难做到的。

我首先想到在编写这是使用 代码样本 现在MSDN(引用从选#3),并简单地转换成这个系统。DirectoryServices.协议。事实证明,这是一个死胡同。你做的方式在SDS。P和方式样的代码工作是不够的,这是没有帮助。这里是解决方案,我想出了:

public class ChangeNotifier : IDisposable
{
    LdapConnection _connection;
    HashSet<IAsyncResult> _results = new HashSet<IAsyncResult>();

    public ChangeNotifier(LdapConnection connection)
    {
        _connection = connection;
        _connection.AutoBind = true;
    }

    public void Register(string dn, SearchScope scope)
    {
        SearchRequest request = new SearchRequest(
            dn, //root the search here
            "(objectClass=*)", //very inclusive
            scope, //any scope works
            null //we are interested in all attributes
            );

        //register our search
        request.Controls.Add(new DirectoryNotificationControl());

        //we will send this async and register our callback
        //note how we would like to have partial results

        IAsyncResult result = _connection.BeginSendRequest(
            request,
            TimeSpan.FromDays(1), //set timeout to a day...
            PartialResultProcessing.ReturnPartialResultsAndNotifyCallback,
            Notify,
            request);

        //store the hash for disposal later

        _results.Add(result);
    }

    private void Notify(IAsyncResult result)
    {
        //since our search is long running, we don't want to use EndSendRequest
        PartialResultsCollection prc = _connection.GetPartialResults(result);

        foreach (SearchResultEntry entry in prc)
        {
            OnObjectChanged(new ObjectChangedEventArgs(entry));
        }
    }

    private void OnObjectChanged(ObjectChangedEventArgs args)
    {
        if (ObjectChanged != null)
        {
            ObjectChanged(this, args);
        }
    }

    public event EventHandler<ObjectChangedEventArgs> ObjectChanged;

    #region IDisposable Members

    public void Dispose()
    {
        foreach (var result in _results)
        {
            //end each async search
            _connection.Abort(result);

       }
    }

    #endregion
}


public class ObjectChangedEventArgs : EventArgs
{
    public ObjectChangedEventArgs(SearchResultEntry entry)
    {
        Result = entry;
    }

    public SearchResultEntry Result { get; set;}
}

这是一个相对较简单的类,可以使用注册搜索。诀窍是使用GetPartialResults方法在回调的方法得到改变,只有发生。我也包括非常简化的定引类我使用的是要通过结果。注意,我没有做任何有关线在这里和我没有任何错误的处理(这只是个样品)。你可以使用此类就像这样:

static void Main(string[] args)
{
    using (LdapConnection connect = CreateConnection("localhost"))
    {
        using (ChangeNotifier notifier = new ChangeNotifier(connect))
        {
            //register some objects for notifications (limit 5)
            notifier.Register("dc=dunnry,dc=net", SearchScope.OneLevel);
            notifier.Register("cn=testuser1,ou=users,dc=dunnry,dc=net", SearchScope.Base);

            notifier.ObjectChanged += new EventHandler<ObjectChangedEventArgs>(notifier_ObjectChanged);

            Console.WriteLine("Waiting for changes...");
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}


static void notifier_ObjectChanged(object sender, ObjectChangedEventArgs e)
{
    Console.WriteLine(e.Result.DistinguishedName);

    foreach (string attrib in e.Result.Attributes.AttributeNames)
    {
        foreach (var item in e.Result.Attributes[attrib].GetValues(typeof(string)))
        {
            Console.WriteLine("\t{0}: {1}", attrib, item);
        }
    }
    Console.WriteLine();
    Console.WriteLine("====================");
    Console.WriteLine();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top