#Informations récupérées : Nom du contrôleur de domaine (DC), domaine Active Directory (AD) d'appartenance, OS, présence ou non des KB recherchées, date d'installation des KB
#Prérequis : l'utilisateur qui lance le script doit pouvoir requêter en remote PowerShell Administrator l'ensemble des DC de la forêt
#Paramètre obligatoire qui doit contenir la liste des KB à récupérer
#Par exemple pour appeler le script avec une liste de KB : .\Get-DomainControllerKB.ps1 -DCHotFixIDs KB5022511, KB4589208
Param
(
[Parameter(Mandatory=$true)]
[array]$DCHotFixIDs
)
#Importe le module Active Directory qui contient des commandes utilisées dans le script
Import-Module ActiveDirectory
#Permet de récupérer les noms de tous les domaines dans la forêt AD
$Domains = Get-ADForest | Select-Object Domains
$Domains = $Domains.Domains
#Créer un tableau qui contiendra l'ensemble des statuts des KB des DC de chaque domaine de la forêt
$Array = @()
#Parcours chaque domaine AD de la forêt et récupére la liste des DC
foreach ($Domain in $Domains)
{
#Récupére l'ensemble des DC du domaine AD actuellement requêté
$DCs = Get-ADDomainController -Server $Domain -Filter * | Select-Object Name, HostName, OperatingSystem
#Parcours chaque DC du domaine AD actuellement requêté
foreach ($DC in $DCs)
{
#Vérifie pour chaque KB si elle est présente sur le DC actuellement requêté
foreach ($DCHotFixID in $DCHotFixIDs)
{
#Créer un objet PowerShell qui contiendra les informations sur la KB actuellement requêtée du DC actuellement requêté
$Line = New-Object PSObject
#Ajoute à l'objet PowerShell précédemment crée, le nom du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "DomainController" -Value $DC.HostName
#Ajoute à l'objet PowerShell précédemment crée, le domaine AD d'appartenence du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "Domain" -Value $Domain
#Ajoute à l'objet PowerShell précédemment crée, le système d'exploitation du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "OperatingSystem" -Value $DC.OperatingSystem
#Ajoute à l'objet PowerShell précédemment crée, le numéro de la KB actuellement requêté du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "HotFixIDSearched" -Value $DCHotFixID
#Commande qui va vérifier si la KB actuellement requêtée est présente sur le DC actuellement requêté
$HotFixObject = Get-HotFix -ComputerName $DC.HostName -ID $DCHotFixID -ErrorAction SilentlyContinue | Select-Object Description, HotFixID, InstalledBy, InstalledOn
#Si la KB actuellement requêtée est PRESENTE sur le DC actuellement requêté, ajoute les informations relatives à son installation dans l'objet PowerShell précédemment créé
if ($HotFixObject)
{
#Ajoute à l'objet PowerShell précédemment crée, le statut présent ou absent de la KB actuellement requêtée du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "KBIsInstalled" -Value "Success"
#Ajoute à l'objet PowerShell précédemment crée, le nom de l'utilisateur qui a réalisé l'installation de la KB actuellement requêtée du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "HotFixInstalledBy" -Value $HotFixObject.InstalledBy
#Ajoute à l'objet PowerShell précédemment crée, la date d'installation, arrondi au jour prêt, de la KB actuellement requêtée du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "HotFixInstalledOn" -Value $HotFixObject.InstalledOn
#Ajoute à l'objet PowerShell précédemment crée, le type de KB actuellement requêté du DC actuellement requêté
$Line | Add-Member -MemberType NoteProperty -Name "HotFixDescription" -Value $HotFixObject.Description
#Supprime les valeurs des variables propres à la KB actuellement requêté du DC actuellement requêté
Clear-Variable HotFixObject
}
#Si la KB actuellement requêtée est ABSENTE sur le DC actuellement requêté, ajoute des valeurs Fail ou NULL pour ses informations dans l'objet PowerShell précédemment créé
else
{
$Line | Add-Member -MemberType NoteProperty -Name "KBIsInstalled" -Value "Fail"
$Line | Add-Member -MemberType NoteProperty -Name "HotFixInstalledBy" -Value "NULL"
$Line | Add-Member -MemberType NoteProperty -Name "HotFixInstalledOn" -Value "NULL"
$Line | Add-Member -MemberType NoteProperty -Name "HotFixDescription" -Value "NULL"
}
#Ajoute à la variable globale qui contient l'ensemble des statuts des KB des DC de chaque domaine, l'objet PowerShell précédemment crée lors de l'itération courante
$Array += $Line
#Supprime les valeurs des variables propres à la KB actuellement requêtée du DC actuellement requêté
Clear-Variable DCHotFixID, Line
}
#Supprime les valeurs des variables propres au DC actuellement requêté
Clear-Variable DC
}
#Supprime les valeurs des variables propres au domaine actuellement requêté
Clear-Variable Domain, DCs
}
#Affiche sous forme de liste l'ensemble des KB requêtées des DC de chaque domaine avec leurs status
$Array
<#Exemple d'affichage
DomainController : DC01.customer.intern
Domain : customer.intern
OperatingSystem : Windows Server 2022 Standard
HotFixIDSearched : KB5022511
KBIsInstalled : Fail
HotFixInstalledBy : NULL
HotFixInstalledOn : NULL
HotFixDescription : NULL
DomainController : DC01.customer.intern
Domain : staff.nsi.dir
OperatingSystem : Windows Server 2022 Standard
HotFixIDSearched : KB4589208
KBIsInstalled : Fail
HotFixInstalledBy : NULL
HotFixInstalledOn : NULL
HotFixDescription : NULL
DomainController : DC02.technical.intern
Domain : technical.intern
OperatingSystem : Windows Server 2019 Standard
HotFixIDSearched : KB5022511
KBIsInstalled : Success
HotFixInstalledBy : NT AUTHORITY\SYSTEM
HotFixInstalledOn : 15/02/2023 00:00:00
HotFixDescription : Update
DomainController : DC02.technical.intern
Domain : technical.intern
OperatingSystem : Windows Server 2019 Standard
HotFixIDSearched : KB4589208
KBIsInstalled : Success
HotFixInstalledBy : NT AUTHORITY\SYSTEM
HotFixInstalledOn : 28/01/2021 00:00:00
HotFixDescription : Update
#>