//public WebSite(int retryCount, int delay, string userAgent) //{ // RetryCount = retryCount; // Delay = delay; // UserAgent = userAgent; //} /// <summary> /// Exports the users for the current website. /// </summary> public (string, string) ExportUsers() { ConsoleOperations.WriteToConsole("Exporting users for website: " + SourceSiteUrl, ConsoleColor.White); var domainToSearch = ConfigurationManager.AppSettings[Constants.AppSettings.DomainToSearchKey]; var exportReportFileName = ConfigurationManager.AppSettings[Constants.AppSettings.UserExportSiteMapReportKey]; var batchSize = ConfigurationManager.AppSettings[Constants.AppSettings.BatchSizeKey]; var csvOperation = new CSVOperations(); string completedSite = string.Empty; string erroredSite = string.Empty; try { var userInformationList = Web.SiteUserInfoList; var camlQuery = CamlQuery.CreateAllItemsQuery(int.Parse(batchSize), new string[] { "FieldValuesAsText" }); ClientContext.ExecutingWebRequest += delegate(object sender, WebRequestEventArgs e) { e.WebRequestExecutor.WebRequest.UserAgent = UserAgent; }; List <ListItem> items = new List <ListItem>(); do { ListItemCollection listItemCollection = userInformationList.GetItems(camlQuery); ClientContext.Load(listItemCollection); //ClientContext.ExecuteQuery(); ClientContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); items.AddRange(listItemCollection); camlQuery.ListItemCollectionPosition = listItemCollection.ListItemCollectionPosition; } while (camlQuery.ListItemCollectionPosition != null); ConsoleOperations.WriteToConsole($"Extracted all users for {SourceSiteUrl}", ConsoleColor.Green); IEnumerable <User> domainUsers = GetDesiredDomainUsers(items, domainToSearch); ConsoleOperations.WriteToConsole($"Writing Users List for {SourceSiteUrl}. Total users found are: " + domainUsers.Count(), ConsoleColor.Yellow); bool isSuccess = csvOperation.WriteCsv(domainUsers, exportReportFileName); if (isSuccess) { completedSite = SourceSiteUrl; } else { erroredSite = SourceSiteUrl; } } catch (Exception ex) { ConsoleOperations.WriteToConsole($"Error in Exporting users {ex.Message}", ConsoleColor.Red); erroredSite = SourceSiteUrl; } return(completedSite, erroredSite); }
/// <summary> /// Recurses the sub webs of a site collection and generate the list of webs for further processing. /// </summary> public void RecursSubWebs() { Logger.Log("Reading webs for " + ModernWeb.SourceSiteUrl); Console.WriteLine("Reading webs for " + ModernWeb.SourceSiteUrl); if (ModernWeb != null) { var authManagerSource = new AuthenticationManager(); using (var sourceContext = authManagerSource.GetSharePointOnlineAuthenticatedContextTenant(ModernWeb.SourceSiteUrl, ModernWeb.SourceUserName, ModernWeb.SourcePassword)) { Logger.Log("Created context for " + ModernWeb.SourceSiteUrl); sourceContext.ExecutingWebRequest += delegate(object sender, WebRequestEventArgs e) { e.WebRequestExecutor.WebRequest.UserAgent = UserAgent; }; var rootWeb = sourceContext.Web; try { sourceContext.Load(rootWeb, website => website.RoleDefinitions, website => website.WebTemplate, website => website.Webs, website => website.Title, website => website.Url); //sourceContext.ExecuteQueryRetry(); sourceContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); ModernWeb.ClientContext = sourceContext; ModernWeb.Web = rootWeb; ModernWebsList.Add(ModernWeb); //Get all the webs for the current root site Logger.Log("Calling GetAllSubWebs for " + ModernWeb.SourceSiteUrl); var websList = GetAllSubWebs(sourceContext, rootWeb); websList?.ForEach(web => { ModernWeb = web; RecursSubWebs(); }); } catch (Exception ex) { Logger.LogError("Problem in RecursSubWebs for" + ModernWeb.SourceSiteUrl + Environment.NewLine + ex.Message); ConsoleOperations.WriteToConsole("Problem in RecursSubWebs for: " + ModernWeb.SourceSiteUrl + Environment.NewLine + "Error Message: " + ex.Message, ConsoleColor.Red); } } } }
/// <summary> /// Adds the controls. /// </summary> /// <param name="sourceContext">The source context.</param> /// <param name="newModernPage">The new modern page.</param> /// <param name="pageName">Name of the page.</param> private void AddControls(ClientContext sourceContext, ClientSidePage newModernPage, string pageName) { try { var sourcePage = ClientSidePage.Load(sourceContext, pageName); //newModernPage.Controls; var controlsCollection = sourcePage.Controls; foreach (var control in controlsCollection) { newModernPage.AddControl(control); //var webparttoadd = newmodernpage.instantiatedefaultwebpart(defaultclientsidewebparts.) } newModernPage.Save(); } catch (Exception ex) { ConsoleOperations.WriteToConsole("Problem with adding controls to page", ConsoleColor.Yellow); } }
/// <summary> /// Creates the page with web parts. /// </summary> /// <param name="sourceContext">The source context.</param> /// <param name="targetContext">The target context.</param> /// <param name="targetWeb">The target web.</param> /// <param name="sourceItem">The source item.</param> /// <param name="pageName">Name of the page.</param> /// <returns>ListItem.</returns> public override ListItem CreatePageWithWebParts(ClientContext sourceContext, ClientContext targetContext, Web targetWeb, ListItem sourceItem, string pageName) { ListItem targetItem = null; Logger.Log("Into CreatePageWithWebParts for " + pageName); if (targetWeb != null) { try { var wikiPageRelativeUrl = targetWeb.EnsureWikiPage(sourceItem.ParentList.Title, pageName); //.AddWikiPage(Constants.ModernPageLibrary, pageName); var wikiPage = targetWeb.GetFileByServerRelativeUrl(targetWeb.ServerRelativeUrl + "/" + wikiPageRelativeUrl); targetItem = wikiPage.ListItemAllFields; targetContext.Load(wikiPage); targetContext.Load(targetItem, i => i.DisplayName); targetContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); var webPartOps = new WebPartOperation(Logger, RetryCount, Delay); var webpartList = webPartOps.ExportWebPart(sourceContext, sourceItem.File); webPartOps.ImportWebParts(targetContext, targetWeb, webpartList, wikiPage); AddContent(targetContext, targetItem, sourceItem, Constants.WikiPageContentControl); if (targetItem != null && sourceItem.HasUniqueRoleAssignments) { ManagePermissions(sourceContext, targetContext, sourceItem, targetItem); } UpdateSystemFields(targetContext, targetItem, sourceItem); } catch (Exception ex) { ConsoleOperations.WriteToConsole("Exception in migrating the page: " + pageName + " on " + sourceContext.Web.Url, ConsoleColor.Red); Logger.LogError("Error in CreatePageWithWebParts for WikiPage " + pageName + Environment.NewLine + ex.Message); //throw ex; } } return(targetItem); }
/// <summary> /// Gets password from the user and converts to Secure String /// </summary> /// <param name="label">The label.</param> /// <returns>SecureString.</returns> private static SecureString GetSecureString(string label) { SecureString sStrPwd = new SecureString(); try { ConsoleOperations.WriteToConsole(label, ConsoleColor.Yellow); for (ConsoleKeyInfo keyInfo = Console.ReadKey(true); keyInfo.Key != ConsoleKey.Enter; keyInfo = Console.ReadKey(true)) { if (keyInfo.Key == ConsoleKey.Backspace) { if (sStrPwd.Length > 0) { sStrPwd.RemoveAt(sStrPwd.Length - 1); Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); Console.Write(" "); Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop); } } else if (keyInfo.Key != ConsoleKey.Enter) { Console.Write("*"); sStrPwd.AppendChar(keyInfo.KeyChar); } } Console.WriteLine(""); } catch (Exception e) { sStrPwd = null; Console.WriteLine(e.Message); } return(sStrPwd); }
/// <summary> /// Creates the page with web parts. /// </summary> /// <param name="sourceContext">The source context.</param> /// <param name="targetContext">The target context.</param> /// <param name="targetWeb">The target web.</param> /// <param name="sourceItem">The source item.</param> /// <param name="pageName">Name of the page.</param> /// <returns>ListItem.</returns> public override ListItem CreatePageWithWebParts(ClientContext sourceContext, ClientContext targetContext, Web targetWeb, ListItem sourceItem, string pageName) { ListItem repostPageListItem = null; Logger.Log("Into CreatePageWithWebParts for " + pageName); if (targetWeb != null) { try { var sitePagesList = targetWeb.Lists.GetByTitle(Constants.ModernPageLibrary); var listContentTypes = sitePagesList.ContentTypes; targetContext.Load(targetWeb); targetContext.Load(listContentTypes, ctypes => ctypes.Include(c => c.Name, c => c.Id)); targetContext.Load(sitePagesList); targetContext.Load(sitePagesList.RootFolder); targetContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); //var pageTitle = "RepostPage.aspx"; //sitePagesList.RootFolder.Files.AddTemplateFile(sitePagesList.RootFolder.ServerRelativeUrl + "/" + pageName, TemplateFileType.ClientSidePage); var repostPage = targetWeb.AddClientSidePage(pageName, true); if (repostPage != null) { repostPageListItem = repostPage.PageListItem; repostPageListItem["ContentTypeId"] = listContentTypes.FirstOrDefault(ct => ct.Name == Constants.RepostPageContentType).Id; //sourceItem["ContentTypeId"];//"0x0101009D1CB255DA76424F860D91F20E6C4118002A50BFCFB7614729B56886FADA02339B00874A802FBA36B64BAB7A47514EAAB232"; repostPageListItem["PageLayoutType"] = sourceItem["PageLayoutType"]; repostPageListItem["PromotedState"] = sourceItem["PromotedState"]; //"2"; repostPageListItem["Title"] = sourceItem.Client_Title; //repostPageListItem["ClientSideApplicationId"] = "b6917cb1-93a0-4b97-a84d-7cf49975d4ec"; repostPageListItem["_OriginalSourceSiteId"] = targetContext.Site.Id; repostPageListItem["_OriginalSourceWebId"] = targetWeb.Id; repostPageListItem["_OriginalSourceListId"] = sitePagesList.Id; repostPageListItem["_OriginalSourceItemId"] = repostPageListItem["UniqueId"].ToString(); repostPageListItem["_OriginalSourceUrl"] = sourceItem["_OriginalSourceUrl"]; repostPageListItem["Description"] = sourceItem["Description"];//"Repost Page Description"; repostPageListItem["BannerImageUrl"] = sourceItem["BannerImageUrl"]; repostPageListItem["FirstPublishedDate"] = sourceItem["FirstPublishedDate"]; repostPageListItem.Update(); targetContext.Load(repostPageListItem, i => i.DisplayName); targetContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); repostPage.PromoteAsNewsArticle(); if (repostPageListItem != null && sourceItem.HasUniqueRoleAssignments) { ManagePermissions(sourceContext, targetContext, sourceItem, repostPageListItem); } UpdateSystemFields(targetContext, repostPageListItem, sourceItem); } } catch (Exception ex) { Logger.LogError("Error in CreatePageWithWebParts for RepostPage " + pageName + Environment.NewLine + ex.Message); ConsoleOperations.WriteToConsole("Exception in migrating the page: " + pageName + " on " + sourceContext.Web.Url, ConsoleColor.Red); //throw ex; } } return(repostPageListItem); }
/// <summary> /// Creates a modern page with web parts. /// </summary> /// <param name="sourceContext">The source context.</param> /// <param name="targetContext">The target context.</param> /// <param name="targetWeb">The target web.</param> /// <param name="sourceItem">The source item.</param> /// <param name="pageName">Name of the page.</param> /// <returns>ListItem.</returns> public override ListItem CreatePageWithWebParts(ClientContext sourceContext, ClientContext targetContext, Web targetWeb, ListItem sourceItem, string pageName) { ListItem targetItem = null; Logger.Log("Into CreatePageWithWebParts for " + pageName); try { var newClientSidePage = targetWeb.AddClientSidePage(pageName, true); try { var sourcePage = ClientSidePage.Load(sourceContext, pageName); if (sourcePage.PageHeader.ImageServerRelativeUrl != null) { newClientSidePage.PageHeader.ImageServerRelativeUrl = sourcePage.PageHeader.ImageServerRelativeUrl.ToLower().Replace(sourceContext.Web.Url, targetContext.Web.Url); } newClientSidePage.PageTitle = sourcePage.PageTitle; newClientSidePage.LayoutType = sourcePage.LayoutType; if (sourcePage.LayoutType == ClientSidePageLayoutType.Home) { newClientSidePage.RemovePageHeader(); } if (sourcePage.CommentsDisabled) { newClientSidePage.DisableComments(); } } catch (Exception ex) { ConsoleOperations.WriteToConsole("Problem in fetching source page: " + pageName + " at: " + sourceContext.Web.Url + ex.Message, ConsoleColor.Red); Logger.LogError("Problem in fetching source page: " + pageName + " at: " + sourceContext.Web.Url + ex.Message); } if (!string.IsNullOrEmpty(Convert.ToString(sourceItem[Constants.PromotedState]))) { if (Convert.ToInt32(sourceItem[Constants.PromotedState]) == 2) { newClientSidePage.PromoteAsNewsArticle(); } } newClientSidePage.Save(); targetItem = newClientSidePage.PageListItem; targetContext.Load(targetItem, i => i.DisplayName); targetContext.ExecuteQueryWithIncrementalRetry(RetryCount, Delay); AddContent(targetContext, targetItem, sourceItem, Constants.ModernPageContentControl); if (targetItem != null && sourceItem.HasUniqueRoleAssignments) { ManagePermissions(sourceContext, targetContext, sourceItem, targetItem); } UpdateSystemFields(targetContext, targetItem, sourceItem); //newClientSidePage.Publish(); } catch (Exception ex) { Logger.LogError("Error in CreatePageWithWebParts for ModernPage " + pageName + Environment.NewLine + ex.Message); ConsoleOperations.WriteToConsole("Exception in migrating the page: " + pageName + " on " + sourceContext.Web.Url, ConsoleColor.Red); //throw ex; } //AddControls(sourceContext, newClientSidePage, pageName); //var webpartList = WebPartOperation.ExportWebPart(sourceContext, sourceItem.File); //WebPartOperation.ImportWebParts(targetContext, web, webpartList, newClientSidePage.PageListItem.File); return(targetItem); }
/// <summary> /// Creates the page. /// </summary> /// <param name="sourcePageItemsCollection">The source page items collection.</param> /// <param name="sourceContext">The source context.</param> /// <param name="targetContext">The target context.</param> /// <param name="targetWeb">The target web.</param> private ListItem CreatePage(ListItemCollection sourcePageItemsCollection, ClientContext sourceContext, ClientContext targetContext, Web targetWeb) { ListItem targetItem = null; if (sourcePageItemsCollection != null && sourcePageItemsCollection.Count > 0) { foreach (var sourceItem in sourcePageItemsCollection) { var fileRef = sourceItem[Constants.FileRef].ToString(); var pageName = fileRef.Substring(fileRef.LastIndexOf('/') + 1); ConsoleOperations.WriteToConsole("Processing page: " + fileRef, ConsoleColor.Yellow); Logger.Log("Processing page: " + fileRef); try { switch (sourceItem.ContentType.Name) { case Constants.ModernPageContentType: //Sometimes Wiki Pages have 'Site Page' content Type. Additional check for that //TODO: Use Dependency Injection/Factory Model if (sourceItem[Constants.WikiPageContentControl] == null) { SitePage modernPage = new SitePage(Logger, RetryCount, Delay); targetItem = modernPage.CreatePageWithWebParts(sourceContext, targetContext, targetWeb, sourceItem, pageName); } else { WikiPage wikiPage = new WikiPage(Logger, RetryCount, Delay); targetItem = wikiPage.CreatePageWithWebParts(sourceContext, targetContext, targetWeb, sourceItem, pageName); } ConsoleOperations.WriteToConsole("Processed page: " + fileRef, ConsoleColor.Green); Logger.Log("Processed page: " + fileRef); break; case Constants.WikiPageContentType: //TODO: If a page is present then avoid adding duplicate webparts WikiPage wikPage = new WikiPage(Logger, RetryCount, Delay); targetItem = wikPage.CreatePageWithWebParts(sourceContext, targetContext, targetWeb, sourceItem, pageName); ConsoleOperations.WriteToConsole("Processed page: " + fileRef, ConsoleColor.Green); Logger.Log("Processed page: " + fileRef); break; case Constants.RepostPageContentType: RepostPage repostPage = new RepostPage(Logger, RetryCount, Delay); targetItem = repostPage.CreatePageWithWebParts(sourceContext, targetContext, targetWeb, sourceItem, pageName); ConsoleOperations.WriteToConsole("Processed page: " + fileRef, ConsoleColor.Green); Logger.Log("Processed page: " + fileRef); break; case Constants.WebPartPageContentType: //TODO - Multiple webpart Zone WebPartPage webPartPage = new WebPartPage(Logger, RetryCount, Delay); webPartPage.CreatePageWithWebParts(sourceContext, targetContext, targetWeb, sourceItem, pageName); ConsoleOperations.WriteToConsole("Processed page: " + fileRef, ConsoleColor.Green); Logger.Log("Processed page: " + fileRef); break; } } catch (Exception ex) { Logger.LogError("Exception in WebsOperation for page content type identification. " + ex.Message); } } } return(targetItem); }
static void Main(string[] args) { IAsyncLogger logger = O365GroupsFactory.GetLogger(new string[] { Constants.AppSettings.LoggerInstanceKey }) as IAsyncLogger; var siteMapFileName = ConfigurationManager.AppSettings[Constants.AppSettings.UserExportSiteMapKey]; var siteMapSheetName = ConfigurationManager.AppSettings[Constants.AppSettings.SiteMapSheetKey]; var retryCount = int.Parse(ConfigurationManager.AppSettings[Constants.AppSettings.RetryCountKey]); var delay = int.Parse(ConfigurationManager.AppSettings[Constants.AppSettings.DelayKey]); var userAgent = ConfigurationManager.AppSettings[Constants.AppSettings.UserAgentKey]; List <string> completedSitesList = new List <string>(); List <string> erroredSitesList = new List <string>(); ConsoleOperations.WriteToConsole("Reading Files...", ConsoleColor.White); var csvOperation = new CSVOperations(); var siteMapDetails = csvOperation.ReadFile(Constants.AppSettings.UserExportSiteMapKey, siteMapFileName, siteMapSheetName).Cast <UserExportSiteMapReport>().ToList(); if (siteMapDetails != null) { SecureString sourcePassword = GetSecureString(Constants.PasswordMessageSource); //Stopwatch watch = new Stopwatch(); //watch.Start(); List <WebSite> websList = new List <WebSite>(); ConsoleOperations.WriteToConsole("Processing read sites from CSV", ConsoleColor.White); foreach (var siteMap in siteMapDetails) { logger.Log("Reading " + siteMap.SourceSiteUrl); var website = new WebSite { SourceSiteUrl = siteMap.SourceSiteUrl.Trim(), SourceUserName = siteMap.SourceUser.Trim(), SourcePassword = sourcePassword, Delay = delay, RetryCount = retryCount, UserAgent = userAgent }; websList.Add(website); } try { WebsUtility websOperation = new WebsUtility(retryCount, delay, userAgent); websOperation.WebSiteList = websList; (completedSitesList, erroredSitesList) = websOperation.ExportUsersList(); } catch (Exception ex) { ConsoleOperations.WriteToConsole("Error ocurred: " + ex.Message, ConsoleColor.Red); } //watch.Stop(); logger.Log("Processing complete"); ConsoleOperations.WriteToConsole($"Processing Complete; Total successful site count: {completedSitesList.Count}. The completed list is as follows:", ConsoleColor.Green); completedSitesList.ForEach(site => { ConsoleOperations.WriteToConsole(site, ConsoleColor.DarkCyan); }); ConsoleOperations.WriteToConsole("Total Errored sites: " + erroredSitesList.Count, ConsoleColor.Red); if (erroredSitesList.Count > 0) { ConsoleOperations.WriteToConsole("List: ", ConsoleColor.Red); erroredSitesList.ForEach(site => { ConsoleOperations.WriteToConsole(site, ConsoleColor.Red); }); } Console.ReadLine(); //Console.WriteLine("Elapsed Time " + watch.Elapsed.ToString()); } }