Public/Invoke-ServiceRecovery.ps1

<#
    .DESCRIPTION
    Restart one or multiple services that share a part of a Service Displayname
 
    The purpose of this command is recover from issues with widely distributed services. Example would be an antivirus service or Remote Access Agents providing trouble.
 
    .Parameter DisplayNameLike
    Specify a full or partial name match for the service
 
    .Parameter FromLog
    Specifies to pickup failed service recoveries from a log file
 
    .EXAMPLE
    Invoke-ServiceRecovery -DisplayNameLike spooler
 
    Restart specified service on all domain endpoints
 
    .EXAMPLE
    Invoke-ServiceRecovery -DisplayNameLike spooler -FromLog .\servicerecovery_log_0911.txt
 
    Restart specified service on all remaining endpoints using the failed endpoints log.
 
    .NOTES
    Must be Run from a DC or have the ActiveDirectory Module imported
 
    .Link
    https://github.com/TheTaylorLee/AdminToolbox
#>


function Invoke-ServiceRecovery {

    Param (
        [Parameter(Mandatory = $true)]$DisplayNameLike,
        [Parameter(Mandatory = $false)]$FromLog
    )


    #Check For Admin Privleges
    Get-Elevation

    if ($host.version.major -gt '5') {
        Write-Host " "
        Write-Error "This function only works in powershell version 5.1 or less."
        break
    }

    #Resuming recovery from a Logfile
    if ($null -ne $FromLog) {
        #Restart Services
        Get-Content $FromLog |
            ForEach-Object {
                try {
                    Write-Host "Restarting Services with DisplayNameLike $DisplayNameLike on: " -ForegroundColor Green -NoNewline
                    Write-Host "$_" -ForegroundColor Cyan

                    Get-Service -computername $_ | Where-Object { $_.displayname -like "*$DisplayNameLike*" } | Restart-Service -Force
                }
                catch {
                    $trim0 = $_
                    $trim1 = $trim0 -replace ("Cannot open Service Control Manager on computer '", "")
                    $trimout = $trim1 -replace ("'. This operation might require other privileges.", "")
                    $trimout | Out-File $env:USERPROFILE\desktop\ServiceRecovery_Log.txt -Append
                }
            }
    }

    else {
        #Restart Services
        foreach ($computer in Get-ADComputer -Filter { (Enabled -eq $true) } | Sort-Object name | Select-Object -ExpandProperty name) {
            try {
                Write-Host "Restarting Services with DisplayNameLike $DisplayNameLike on: " -ForegroundColor Green -NoNewline
                Write-Host "$computer" -ForegroundColor Cyan

                Get-Service -computername $computer | Where-Object { $_.displayname -like "*$DisplayNameLike*" } | Restart-Service -Force
            }
            catch {
                $trim0 = $_
                $trim1 = $trim0 -replace ("Cannot open Service Control Manager on computer '", "")
                $trimout = $trim1 -replace ("'. This operation might require other privileges.", "")
                $trimout | Out-File $env:USERPROFILE\desktop\ServiceRecovery_Log.txt -Append
            }
        }

    }

    #Rename LogFile to Avoid overwrites later
    $Date = Get-Date -Format hhmm
    Rename-Item $env:USERPROFILE\desktop\ServiceRecovery_Log.txt $env:USERPROFILE\desktop\ServiceRecovery_Log_"$Date".txt
}