public static void WriteGroupAdminsReport(AlignmentReport report, string basePath, string extension, string separator) { var groupAdminOutput = new StringBuilder(); groupAdminOutput.AppendLine($"GroupID{separator}CreationRightsState{separator}Email"); foreach (var group in report.Groups) { var admins = group.Administrators; if (!(admins is string)) { Console.WriteLine($@"Group:{group.Administrators}"); var convAdmins = (Dictionary <object, object>)admins; foreach (KeyValuePair <object, object> entry in convAdmins) { var key = entry.Key as string; var vals = (List <object>)entry.Value; foreach (var adminEmail in vals) { var email = (string)adminEmail; groupAdminOutput.AppendLine($"{group.Id}{separator}{key}{separator}{email}"); } } } else { groupAdminOutput.AppendLine($"{group.Id},,No Admins"); } } Utilities.WriteFile($@"{basePath}\groupadmins{extension}", groupAdminOutput); }
/// <summary> /// Deserializes the alignment report into useful objects we can work with. /// </summary> /// <param name="path">Path to file containing YAML</param> /// <returns>AlignmentReport containing all data from the YAML</returns> public static AlignmentReport ParseAlignmentReport(string path) { DocumentStart documentStartEvent; var report = new AlignmentReport(); using (var input = new StreamReader(path)) { int iteration = 0; // Manually tracking this to map document to model var parser = new Parser(input); // Consume the stream start event "manually" parser.Consume <StreamStart>(); // Parse each document in the stream while (parser.TryConsume(out documentStartEvent)) { // We expect a message header line document, but actual content in later documents. if (parser.Current.GetType() == typeof(Scalar)) { var deserializer = new DeserializerBuilder().Build(); var scalar = deserializer.Deserialize <string>(parser); Console.WriteLine(scalar); parser.MoveNext(); iteration += 1; continue; } // Handle documents with content switch (iteration) { case 1: report.Groups = ParseGroups(parser); Console.WriteLine($"Groups: {report.Groups.Count}"); break; case 2: report.Users = ParseUsers(parser); Console.WriteLine($"Users: {report.Users.Count}"); break; case 3: report.GroupLevelGuests = ParseGuests(parser); Console.WriteLine($"Group Level Guests: {report.GroupLevelGuests.Count}"); break; default: Console.WriteLine("Unknown document type."); break; } parser.MoveNext(); iteration += 1; } } return(report); }
public static void WriteGroupsReport(AlignmentReport report, string basePath, string extension, string separator) { // GROUPS var groupOutput = new StringBuilder(); groupOutput.AppendLine( $"Id{separator}Name{separator}Type{separator}PrivacySetting{separator}State{separator}MessageCount{separator}LastMessageDate{separator}ConnectedToO365{separator}Memberships.External{separator}Memberships.Internal{separator}Uploads.SharePoint{separator}Uploads.Yammer"); foreach (var group in report.Groups) { Console.WriteLine($"{@group.Id}:{@group.Name}"); groupOutput.AppendLine(@group.GetCsv(separator)); } Utilities.WriteFile($@"{basePath}\groups{extension}", groupOutput); }
private static void WriteGroupsReport(AlignmentReport report, string basePath) { // GROUPS var groupOutput = new StringBuilder(); groupOutput.AppendLine( "Id,Name,Type,PrivacySetting,State,MessageCount,LastMessageDate,ConnectedToO365,Memberships.External,Memberships.Internal,Uploads.SharePoint,Uploads.Yammer"); foreach (var group in report.Groups) { Console.WriteLine($"{@group.Id}:{@group.Name}"); groupOutput.AppendLine(@group.GetCsv()); } Utilities.WriteFile($@"{basePath}\groups.txt", groupOutput); }
private static void WriteUsersReport(AlignmentReport report, string basePath) { // USERS var userOutput = new StringBuilder(); userOutput.AppendLine( "Email,Internal,State,PrivateFileCount,IsUserMapped,PublicMessageCount,PrivateMessageCount,LastAccessed"); foreach (var user in report.Users) { Console.WriteLine($"{user.Id}:{user.Email}"); userOutput.AppendLine(user.GetCsv()); } Utilities.WriteFile($@"{basePath}\users.txt", userOutput); }
public static void WriteUsersReport(AlignmentReport report, string basePath, string extension, string separator) { // USERS var userOutput = new StringBuilder(); userOutput.AppendLine( $"Email{separator}Internal{separator}State{separator}PrivateFileCount{separator}PublicMessageCount{separator}PrivateMessageCount{separator}LastAccessed{separator}AAD_State"); foreach (var user in report.Users) { Console.WriteLine($"{user.Id}:{user.Email}"); userOutput.AppendLine(user.GetCsv(separator)); } Utilities.WriteFile($@"{basePath}\users{extension}", userOutput); }
/// <summary> /// Exports the alignment report to multiple files in a specific folder. /// </summary> /// <param name="report">AlignmentReport instance containing deserialized data.</param> private void ExportReport(AlignmentReport report) { // TODO: Refactoring the code in this method requires some extra work: // * Headers match up with the models. Use reflection, or something newer in C#, to get these automatically. // * Manually parse the YAML, so that we don't have to deal with the dictionaries at the top-level. // * Warn about path not being selected. string basePath = DlgSelectOutputFolder.SelectedPath; Console.WriteLine("Write..."); WriteGroupsReport(report, basePath); WriteUsersReport(report, basePath); WriteGroupAdminsReport(report, basePath); }
/// <summary> /// Exports the alignment report to multiple files in a specific folder. /// </summary> /// <param name="report">AlignmentReport instance containing deserialized data.</param> private void ExportReport(AlignmentReport report, string path, string extension, string separator) { // TODO: Refactoring the code in this method requires some extra work: // * Headers match up with the models. Use reflection, or something newer in C#, to get these automatically. // * Manually parse the YAML, so that we don't have to deal with the dictionaries at the top-level. // * Warn about path not being selected. separator = separator.Replace("\\t", "\t"); // Permit tabs in output Console.WriteLine("Write..."); ReportWriter.WriteGroupsReport(report, path, extension, separator); ReportWriter.WriteUsersReport(report, path, extension, separator); ReportWriter.WriteGroupAdminsReport(report, path, extension, separator); ReportWriter.WriteActiveCommunityGuestsReport(report, path, extension, separator); ReportWriter.WriteOtherCommunityGuestsReport(report, path, extension, separator); }
public static void WriteOtherCommunityGuestsReport(AlignmentReport report, string basePath, string extension, string separator) { var communityGuestOutput = new StringBuilder(); communityGuestOutput.AppendLine($"GroupID{separator}Email"); foreach (var group in report.Groups) { if (group.OtherCommunityGuests != null) { if (group.OtherCommunityGuests.Count > 0) { foreach (var guest in group.OtherCommunityGuests) { communityGuestOutput.AppendLine($"{group.Id}{separator}{guest}"); } } } } Utilities.WriteFile($@"{basePath}\othercommunityguests{extension}", communityGuestOutput); }