private static string BuildStagingErrorDetails(StepDetails d) { if (d.MADiscoveryErrors.Count == 0) { return(null); } IEnumerable <MAObjectError> errors; int remainingErrors = 0; if (Program.ActiveConfig.Settings.MailMaxErrors <= 0 || d.MADiscoveryErrors.Count <= Program.ActiveConfig.Settings.MailMaxErrors) { errors = d.MADiscoveryErrors; } else { errors = d.MADiscoveryErrors.Take(Program.ActiveConfig.Settings.MailMaxErrors); remainingErrors = d.MADiscoveryErrors.Count - Program.ActiveConfig.Settings.MailMaxErrors; } StringBuilder errorsBuilder = new StringBuilder(); errorsBuilder.AppendLine("<h3>Staging errors</h3>"); foreach (MAObjectError error in errors) { StringBuilder errorBuilder = new StringBuilder(); errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "DN", error.DN); errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Error type", error.ErrorType); if (error.CDError != null) { errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Error code", error.CDError.ErrorCode); errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Error literal", error.CDError.ErrorLiteral); errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Server error detail", error.CDError.ServerErrorDetail); if (error.CDError.Value != null) { errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Value", string.Join(", ", error.CDError.Value)); } } if (error.LineNumber > 0) { errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Line number", error.LineNumber); } if (error.ColumnNumber > 0) { errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Column number", error.ColumnNumber); } if (error.AttributeName != null) { errorBuilder.AppendFormat(MessageBuilder.SimpleRow, "Attribute name", error.AttributeName); } errorsBuilder.AppendLine(string.Format(MessageBuilder.GetTemplate("ErrorTableFragment"), errorBuilder)); errorsBuilder.AppendLine("<br/>"); } if (remainingErrors > 0) { errorsBuilder.Append($"There are {remainingErrors} more errors that are not shown in this report<br/>"); } return(errorsBuilder.ToString()); }
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); } } } }