SharePoint Server - Recycle / Stop-Start Application/Site pool using C#


As a continuation of my previous post

List All Servers in SharePoint Farm using C#

Now w'll see to Start/Stop Pools without login to the server each time.
{ Please check the NOTE at the very end on this post }

List All Application/Site Pools

/// <summary>
/// Load Pools from the given server
/// </summary>
/// <param name="serverName">Server name</param>
/// <param name="pool">Pool type</param>
public void LoadPools(string serverName, PoolType pool)
{
    var server = ServerManager.OpenRemote(serverInstance);

    if (pool == PoolType.AppPool)
    {
        appPoolCollection = new List<ApplicationPool>();
        appPoolCollection = server.ApplicationPools.ToList();
    }
    else if (pool == PoolType.SitePool)
    {
        siteCollection = new List<Site>();
        siteCollection = server.Sites.ToList();
    }
}

Start/Stop Application Pool

/// <summary>
/// Reset Application Pool
/// </summary>
/// <param name="serverName">Server name to be opened</param>
/// <param name="resetAction">Start/Stop</param>
/// <param name="applicationPool">Application pool name to perform action</param>
/// <param name="message">Success/Exception message</param>
/// <returns>true/false</returns>
public bool ResetApplicationPool(string serverName, Action resetAction, string applicationPool, out string message)
{
    bool IsSuccess = false;

    try
    {
        var server = ServerManager.OpenRemote(serverName);

        #region START/STOP LOGIC
        ApplicationPool pool = server.ApplicationPools[applicationPool];
        if (pool != null)
        {
            try
            {
                if (pool.State != ObjectState.Unknown)
                {
                    if (resetAction == Action.Stop)
                    {
                        if (pool.State == ObjectState.Started)
                        {
                            // Stoping attempt
                            pool.Stop();

                            do
                            {
                                // sitting duck...
                            }
                            while (pool.State == ObjectState.Stopping);

                            System.Threading.Thread.Sleep(3000);

                            IsSuccess = true;
                        }
                        else if (pool.State == ObjectState.Stopped || pool.State == ObjectState.Stopping)
                        {
                            message = "Already in " + pool.State + " state";
                        }
                    }

                    if (resetAction == Action.Start)
                    {
                        if (pool.State == ObjectState.Stopped)
                        {
                            // Starting attempt
                            pool.Start();

                            do
                            {
                                // sitting duck...
                            }
                            while (pool.State == ObjectState.Starting);

                            IsSuccess = true;
                        }
                        else if (pool.State == ObjectState.Started || pool.State == ObjectState.Starting)
                        {
                            message = "Already in " + pool.State + " state";
                        }
                    }
                }
                else
                {
                    message = pool.Name + " - has unknown state";
                }
            }
            catch (Exception x)
            {
                message = "unhandled exception: " + x.Message;
            }
        }
        else
        {
            message = applicationPool + "- does not exist in this server";
        }

        #endregion
    }
    catch (Exception ex)
    {
        message = ex.Message;
    }

    return IsSuccess;
}

Start/Stop Site Pool

/// <summary>
/// Reset SitePool
/// </summary>
/// <param name="serverName">Server name to be opened</param>
/// <param name="resetAction">Start/Stop</param>
/// <param name="sitePool">Site pool name to perform action</param>
/// <param name="message">Success/Exception message</param>
/// <returns>true/false</returns>
public bool ResetSitePool(string serverName, Action resetAction, string sitePool, out string message)
{
    bool IsSuccess = false;

    try
    {
        var server = ServerManager.OpenRemote(serverName);
           
        Site site = server.Sites[sitePool];
        #region START/STOP logic
        if (site != null)
        {
            try
            {
                // SitePool's App pool name //
                // site.Applications[0].ApplicationPoolName; //

                if (site.State != ObjectState.Unknown)
                {
                    if (resetAction == Action.STOP)
                    {
                        if (site.State == ObjectState.Started)
                        {
                            //Stoping attempt
                            site.Stop();

                            do
                            {
                                // sitting duck...
                            }
                            while (site.State == ObjectState.Stopping);

                            System.Threading.Thread.Sleep(3000);

                            IsSuccess = true;
                        }
                        else if (site.State == ObjectState.Stopped || site.State == ObjectState.Stopping)
                        {
                            resultpool.isAlready = true;
                            resultpool.alreadyDescription = "Already in " + site.State + " state";
                        }
                    }
                    if (resetAction == Action.Start)
                    {
                        if (site.State == ObjectState.Stopped)
                        {
                            //Starting attempt
                            site.Start();

                            do
                            {
                                // sitting duck...
                            }
                            while (site.State == ObjectState.Starting);

                            IsSuccess = true;
                        }
                        else if (site.State == ObjectState.Started || site.State == ObjectState.Starting)
                        {
                            message = "Already in " + site.State + " state";
                        }
                    }
                    resultpool.CurretnState = site.State.ToString();
                }
                else
                {
                    message = site.Name + " - has unknown state";
                }
            }
            catch (Exception ex)
            {
                message = "unhandled exception: " + ex.Message;
            }
        }
        else
        {
            message = siteInstance + " - does not exit in this server";
        }
        #endregion            
    }
    catch (Exception ex)
    {
        message = ex.Message;
    }

    return IsSuccess;
}

๐Ÿ””โณ๐Ÿ”ถ๐Ÿ”ท Note ๐Ÿ”ท๐Ÿ”ถโณ๐Ÿ””

Have to host this solution as a website in IIS with the same Identity or Service Account used by SharePoint Application/Site Pools and host it in any one of the server in SharePoint farm. Then access it from anywhere using browser **[Highly recommended] Enable windows authentication for this website

-Ratsub

Comments

Popular posts from this blog

Secure When a HTTP request is received Power Automate a.k.a MS Flow

People picker Control in PowerApps

Upload attachment to SharePoint list item using Microsoft Flow

Modern page provisioning using page template

Headless-Daemon calling AAD secured API

Approval and auto escalation with time out in Microsoft Flow

Developing custom reusable components in PowerApps

Step-By-Step Azure AD App Registration

HTML field & Date Time formatting in powerapps

Create and configure custom connectors for PowerApps and MSFlow from AzureFunctions