Skip to main content

Etat des lieux d'un service Windows

 

# Listage de l'état d'un service sur l'ensemble des serveurs Windows d'un domaine
# Le compte de la machine ne doit pas être désactivé et il doit répondre au ping
# Dans ce cas, il s'agit du service 'spooler'


# Autor : JHAF
# Listage de l'état d'un service sur l'ensemble des serveurs Windows d'un domaine
# Le compte de la machine ne doit pas être désactivé et il doit répondre au ping
# Dans ce cas, il s'agit du service 'spooler'

# Service à check
$Service = 'spooler'

# Horadatage pour CSV
$DateJour = Get-Date -Uformat %Y%m%d_%H%m

# Initialisation des variables en Array
$Report = @()
$Spoolers = @()

# Liste des serveurs Windows avec une compte actif
$Servers = Get-ADOrganizationalUnit -Filter * | ForEach-Object { Get-ADComputer -Filter 'operatingSystem -like "*Windows Server*" -and userAccountControl -notlike "4098"' -SearchBase "$_" -SearchScope OneLevel } | Select-Object DNSHostName, Name, SID
#$Servers | Out-GridView

# Test si les serveurs sont UP
foreach($Server in $Servers){
    
    $pingtest = Test-Connection -ComputerName $Server.DNSHostName -Quiet -Count 1 -ErrorAction SilentlyContinue
    if($pingtest){
        #Write-Host $Server.DNSHostName " is reachable"
        $Spoolers += Get-ADComputer -Identity $Server.Name | Select-Object DNSHostName, Name, SID
     }
     else{
        #Write-Host $Server.DNSHostName " is not reachable"
     }
     
}
#$Spoolers | Out-GridView

# Récupération des infos du service Spooler pour chaque serveur UP
foreach ($Spooler in $Spoolers) {
    $Status = Get-Service -ComputerName $Spooler.Name -Name $Service | Select-Object MachineName, Name, Status
    $Startup = Get-WmiObject -Computer $Spooler.Name -Class Win32_Service -Property StartMode -Filter "Name='$Service'"
    $Report += [PSCustomObject]@{
        MachineName = $Status.MachineName
        Name        = $Status.Name
        Status      = $Status.Status
        StartMode   = $Startup.StartMode
    }
}
$Report | Out-GridView
#$Report | Export-Csv -Path C:\script\Audit\2022\1032\${DateJour}_Get-Spooler_Status.csv -NoTypeInformation -Encoding UTF8 -Delimiter ';'


# Arrêt puis désactivation du démarrage auto d'un service sur l'ensemble des machines Windows listé dans un CSV
# WinRM doit fonctionner depuis la machine qui lance le script (notamment les flux RPC doivent être ouverts)
# Dans ce cas, il s'agit du service 'spooler'

# Horadatage pour CSV
$DateJour = Get-Date -Uformat %Y%m%d_%H%m

# Service à stop et check
$Service = 'spooler'

# Initialisation des variables en Array
$Report = @()

# Fichier CSV à faire à la main pour import
$SpoolersStop = Import-Csv C:\script\Audit\2022\1032\Stop-Spoolers.csv -Delimiter ';'

# Arrêt du service et Désactivation du démarrage auto
foreach ($Spooler in $SpoolersStop) {
    Get-Service -ComputerName $Spooler.MachineName -Name "spooler" | Stop-Service
    Set-Service -Computer $Spooler.MachineName -Name "spooler" -StartupType "Disabled"
}

# Récupération des infos du service Spooler pour chaque serveur UP
foreach ($Spooler in $Spoolers) {
    $Status = Get-Service -ComputerName $Spooler.Name -Name $Service | Select-Object MachineName, Name, Status
    $Startup = Get-WmiObject -Computer $Spooler.Name -Class Win32_Service -Property StartMode -Filter "Name='$Service'"
    $Report += [PSCustomObject]@{
        MachineName = $Status.MachineName
        Name        = $Status.Name
        Status      = $Status.Status
        StartMode   = $Startup.StartMode
    }
}
#$Report | Out-GridView
$Report | Export-Csv -Path C:\script\Audit\2022\1032\${DateJour}_Stop-Spoolers_Check.csv -NoTypeInformation -Encoding UTF8 -Delimiter ';'