Question controler l'intégrité d'un volume, chkdsk distant

Plus d'informations
il y a 16 ans 6 mois #5319 par Burgun
Merci beaucoup pour votre aide. Voici le résultat final

[code:1]
#Interrogation de l'état du filesystem sur une liste de serveur

#Création du fichier bilan
echo \"Résultat du relevé\" > c:\bilan.txt
echo \" \" >> c:\bilan.txt

#Relevé du compte pour le domaine
Write-Host \"Entrez le compte à utiliser pour se connecter aux serveurs dans le domaine (sous la forme domaine\compte-su)\"
$userDom=Get-Credential
#Récupération du nom du compte
$CompteDOM=($userDom.Username)
#Décryptage du password pour le récuperer en clair
$PassDOM=$userDom.GetNetworkCredential().Password

#Relevé du compte pour la DMZ
Write-Host \"Entrez le compte à utiliser pour se connecter aux serveurs en DMZ (ex : administrator)\"
$userDMZ=Get-Credential
$CompteDMZ=($userDMZ.Username)
$PassDMZ=$userDMZ.GetNetworkCredential().Password


#Demande du chemin qui contient psexec
$Binaire=read-host \"Veuillez taper le chemin complet du dossier sur votre pc qui contient psexec (pas de \ à la fin) : ex c:\pstools\"

#Traitement des serveurs sur le domaine
echo \"Serveur en Domaine\" >> c:\bilan.txt
Get-Content -Path C:\Liste\S_domaine.txt | ForEach-Object {
#Intérogation de la config disque
$Disks=Get-WmiObject -ComputerName $_ -Credential $userDom Win32_LogicalDisk
#Séparation des informations par partition
$D=$Disks | Where-Object {$_.DeviceID -match \"D:\"}
$E=$Disks | Where-Object {$_.DeviceID -match \"E:\"}
$P=$Disks | Where-Object {$_.DeviceID -match \"P:\"}
$M=$Disks | Where-Object {$_.DeviceID -match \"M:\"}
$N=$Disks | Where-Object {$_.DeviceID -match \"N:\"}
#Controle de la partition C:
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk c:\"
#Lancement de la commande de chkdsk
$Res=Invoke-Expression $Commande
#Recherche du contenu \"Windows found problems\"
$Erreur=$Res | Select-String \"Windows found problems\"
#Si \"Windows found problems\" détectée, alors indiquer que le filesystem à des problèmes
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur C: detectées\" >> c:\bilan.txt
}
#Controle de la patition D:
if (($D -ne $Null) -and ($D -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk d:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur D: detectées\" >> c:\bilan.txt
}
}
#Controle de la patition E:
if (($E -ne $Null) -and ($E -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk e:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur E: detectées\" >> c:\bilan.txt
}
}
#Controle de la patition P:
if (($P -ne $Null) -and ($P -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk p:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur p: detectées\" >> c:\bilan.txt
}
}
#Controle de la patition M:
if (($M -ne $Null) -and ($M -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk m:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur M: detectées\" >> c:\bilan.txt
}
}
#Controle de la patition N:
if (($N -ne $Null) -and ($N -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDOM -p $PassDOM chkdsk n:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur N: detectées\" >> c:\bilan.txt
}
}
}

echo \" \" >> c:\bilan.txt

#Traitement des serveurs en dmz
echo \"Serveur en DMZ\" >> c:\bilan.txt
Get-Content -Path C:\Liste\S_Dmz.txt | ForEach-Object {
#Intérogation de la config disque
$Disks=Get-WmiObject -ComputerName $_ -Credential $userDMZ Win32_LogicalDisk
#Séparation des informations par partition
$D=$Disks | Where-Object {$_.DeviceID -match \"D:\"}
$E=$Disks | Where-Object {$_.DeviceID -match \"E:\"}

#Controle de la partition C:
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDMZ -p $PassDMZ chkdsk c:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur C: detectées\" >> c:\bilan.txt
}
#Controle de la patition D:
if (($D -ne $Null) -and ($D -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDMZ -p $PassDMZ chkdsk d:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur D: detectées\" >> c:\bilan.txt
}
}
#Controle de la partition E:
if (($E -ne $Null) -and ($E -ne [String]::Empty)) {
$Commande=\"$Binaire\psexec.exe \\$_ -u $CompteDMZ -p $PassDMZ chkdsk e:\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$_ erreurs sur E: detectées\" >> c:\bilan.txt
}
}


}

echo \" \" >> c:\bilan.txt

#Préparation du mail
$expediteur = \"chkdsk@domaine.com\"
$destinataire = \"serviceinfo@domaine.com\"
$serveur = \"smtp.domaine.com\"
$fichier = \"c:\bilan.txt\"
$objet = \"Etat des erreurs disques sur le parc\"
$texte = \"Vous trouverez en pièce jointe un résumé des serveurs ayant des erreurs filesystem sur leurs disques\"

$message = new-object System.Net.Mail.MailMessage $expediteur, $destinataire, $objet, $texte
#Attachement de la pièce jointe
$attachment = new-object System.Net.Mail.Attachment $fichier
$message.Attachments.Add($attachment)
$client = new-object System.Net.Mail.SmtpClient $serveur

#Envoie du mail
$client.Send($message)

[/code:1]

Voila, c'est un peu du bricolage, mais j'ai pu remonter l'ensemble des serveurs sur lesquels il y'avait un chkdsk /f à faire, et le script ne s'est pas trompé.
J'ai une question cependant. J'avais besoin du mot de passe en clair pour le passer en paramètre dans la commande psexec. Je suis tombé au fil des pages google sur cette commande :
$Pass=$user.GetNetworkCredential().Password

j'ai eu beaucoup de chance, car cela marche très bien. Avez vous quelques éclaircissements sur le fonctionnement de cette méthode ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 6 mois #5320 par Laurent Dardenne
bvivi57 écrit:

Avez vous quelques éclaircissements sur le fonctionnement de cette méthode ?

Moi non, mais MSDN peut être utile.
Voir aussi les blogs de MOW et de Lee Holmes qui ont abordé dans le détail ce point.

Sinon pour ton script, tu peux tester si le chemin saisie pour psexec existe, avant de lancer le traitement.
Et puis j'y verrais bien une manipulation de collection de noms de partition, par exemple :
[code:1]
$Partitions=@(\"D\",\"E\",\"P\",\"M\",\"N\"«»)

$Partitions|
Foreach { New-Variable -name $_ -value (\"$($_):\"«»)}

dir variable:?
[/code:1]
pour ton cas :
[code:1]
$Partitions|
Foreach { $current=$_; New-Variable -name $current -value ($Disks | Where-Object {$_.DeviceID -match \"$($current):\"} )}
[/code:1]
Enfin c'est une autre approche, mais elle permettrait de modifier la liste de partition( ajout,suppression,renommage) sans avoir à modifier le reste du script :)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 6 mois #5322 par Laurent Dardenne
Le fait de partir sur le dynamisme autour des variables n'était pas approprié pour ce contexte, une possible factorisation :
[code:1]
$log=\"c:\bilan.txt\"
#Traitement des serveurs en dmz
echo \"Serveur en DMZ\" >> $log
Get-Content -Path C:\Liste\S_Dmz.txt | ForEach-Object {
Function Traitement($Partition,$Computer, $log)
{
process {
if ($_-ne $Null) {
$Commande=\"$Binaire\psexec.exe \\$Computer -u $CompteDOM -p $PassDOM chkdsk $($_.DeviceID)\"
$Res=Invoke-Expression $Commande
$Erreur=$Res | Select-String \"Windows found problems\"
if (($Erreur -ne $Null) -and ($Erreur -ne [String]::Empty)) {
echo \"$Computer erreurs sur $($_.DeviceID) detectées\" >> \"$log\"
}
}
}
}#Traitement
$CompteDOM
$PassDOM
$Partitions =\"(C|D|E|P|M|N)\"
#Interrogation de la config disque
Get-WmiObject -ComputerName $_ -Credential $userDom Win32_LogicalDisk|
Where-Object {$_.DeviceID -match $Partitions}|
Traitement -Computer $_ -Log $log
}
[/code:1]
C'est à améliorer, mais cela reste lisible je pense.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.044 secondes
Propulsé par Kunena