Public/Restart-MyComputer.ps1




function Restart-MyComputer {

    <#
 
.Synopsis
    This is a function to Restart Computers using WinRM Communication
 
.DESCRIPTION
    This is a function to Restart Computers vis WinRM, When WMI/RPC protocols are restricted in the environment
 
.NOTE
 
  File Name : Restart-MyComputer.ps1
  Author : Srini Vemulapalli
  Requires : PowerShell 5
 
.EXAMPLE
 
    PS> Restart-MyComputer -ComputerName USKANBNYMJHP03 -WhatIf
        Restart-MyComputer -ComputerName USKANBNYMJHP03 -Confirm
        Restart-MyComputer -ComputerName USKANBNYMJHP03 -Confirm:$false
     
 
.EXAMPLE
 
    PS> Restart-MyComputer -ComputerName (get-content servers.txt) -WhatIf
 
.LINK
 
#>



    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')]
    param (
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $True,
            ValueFromPipelineByPropertyName = $True)]
        [Alias('HostName', 'cn', 'IPAddress')]
        [string[]] $ComputerName
    )


    BEGIN {
        Write-Verbose "Script execution in Progress... Please wait!"
    }

    PROCESS {
        $Max = $ComputerName.Count
        $Count = 1
        $ADUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
        Write-Log "Script execution in Progress...for $ADUser Please wait!"
        foreach ($Computer in $ComputerName) {
            
            if ($PSCmdlet.ShouldProcess($Computer, "Restart")) {

                try {
                    Write-Verbose "-------------------------------"
                    Write-Verbose "Currently Processing Restart-MyComputer On $Computer ...$Count of $max"
                    $Computer = $Computer.trim()

                    $session = New-CimSession -ComputerName $Computer  -ErrorAction Stop -Verbose:$false
                    Write-Log "Currently Processing Restart-MyComputer On $Computer ...$Count of $max"

                    Invoke-CimMethod -Query 'Select * from Win32_OperatingSystem' -MethodName 'Reboot' -CimSession $Session | OUt-Null
                    Remove-CimSession -CimSession $Session
                    Write-Verbose "Computer restart command sent Sucesfully."            
                
                    Write-Log "Waiting for $Computer to go Offline."
                    While (Test-Connection -ComputerName $Computer -Count 1 -Quiet) {
                        Start-Sleep -Seconds 2
                    }

                    Write-Log "Waiting for $Computer to come back Online."
                    While (-not (Test-Connection -ComputerName $Computer -Count 1 -Quiet)) {
                        Start-Sleep -Seconds 23
                    }

            
                    $properties = @{ComputerName = $Computer
                        Status                   = 'Connected'
                        IsRestarted              = "Yes"
                    }
                 
                    Write-Log "$Computer is back Online."

            
                }
                catch {
                    
                    Write-Verbose "Couldn't Connect to $Computer"
                    Write-Log "Couldn't Connect to $Computer" -Severity ERROR
                    
                    $properties = @{ComputerName = $Computer
                        Status                   = 'Disconnected'
                        IsRestarted              = "No"
                    }

                }
                finally {
                    
                    $obj = New-Object -TypeName PSObject -Property $properties
                    $obj.psobject.typenames.insert(0, '.\formats\ServerInfo.Custom.Objectfmt0')
                    Write-Output $obj
                                     
                } #End finally

                # Incrimenting count for interactive console text
                $count = $count + 1 
            }   # if stmt
            Else {
      
                Write-Log "User aborted this Operation[$ADUser]" -Severity INFO
            }
        }# End foreach

    } #End PROCESS
         
    END {
        Write-Log "All restart Operations Completed"
         
    }


} #End FUNCTION