Rapport Powershell pour récup infos vitale SVR

Fermé
Magicalgnou - 10 déc. 2014 à 15:25
kelux Messages postés 3074 Date d'inscription vendredi 18 juin 2004 Statut Contributeur Dernière intervention 20 janvier 2023 - 11 déc. 2014 à 09:14
Bonjour,

Je me permet de venir solliciter votre aide car j'aimerais créer un rapport en powershell pour récupérer un certains nombres d'éléments sur un serveur (CPU, memory, etc.)

J'ai trouvé un script que j'ai modifié mais je reste bloqué sur deux problématique.

1/ Il faudrait que je puisse l'exécuter à distance en mode administrateur
2/ Une section ne fonctionne pas (Virtual Machine Utilization Report)




# Variables
$filedate = get-date
$computer = gc env:computername
$metricsData = get-vm | measure-vm
$tableColor = "WhiteSmoke"
$errorColor = "Red"
$warningColor = "Yellow"
$FromEmail = "Mail"
$ToEmail = "Mail"

# Establish Connection to SMTP server
$smtpServer = "smtpauth.intra.genapi.fr"
#$smtpCreds = new-object Net.NetworkCredential("user", "MDP")
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.UseDefaultCredentials = $false
#$smtp.Credentials = $smtpCreds

# HTML Style Definition
$message = "<!DOCTYPE html PUBLIC`"-//W3C//DTD XHTML 1.0 Strict//EN`" `"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd`">"
$message = "<html xmlns=`"http://www.w3.org/1999/xhtml`"><body>"
$message = "<style>"
$message = $message + "TABLE{border-width:2px;border-style: solid;border-color: #C0C0C0 ;border-collapse: collapse;width: 100%}"
$message = $message + "TH{border-width: 2px;padding: 0px;border-style: solid;border-color: #C0C0C0 ;text-align: left}"
$message = $message + "TD{border-width: 2px;padding: 0px;border-style: solid;border-color: #C0C0C0 ;text-align: left}"
$message = $message + "TD{border-width: 2px;padding: 0px;border-style: solid;border-color: #C0C0C0 ;text-align: left}"
$message = $message + "H1{font-family:Calibri;}"
$message = $message + "H2{font-family:Calibri;}"
$message = $message + "Body{font-family:Calibri;}"
$message = $message + "</style>"

# Title
$message = $message + "<h2>Data for Hyper-V Server '$($computer)' : $($filedate)</h2>"

# EventLog
$message = $message + "<style>TH{background-color:$($errorColor)}TR{background-color:$($tableColor)}</style>"
$message = $message + "<B>Parent EventLog</B> <br> <br>"
$message = $message + "Errors: <br>" + ((Get-EventLog system -after (get-date).AddHours(-24) -entryType Error) | `
Select-Object @{Expression={$_.InstanceID};Label="ID"}, `
@{Expression={$_.Source};Label="Source"}, `
@{Expression={$_.Message};Label="Message"} `
| ConvertTo-HTML -Fragment) `
+ " <br>"

$message = $message + "<style>TH{background-color:$($warningColor)}TR{background-color:$($tableColor)}</style>"
$message = $message + "Warnings: <br>" + ((Get-EventLog system -after (get-date).AddHours(-24) -entryType Warning) | `
Select-Object @{Expression={$_.InstanceID};Label="ID"}, `
@{Expression={$_.Source};Label="Source"}, `
@{Expression={$_.Message};Label="Message"} `
| ConvertTo-HTML -Fragment) `
+ " <br>"

# Hyper-V EventLog
$message = $message + "<style>TH{background-color:$($errorColor)}TR{background-color:$($tableColor)}</style>"
$message = $message + "<B>Hyper-V EventLog</B> <br> <br>"
$message = $message + "Errors: <br>" + ((Get-WinEvent -FilterHashTable @{LogName ="Microsoft-Windows-Hyper-V*"; StartTime = (Get-Date).AddDays(-1); Level = 2}) | `
Select-Object @{Expression={$_.InstanceID};Label="ID"}, `
@{Expression={$_.Source};Label="Source"}, `
@{Expression={$_.Message};Label="Message"} `
| ConvertTo-HTML -Fragment) `
+ " <br>"

$message = $message + "<style>TH{background-color:$($warningColor)}TR{background-color:$($tableColor)}</style>"
$message = $message + "Warnings: <br>" + ((Get-WinEvent -FilterHashTable @{LogName ="Microsoft-Windows-Hyper-V*"; StartTime = (Get-Date).AddDays(-1); Level = 3}) | `
Select-Object @{Expression={$_.InstanceID};Label="ID"}, `
@{Expression={$_.Source};Label="Source"}, `
@{Expression={$_.Message};Label="Message"} `
| ConvertTo-HTML -Fragment) `
+ " <br>"

# VM Health
$message = $message + "<style>TH{background-color:Indigo}TR{background-color:$($errorColor)}</style>"
$message = $message + "<B>Virtual Machine Health</B> <br> <br>"
$message = $message + "Virtual Machine Health: <br>" + ((Get-VM | `
Select-Object @{Expression={$_.Name};Label="Name"}, `
@{Expression={$_.State};Label="State"}, `
@{Expression={$_.Status};Label="Operational Status"}, `
@{Expression={$_.UpTime};Label="Up Time"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>Operating normally</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($warningColor)`"><td>")}else{$_}} `
| %{if($_.Contains("<td>Running</td><td>Operating normally</td>")){$_.Replace("<tr style=`"background-color:$($warningColor)`"><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
# VM Replication Health
$message = $message + "<style>TH{background-color:Indigo}TR{background-color:$($errorColor)}</style>"
$message = $message + "<B>Virtual Machine Replication Health</B> <br> <br>"
$message = $message + "Virtual Machine Replication Health: <br>" + ((Get-VM | `
Select-Object @{Expression={$_.Name};Label="Name"}, `
@{Expression={$_.ReplicationState};Label="State"}, `
@{Expression={$_.ReplicationHealth};Label="Health"}, `
@{Expression={$_.ReplicationMode};Label="Mode"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>Replicating</td><td>Normal</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"

# Storage Health
$message = $message + "<style>TH{background-color:DarkGreen}TR{background-color:$($errorColor)}</style>"
$message = $message + "<B>Storage Health</B> <br> <br>"
$message = $message + "Physical Disk Health: <br>" + ((Get-PhysicalDisk | `
Select-Object @{Expression={$_.FriendlyName};Label="Physical Disk Name"}, `
@{Expression={$_.DeviceID};Label="Device ID"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"}, `
@{Expression={"{0:N2}" -f ($_.Size / 1073741824)};Label="Size (GB)"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
$message = $message + "Storage Pool Health: <br>" + ((Get-StoragePool | `
where-object {($_.FriendlyName -ne "Primordial")} | `
Select-Object @{Expression={$_.FriendlyName};Label="Storage Pool Name"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"
$message = $message + "Virtual Disk Health: <br>" + ((Get-VirtualDisk | `
Select-Object @{Expression={$_.FriendlyName};Label="Virtual Disk Name"}, `
@{Expression={$_.OperationalStatus};Label="Operational Status"}, `
@{Expression={$_.HealthStatus};Label="Health Status"} `
| ConvertTo-HTML -Fragment) `
| %{if($_.Contains("<td>OK</td><td>Healthy</td>")){$_.Replace("<tr><td>", "<tr style=`"background-color:$($tableColor)`"><td>")}else{$_}}) `
+ " <br>"

# VM Metrics
$message = $message + "<style>TH{background-color:blue}TR{background-color:$($tableColor)}</style>"
$message = $message + "<B>Virtual Machine Utilization Report</B> <br> <br> "

$message = $message + "CPU utilization data: <br>" + ($metricsData | `
select-object @{Expression={$_.VMName};Label="Virtual Machine"}, `
@{Expression={$_.AvgCPU};Label="Average CPU Utilization (MHz)"} `
| ConvertTo-HTML -Fragment) `
+" <br>"
$message = $message + "Memory utilization data: <br>" + ($metricsData | `
select-object @{Expression={$_.VMName};Label="Virtual Machine"}, `
@{Expression={$_.AvgRAM};Label="Average Memory (MB)"}, `
@{Expression={$_.MinRAM};Label="Minimum Memory (MB)"}, `
@{Expression={$_.MaxRAM};Label="Maximum Memory (MB)"} `
| ConvertTo-HTML -Fragment) `
+" <br>"
$message = $message + "Network utilization data: <br>" + ($metricsData | `
select-object @{Expression={$_.VMName};Label="Virtual Machine"}, `
@{Expression={"{0:N2}" -f (($_.NetworkMeteredTrafficReport | where-object {($_.Direction -eq "Inbound")}`
| measure-object TotalTraffic -sum).sum / 1024)};Label="Inbound Network Traffic (GB)"}, `
@{Expression={"{0:N2}" -f (($_.NetworkMeteredTrafficReport | where-object {($_.Direction -eq "Outbound")} `
| measure-object TotalTraffic -sum).sum / 1024)};Label="Outbound Network Traffic (GB)"} `
| ConvertTo-HTML -Fragment) `
+" <br>"
$message = $message + "Disk utilization data: <br>" + ($metricsData | `
select-object @{Expression={$_.VMName};Label="Virtual Machine"}, `
@{Expression={"{0:N2}" -f ($_.TotalDisk / 1024)};Label="Disk Space Used (GB)"} `
| ConvertTo-HTML -Fragment) `
+" <br>"
$message = $message + "Metering Duration data: <br>" + ($metricsData | `
select-object @{Expression={$_.VMName};Label="Virtual Machine"}, `
@{Expression={$_.MeteringDuration};Label="Metering data duration"} `
| ConvertTo-HTML -Fragment) `
+" <br>"


$email = new-object Net.Mail.MailMessage
$email.Subject = "Hyper-V Server Report: $($filedate)"
$email.From = new-object Net.Mail.MailAddress($FromEmail)
$email.IsBodyHtml = $true
$email.Body = $message
$email.To.Add($ToEmail)

# Send Email
$smtp.Send($email)




Merci d'avance

Florent

1 réponse

kelux Messages postés 3074 Date d'inscription vendredi 18 juin 2004 Statut Contributeur Dernière intervention 20 janvier 2023 432
Modifié par kelux le 11/12/2014 à 09:15
Bonjour,

Ceci est un script que vous avez surement copié/collé non ?

Il semblerait qu'il sagisse d'un script de health check d'un serveur HyperV (en l'occurence en local), et notamment les VMs qui sont dessus.
Le tout mis dans un Mail au format html.


Dans un premier temps, est ce que votre but est de faire cela sur un hôte HyperV ?

-

1/ Il faudrait que je puisse l'exécuter à distance en mode administrateur

Pour interroger à distance, via les CMDlets Powershell, il faut ajouter le/les serveur(s) à la cmdlet.

pour Get-VM on utilisera :
 get-VM -ComputerName server01.domain.fqdn 


pour les autres cmdlets, c'est le même principe. (dans le script celles qui commencent par get-* )

Si vous voulez utiliser un autre compte pour lancer à distance ce script (la machine de destination requiert un compte particulier pour être administrée) ; il faut passer par les méthodes
get-credential
et parfois
invoke-command
. Cela dépend des cmdlets utilisées.

2/ Une section ne fonctionne pas (Virtual Machine Utilization Report)

Les mots "ça ne marche pas" n'aident pas beaucoup.
Je suppose que le message d'erreur aurait été :"
The term 'Get-VM' is not recognized as the name of a cmdlet........


Si c'est le cas il faut importer le module virtualmachinemanager
Import-Module virtualmachinemanager


Sinon, c'est que vous avez copié ce script sans comprendre son utilité, et vous n'avez pas d'hôte HyperV.



Using a registry "compactor" on top of a registry "cleaner" would be equivalent to rinsing your throat with a swig of Jack Daniels after swallowing a pint of snake oil....
0