juillet
2010
Automatiser la collecte des caractériques physiques de toutes les machines du réseau :
Fabricant – Modèle – Architecture – OS – CPU – Mémoire Physique – Capacité disque
#/*********************************************************************************************************
# DESCRIPTION : Afficher pour un ensemble de serveurs les caractéristiques du hardware :
# Fabricant – Modèle – Architecture – OS – CPU – Mémoire Physique – Capacité disque dur
# Auteur : Etienne ZINZINDOHOUE
#*********************************************************************************************************/
I – LES ETAPES
======================================================================
# Etape 0 : Préparer le fichier listeserveurs.txt contenant les infos : login/password
Exemple de fichier listeserveurs.txt
IpMachine1,domaine\loginwindowsmachine1,pwdwindowsmachine1
IpMachine2,domaine\loginwindowsmachine2,pwdwindowsmachine2
# Etape 1 : Ping du serveur pour tester la disponibilité
# Etape 2 : Si Ping OK alors on récupère les infos : Fabricant,Modèle,CPU, Mémoire,…
# Etape 3 : Affichage des infos dans la console
II – LE SCRIPT
======================================================================
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
#Lire le contenu du fichier contenant la liste des serveurs
$listserveurs = get-content "listeserveurs.txt"
#Se positionner sur le nom du serveur
foreach ($ligne in $listserveurs) {
# Separate the server and instance names
$decoupageligne = $ligne.split(",")
$serveur = $decoupageligne[0]
$login = $decoupageligne[1]
$stringpwd = $decoupageligne[2]
$pwd = convertto-securestring $stringpwd -asplaintext -force;
#Pour chaque ligne de la liste des serveurs
# Pingé le 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) {
# le serveur courant répond au ping
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 Total : $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 ) {
# espaces disques
$espacelibre = [math]::round($disque.freespace / (1024*1024*1024),1)
$tailletotaledisque = [math]::round($disque.size / (1024*1024*1024),1)
#$size = [math]::round($size, 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 {
# le serveur courant ne répond au ping
Write-Host -foregroundcolor "red" Ping Serveur $serveur --> KO
}
}
#/*********************************************************************************************************
# DESCRIPTION : Afficher pour un ensemble de serveurs les caractéristiques du hardware :
# Fabricant – Modèle – Architecture – OS – CPU – Mémoire Physique – Capacité disque dur
# Auteur : Etienne ZINZINDOHOUE
#*********************************************************************************************************/
Merci pour tes contributions.
Salut,
qq remarques sur ton script,en passant il y a une coquille dans le titre de ton post.
Je ne pense pas que le chargement de l’assembly « Microsoft.SqlServer.SMO » soit nécessaire dans ce contexte.
Tu peux utiliser l’affectation multiple :
$serveur, $login, $stringpwd =$ligne.split(« , »)
$serveur;$login;$stringpwd
Tu peux simplifier ce code
if ($resultatsPing.statuscode -eq 0) {
$reponse = $true
}
en
$reponse =$resultatsPing.statuscode -eq 0
et celui-ci
$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
en
$computersysteminfo = Get-WMIObject -query « select Name,Model,Manufacturer,Description,Domain,DomainRole,SystemType,TotalPhysicalMemory,UserName,Workgroup from Win32_ComputerSystem » -computername $serveur -credential $credential
Du coup on s’aperçoit que sous certaines versions de l’OS, les propriétés DNSHostName et PartOfDomain n’existent pas et que NumberOfProcessors renseignera le nb de processeur logique et non plus physique !
Tu devrais prendre en charge ces cas là par un test sur l’OS cible.
Tu supposes le service WMI running, il peut être stoppé ou en pause.
Si le serveur ne répond pas au ping tu devrais plutot faire un Write-Error (erreur non bloquante).
Enfin le fait de coupler la recherche et l’affichage des données ne permet pas de réutiliser les données, par exemple pour un export.
De scinder ton script en deux, un pour récupérer les données dans un objet personnalisé, l’autre dédié à l’affichage des données produite par le premier.
Suivre le principe du pipeline