// Constructor public PSearchEventSource( LdapConnection conn, string searchBase, int scope, string filter, string[] attrs, bool typesOnly, LdapSearchConstraints constraints, LdapEventType eventchangetype, bool changeonly) { // validate the input arguments if (conn == null || searchBase == null || filter == null || attrs == null) { throw new ArgumentException("Null argument specified"); } _mConnection = conn; _mSearchBase = searchBase; _mScope = scope; _mFilter = filter; _mAttrs = attrs; _mTypesOnly = typesOnly; _mEventChangeType = eventchangetype; // make things ready for starting a search operation if (constraints == null) { _mSearchConstraints = new LdapSearchConstraints(); } else { _mSearchConstraints = constraints; } // Create the persistent search control var psCtrl = new LdapPersistSearchControl( (int)eventchangetype, // any change changeonly, // only get changes true, // return entry change controls true); // control is critcal // add the persistent search control to the search constraints _mSearchConstraints.SetControls(psCtrl); } // end of Constructor
static void Main(string[] args) { if (args.Length != 5) { Console.WriteLine("Usage: mono SearchPersist <host name> <ldap port> <login dn>" + " <password> <search base>"); Console.WriteLine("Example: mono SearchPersist Acme.com 389" + " \"cn=admin,o=Acme\"" + " secret \"ou=sales,o=Acme\""); return; } int ldapVersion = LdapConnection.Ldap_V3; String ldapHost = args[0]; int ldapPort = Convert.ToInt32(args[1]);; String loginDN = args[2]; String password = args[3]; String searchBase = args[4]; LdapSearchQueue queue = null; LdapSearchConstraints constraints; LdapPersistSearchControl psCtrl; LdapConnection lc = new LdapConnection(); constraints = new LdapSearchConstraints(); try { // connect to the server lc.Connect(ldapHost, ldapPort); // authenticate to the server lc.Bind(ldapVersion, loginDN, password); //Create the persistent search control psCtrl = new LdapPersistSearchControl( LdapPersistSearchControl.ANY, // any change true, //only get changes true, //return entry change controls true); //control is critcal // add the persistent search control to the search constraints constraints.setControls(psCtrl); // perform the search with no attributes returned String[] noAttrs = { LdapConnection.NO_ATTRS }; queue = lc.Search( searchBase, // container to search LdapConnection.SCOPE_SUB, // search container's subtree "(objectClass=*)", // search filter, all objects noAttrs, // don't return attributes false, // return attrs and values, ignored null, // use default search queue constraints); // use default search constraints } catch (LdapException e) { Console.WriteLine("Error: " + e.ToString()); try { lc.Disconnect(); } catch (LdapException e2) { } Environment.Exit(1); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); return; } Console.WriteLine("Monitoring the events for {0} minutes..", TIME_OUT_IN_MINUTES); Console.WriteLine(); //Set the timeout value timeOut = DateTime.Now.AddMinutes(TIME_OUT_IN_MINUTES); try { //Monitor till the timeout happens while (DateTime.Now.CompareTo(timeOut) < 0) { if (!checkForAChange(queue)) { break; } System.Threading.Thread.Sleep(10); } } catch (System.IO.IOException e) { System.Console.Out.WriteLine(e.Message); } catch (System.Threading.ThreadInterruptedException e) { } //Disconnect from the server before exiting try { lc.Abandon(queue); //abandon the search lc.Disconnect(); } catch (LdapException e) { Console.Out.WriteLine(); Console.Out.WriteLine("Error: " + e.ToString()); } Environment.Exit(0); }