Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server

Archives

Windows : Script PowerShell pour stopper une liste de serveurs dans un ordre spécifique - Idéal pour les fermes SharePoint

Tout fermier SharePoint est confronté un jour ou l’autre à cette question d’arrêt de serveur.

Il est évident que pour une infrastructure Stand Alone (1 serveur) ou Small farm (2-3 serveurs), cela se fera très simplement et ne posera pas de soucis particulier, tant que le serveur SQL est arrété en dernier.

Le cas devient plus délicat lorsqu’on commence à gérer plusieurs Large Farm (plus de 4 serveurs) dans un ou plusieurs DataCenter.

Le script suivant permet donc de stopper les machines, en utilisant la commande standard de Windows “Shutdown /s”, suivant l’ordre donné dans la liste des machines.


# Specific parameters
$ServersList = "SPWEBSERVER1", "SPWEBSERVER2", "SPWEBSERVER3", "SPEXCELSERVER1", "SPSEARCHSERVER2", "SPAPPSERVER2", "SPDBSERVER1", "SPDBSERVER2"
$Logfile = "C:\SHAREPOINT_SERVERS_STOP.log"

# Generic parameters
[int]$WaitTime = 20
[int]$Counter = 0
[DateTime]$mydate = get-date
[string]$MyCommand = ""
[string]$feedback = ""
[string]$ProcessFileToExec = "shutdown.exe"
[string]$ProcessFileParam = "/s /f /t 3 /m \\"

Function LogWrite
{
   Param ([string]$logstring)
   Add-content $Logfile -value $logstring
}

function New-Sleep    {
    [cmdletbinding()]
    param(
      [parameter(ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Mandatory=$true, HelpMessage="No time specified")]
        [int]$s
    )
  for ($i=1; $i -lt $s; $i++) {
    [int]$TimeLeft=$s-$i
      Write-Progress -Activity "Waiting $s seconds..." -PercentComplete (100/$s*$i) -CurrentOperation "$TimeLeft seconds left ($i elapsed)" -Status "Please wait"
    Start-Sleep -s 1
    }
    Write-Progress -Completed $true -Status "Please wait"
} # end function New-Sleep

Function CreateIntroLog
{
    LogWrite "================================================="
    LogWrite "--- SCRIPT STARTED:", $mydate.ToString(), " ---"
    LogWrite "================================================="
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host ""
    write-host "================================================="
    write-host -ForegroundColor Green "--- SCRIPT STARTED:", $mydate.ToString(), " ---"
    write-host "================================================="
}

Function ResetDNS
{
    write-host "================================================="
    write-host "===          Flushing DNS             ==="
    ipconfig /flushdns | out-null
    write-host "===          Registering DNS          ==="
    ipconfig /registerdns | out-null
    write-host "================================================="
}

Function TestPingServer([string]$MyServer)
{
    if(Test-Connection -Cn $MyServer -BufferSize 16 -Count 1 -ea 0 -quiet)
    {
        write-host "   Connection OK to $MyServer"
        return $true
    }
    ELSE
    {
        write-host " >>> Problem connecting to $MyServer <<< "
        return $false
    }
}

function StartProcess()
{
    # Create the stopwatch
    [System.Diagnostics.Stopwatch] $sw;
    $sw = New-Object System.Diagnostics.StopWatch
    $sw.Start()
    $Counter = 0
    cls
    ResetDNS
    CreateIntroLog
    foreach($MyServer in $ServersList)
    {
        $Counter ++
        write-host " ----------------------------------------------------"
        write-host " Server to stop:", $MyServer, "- Server Number:", $Counter
        [bool]$ResultPing = TestPingServer $MyServer
        if($ResultPing)
        {
            write-host -ForegroundColor Yellow  " - STOP SERVER ", $MyServer, " - "
            $MyCommand = $($ProcessFileToExec + " " + $ProcessFileParam + $MyServer)
            write-host $MyCommand
            try
            {
                invoke-expression -command "  $MyCommand" -Verbose -OutVariable myOut
                foreach($MyLine in $myOut)
                {
                    write-host "Line", $MyLine
                }
                $feedback = [string]::join(" ", @($myOut))
                write-host " Return: ", $feedback
            }
            catch [system.exception]
            {
                $feedback = $(" [Function Shutdown caught a system exception]: " + $_.Exception.Message)
                write-host -ForegroundColor Red " Return ERROR: ", $feedback
            }
            finally
            {
                write-host -ForegroundColor Green " Wait for the next Server stop:", $WaitTime
                LogWrite " ----------------------------------------------------"
                LogWrite " Server to stop:", $MyServer, "- Server Number:", $Counter
                LogWrite " Execution Time:", $mydate
                LogWrite " Command:", $MyCommand
                LogWrite " Return:", $feedback
                LogWrite " ----------------------------------------------------"
                New-Sleep -s $WaitTime
            }
        }
        else
        {
            write-host -ForegroundColor Red "--- NO PING TO SERVER:", $MyServer, " --- "
            write-host -ForegroundColor Red "  Shutdown Impossible"
            LogWrite " ----------------------------------------------------"
            LogWrite " No Ping to server:", $MyServer, "- Server Number:", $Counter
            LogWrite " Shutdown Impossible"
            LogWrite " Execution Time:", $mydate
            LogWrite " ----------------------------------------------------"
        }
        write-host " ----------------------------------------------------"
    }
    $sw.Stop()
    # Write the compact output to the screen
    write-host " "
    write-host " "
    write-host " ------------------------------------------------------------- "
    write-host -ForegroundColor Green " ----", $Counter " Servers stopped in Time: ", $sw.Elapsed.ToString(), "----"
    write-host " ------------------------------------------------------------- "
    write-host " "
    LogWrite "================================================="
    LogWrite " ---", $Counter, " Servers stopped in Time: ", $sw.Elapsed.ToString(), "---"
    LogWrite "================================================="
}

cls
StartProcess


Une fois les deux variables de départ enrichies, il vous suffit de lancer une commande PowerShell (en mode Administrateur), avec un compte Administrateur du domaine (ou qui sera administrateur des machines à éteindre).

Romelard Fabrice [MBA Risk Mgt]

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: mercredi 14 mai 2014 11:25 par ROMELARD Fabrice

Commentaires

ROMELARD Fabrice a dit :

Script posté sur le site CodePlex :

- https://sharepointpsscripts.codeplex.com/releases/view/21806

Fabrice

# mai 14, 2014 14:06
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [MVC] Plusieurs verbes pour une seule méthode du controller par Blog de Jérémy Jeanson le il y a 5 heures et 41 minutes

- SPS Paris 2015 – Back from MS Ignite par Le blog de Patrick [MVP Office 365] le 05-26-2015, 16:04

- Windows 10 IOT– exploitez vos capteurs en tout genre ! par Blog de Daniel TIZON [daniel] le 05-26-2015, 08:06

- SharePoint Saturday Paris 2015 c’est le 30 mai ! par Le blog de Patrick [MVP Office 365] le 05-25-2015, 21:07

- Configurer un écran 5 pouces 800x480 pour Raspberry Pi2 sous Windows 10 IOT par Blog de Daniel TIZON [daniel] le 05-22-2015, 07:52

- Office 365 : Sway est disponible en preview par Le petit blog de Pierre / Pierre's little blog le 05-21-2015, 22:24

- Première installation de Raspbian sur RASPBERRY Pi 2 par Blog de Daniel TIZON [daniel] le 05-14-2015, 22:17

- Mobile Day : c’est le 25 et c’est chez Microsoft! par Fathi Bellahcene le 05-13-2015, 23:48

- TFS 2013 : Migration d’une ferme TFS 2010 vers 2013 sans upgrade par Blog Technique de Romelard Fabrice le 05-01-2015, 16:28

- [ #SharePoint 2016 ] frappe à nos portes ! (1/2) par Le blog de Patrick [MVP Office 365] le 04-19-2015, 23:21