예제 #1
0
        /// <summary>
        /// Asynchronous callback that processes changes from Active Directory.
        /// </summary>
        /// <param name="asyncResult">Result of permanens search</param>
        private void RunAsyncSearch(IAsyncResult asyncResult)
        {
            var results = new List <SearchResultEntry>();

            // Get changes
            if (!asyncResult.IsCompleted)
            {
                PartialResultsCollection partialResults = null;

                try
                {
                    partialResults = Connection.GetPartialResults(asyncResult);
                }
                catch (Exception e)
                {
                    LogError("Retrieving partial results from Active Directory asynchronous search failed.", e);
                }

                if (partialResults != null)
                {
                    // Add only users and groups
                    results.AddRange(partialResults.OfType <SearchResultEntry>().Where(p => LdapHelper.IsUser(p, PersonObjectCategory) || LdapHelper.IsGroup(p, GroupObjectCategory)));
                }
            }
            else
            {
                LogMessage("The change notification control unexpectedly ended the search.");

                mSearches.Remove(asyncResult);
                StartIncrementalSynchronization();
            }

            // Send changes to CMS
            Dispatcher.AddToQueue(results);
        }
예제 #2
0
        static void NotificationSearchCallback(IAsyncResult asyncRes)
        {
            asyncCallbackFinished = false;

            Console.WriteLine("AsyncCallback invoked.");

            Console.WriteLine("IAsyncResult.IsCompleted:" + asyncRes.IsCompleted);

            Console.WriteLine("Retrieving partial results.");
            PartialResultsCollection partialResults =
                ldapConnection.GetPartialResults(asyncRes);

            int count = 0;

            foreach (object obj in partialResults)
            {
                count++;
                if (obj is SearchResultEntry)
                {
                    SearchResultEntry entry = (SearchResultEntry)obj;
                    Console.WriteLine(entry.DistinguishedName +
                                      ": Description:" + entry.Attributes["description"][0]);
                }
                else if (obj is SearchResultReference)
                {
                    SearchResultReference reference = (SearchResultReference)obj;
                    Console.WriteLine("SearchResultReference:");
                    foreach (Uri uri in reference.Reference)
                    {
                        Console.WriteLine(uri);
                    }
                }
            }
            asyncCallbackFinished = true;
        }
        private void Notify(IAsyncResult result)
        {
            PartialResultsCollection prc = _connection.GetPartialResults(result);

            foreach (SearchResultEntry entry in prc)
            {
                OnObjectChanged(new ObjectChangedEventArgs(entry));
            }
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        private void InternalCallback(IAsyncResult result)
        {
            this.mutex.WaitOne();

            Console.WriteLine(
                "Callback on thread #{0}",
                Thread.CurrentThread.ManagedThreadId
                );

            if (!result.IsCompleted)
            {
                PartialResultsCollection prc =
                    this.connect.GetPartialResults(result);

                for (int i = 0; i < prc.Count; i++)
                {
                    SearchResultEntry entry = prc[i]
                                              as SearchResultEntry;

                    if (entry != null)
                    {
                        Console.WriteLine(
                            "Partial Result: {0}",
                            entry.DistinguishedName
                            );
                    }
                }
            }
            else
            {
                SearchResponse response =
                    this.connect.EndSendRequest(result)
                    as SearchResponse;

                foreach (SearchResultEntry entry
                         in response.Entries)
                {
                    Console.WriteLine(entry.DistinguishedName);
                }
            }
            this.mutex.ReleaseMutex();
        }
예제 #6
0
        private static void RunAsyncSearch(IAsyncResult asyncResult)
        {
            ASyncOperationState state = (ASyncOperationState)asyncResult.AsyncState;

            try
            {
                if (!asyncResult.IsCompleted)
                {
                    PartialResultsCollection partialResult = null;
                    partialResult = state.Connection.GetPartialResults(asyncResult);

                    if (partialResult != null)
                    {
                        for (int i = 0; i < partialResult.Count; i++)
                        {
                            if (partialResult[i] is SearchResultEntry)
                            {
                                Assert.True(((SearchResultEntry)partialResult[i]).DistinguishedName.Contains("Group9"));
                            }
                        }
                    }
                }
                else
                {
                    SearchResponse response = (SearchResponse)state.Connection.EndSendRequest(asyncResult);

                    if (response != null)
                    {
                        foreach (SearchResultEntry entry in response.Entries)
                        {
                            Assert.True(entry.DistinguishedName.Contains("Group9"));
                        }
                    }
                }
            }
            catch (Exception e)
            {
                state.Exception = e;
            }
        }
예제 #7
0
        private void PagedAsyncQueryCallBackPartial(IAsyncResult Result)
        {
            PartialResultsCollection pResults = null;

            SearchResultEntry[] temp = new SearchResultEntry[0];

            if (!Result.IsCompleted)
            {
                pResults = base.Connection.GetPartialResults(Result);

                if (pResults != null)
                {
                    temp = new SearchResultEntry[pResults.Count];

                    pResults.CopyTo(temp, 0);
                }
            }
            else
            {
                SearchResponse sresponse = null;

                try
                {
                    sresponse = (SearchResponse)base.AsyncConnection.EndSendRequest(Result);
                }

                catch (DirectoryOperationException direx)
                {
                    if (direx.Response != null)
                    {
                        if (direx.Response.ResultCode == ResultCode.SizeLimitExceeded)
                        {
                            if (ForestBase.CurrentRequestExtender.QueryInfo.AutoPage)
                            {
                                GlobalEventHandler.RaiseErrorOccured(String.Format("Non-PagedQuery: {0} - switched to PagedQuery", direx.Response.ResultCode.ToString()));

                                ForestBase.CurrentRequestExtender.AddMessage(String.Format("Non-PagedQuery: {0} - switched to PagedQuery", direx.Response.ResultCode.ToString()));

                                ForestBase.CurrentRequestExtender.PageCookie(((SearchResponse)direx.Response).Entries.Count);

                                ForestBase.CurrentRequestExtender.MoreData = true;

                                PagedAsyncQuery();
                            }
                        }
                    }
                }

                catch (Exception ex)
                { string x = ex.Message; }

                temp = new SearchResultEntry[sresponse.Entries.Count];

                sresponse.Entries.CopyTo(temp, 0);

                if (ForestBase.CurrentRequestExtender.RetreiveStatistics)
                {
                    DirectoryControl dcStats = GetControl(sresponse.Controls, SearchRequestExtender.STATISTCS_CONTROL_OID);

                    if (dcStats != null)
                    {
                        ForestBase.CurrentRequestExtender.Statistics.Add(new StatsData(dcStats.GetValue()));
                    }

                    else
                    {
                        GlobalEventHandler.RaiseErrorOccured("WARNING: No Query Statistics data returned");
                    }
                }

                DirectoryControl pageRespControl = GetControl(sresponse.Controls, ForestBase.CurrentRequestExtender.PageControl.Type);

                ForestBase.CurrentRequestExtender.UpdatePagingCookie(pageRespControl, sresponse.Entries.Count);


                base.AsyncCalls--;
                base.ParallelRuns--;
            }

            GlobalEventHandler.RaiseAsyncPartialResult(temp.ToList(), !ForestBase.CurrentRequestExtender.MoreData);

            if (!CancelToken)
            {
                if (ForestBase.CurrentRequestExtender.MoreData)
                {
                    PagedAsyncQuery();
                }

                else if (base.ParallelRuns < 1)
                {
                    GlobalEventHandler.RaiseParallelQueriesCompleted();
                }
            }

            else
            {
                GlobalEventHandler.RaiseParallelQueriesCompleted();
            }
        }
예제 #8
0
        private void Notify(IAsyncResult result)
        {
            lock (this.lockObject)
            {
                try
                {
                    if (this.stopped)
                    {
                        this.connection?.EndSendRequest(result);
                        return;
                    }

                    PartialResultsCollection resultsCollection = this.connection?.GetPartialResults(result);

                    if (resultsCollection == null)
                    {
                        this.Trace("Results collection was empty");
                        return;
                    }

                    if (DateTime.Now < this.nextTriggerAfter)
                    {
                        //this.Trace("Discarding change because next trigger time has not been reached");
                        return;
                    }

                    DateTime lastLogonOldestDate = DateTime.UtcNow.Subtract(this.LastLogonTimestampOffset);

                    foreach (SearchResultEntry r in resultsCollection.OfType <SearchResultEntry>())
                    {
                        if (r.Attributes == null || !r.Attributes.Contains(ActiveDirectoryChangeTrigger.ObjectClassAttribute))
                        {
                            this.Trace($"Skipping entry {r.DistinguishedName} because the object class list was empty");
                            continue;
                        }

                        IList <string> objectClasses = r.Attributes[ActiveDirectoryChangeTrigger.ObjectClassAttribute].GetValues(typeof(string)).OfType <string>().ToList();

                        if (!this.ObjectClasses.Intersect(objectClasses, StringComparer.OrdinalIgnoreCase).Any())
                        {
                            continue;
                        }

                        if (objectClasses.Contains("computer", StringComparer.OrdinalIgnoreCase) && !this.ObjectClasses.Contains("computer", StringComparer.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        bool dateTooSoon = false;

                        foreach (string timestampAttribute in ActiveDirectoryChangeTrigger.TimeStampAttributesToIgnore)
                        {
                            if (r.Attributes.Contains(timestampAttribute))
                            {
                                string   ts    = r.Attributes[timestampAttribute][0] as string;
                                DateTime date1 = DateTime.FromFileTimeUtc(Convert.ToInt64(ts));

                                if (date1 > lastLogonOldestDate)
                                {
                                    dateTooSoon = true;
                                    break;
                                }
                            }
                        }

                        if (dateTooSoon)
                        {
                            continue;
                        }

                        this.Log($"Change detected on {r.DistinguishedName}");

                        this.Fire();
                    }
                }
                catch (LdapException ex)
                {
                    if (ex.ErrorCode == 85)
                    {
                        this.SetupListener();
                    }
                    else
                    {
                        this.LogError("The AD change listener encountered an unexpected error", ex);

                        if (MessageSender.CanSendMail())
                        {
                            string messageContent = MessageBuilder.GetMessageBody(this.ManagementAgentName, this.Type, this.Description, DateTime.Now, false, ex);
                            MessageSender.SendMessage($"{this.ManagementAgentName}: {this.Type} trigger error", messageContent);
                            Thread.Sleep(1000);
                        }
                    }
                }
                catch (Exception ex)
                {
                    this.LogError("The AD change listener encountered an unexpected error", ex);

                    if (MessageSender.CanSendMail())
                    {
                        string messageContent = MessageBuilder.GetMessageBody(this.ManagementAgentName, this.Type, this.Description, DateTime.Now, false, ex);
                        MessageSender.SendMessage($"{this.ManagementAgentName}: {this.Type} trigger error", messageContent);
                        Thread.Sleep(1000);
                    }
                }
            }
        }