//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);
        }
Example #2
0
        /// <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);
        }
Example #8
0
        /// <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());
            }
        }