Collecte hardware.bat

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script PowerShell
Objet Inventaire matériel d'une liste de serveurs distants
Dépendances WMI, PSCredential
Voir aussi Get-credential · Get-content

Script parcourant une liste de serveurs (fichier texte), testant leur disponibilité par ping WMI, puis collectant les informations matérielles (fabricant, modèle, CPU, mémoire, disques) sur chaque machine joignable.

Préparation

Préparer le fichier listeserveurs.txt contenant, une ligne par serveur, les informations de connexion au format IP,domaine\login,motdepasse (valeurs fictives à adapter) :

IpMachine1,domaine\loginwindowsmachine1,pwdwindowsmachine1
IpMachine2,domaine\loginwindowsmachine2,pwdwindowsmachine2

⚠️ Stocker des mots de passe en clair dans un fichier est déconseillé. Préférer Get-credential ou un magasin sécurisé.

Script

# Etape 1 : Ping du serveur pour tester la disponibilité
# Etape 2 : Si Ping OK, récupération des infos : Fabricant, Modèle, CPU, Mémoire...
# Etape 3 : Affichage des infos dans la console

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

# Lire la liste des serveurs
$listserveurs = Get-Content "listeserveurs.txt"

foreach ($ligne in $listserveurs) {
    # Séparer serveur / login / mot de passe
    $decoupageligne = $ligne.Split(",")
    $serveur   = $decoupageligne[0]
    $login     = $decoupageligne[1]
    $stringpwd = $decoupageligne[2]
    $pwd = ConvertTo-SecureString $stringpwd -AsPlainText -Force

    # Ping WMI du serveur courant
    $resultatsPing = Get-WmiObject -Query "select StatusCode from Win32_PingStatus where Address = '$serveur'"
    $reponse = $false
    ForEach ($resultat in $resultatsPing) {
        if ($resultatsPing.StatusCode -eq 0) { $reponse = $true }
    }

    if ($reponse) {
        Write-Host -ForegroundColor "green" =========================================
        Write-Host -ForegroundColor "green" Ping Serveur $serveur --> OK
        Write-Host -ForegroundColor "green" =========================================
        $credential = New-Object -TypeName System.Management.Automation.PSCredential `
            -ArgumentList $login,$pwd -ErrorAction "SilentlyContinue"

        # ComputerSystemInfo
        Write-Host ---------------------------
        Write-Host --> ComputerSystemInfo
        Write-Host ---------------------------
        $computersysteminfo = Get-WmiObject -Query "select * from Win32_ComputerSystem" `
            -ComputerName $serveur -Credential $credential |
            Select Name,Model,Manufacturer,Description,DNSHostName,Domain,DomainRole,`
                PartOfDomain,NumberOfProcessors,SystemType,TotalPhysicalMemory,UserName,Workgroup
        Write-Host Nom Serveur : $computersysteminfo.Name
        Write-Host Model : $computersysteminfo.Model
        Write-Host Domaine : $computersysteminfo.Domain
        Write-Host Constructeur : $computersysteminfo.Manufacturer
        Write-Host Type Architecture : $computersysteminfo.SystemType
        $taillememoire = [math]::round([int]$computersysteminfo.TotalPhysicalMemory / (1024*1024*1024), 1)
        Write-Host Mémoire Physique Totale : $taillememoire Go

        # OperatingSystemInfo
        Write-Host ---------------------------
        Write-Host --> OperatingSystemInfo
        Write-Host ---------------------------
        $operatingsysteminfo = Get-WmiObject Win32_OperatingSystem -ComputerName $serveur -Credential $credential
        Write-Host OS : $operatingsysteminfo.Caption

        # Infos disque
        Write-Host ---------------------------
        Write-Host --> Disques Info
        Write-Host ---------------------------
        $Disques = Get-WmiObject Win32_LogicalDisk -ComputerName $serveur -Credential $credential |
            Where { $_.Name -ne "A:" -and $_.DriveType -eq "3" }
        foreach ($disque in $Disques) {
            $espacelibre = [math]::round($disque.FreeSpace / (1024*1024*1024), 1)
            $tailletotaledisque = [math]::round($disque.Size / (1024*1024*1024), 1)
            Write-Host Disque $disque.Name Taille totale = $tailletotaledisque Go Espace libre = $espacelibre Go
        }

        # Info processeur
        Write-Host ---------------------------
        Write-Host --> Processeur Info
        Write-Host ---------------------------
        $processor = Get-WmiObject Win32_Processor -ComputerName $serveur -Credential $credential
        foreach ($proc in $processor) {
            Write-Host "ID: " $proc.DeviceID "Processeur : " $proc.Name ", Fréquence :" $proc.CurrentClockSpeed "MHz Architecture : " -NoNewline
            Switch ($proc.Architecture) {
                0 { "x86" }
                1 { "MIPS" }
                2 { "Alpha" }
                3 { "PowerPC" }
                6 { "Intel Itanium IPF" }
                9 { "x64" }
            }
        }
    }
    else {
        Write-Host -ForegroundColor "red" Ping Serveur $serveur --> KO
    }
}

Voir aussi