Server Festplatten Überwachung mit PowerShell
Hallo meine Lieben mit Administratoren,
heute habe ich ein etwas Komplexeres Problem. Ich versuche seit kurzem den Speicher Verbrauch unsere Server per PowerShell abzugreifen und dan in eine MS SQL Datenbanck zu schreiben.
Die Übertragung von PowerShell zu dem SQL Server an sich funktioneirt aber ich habe einen Großen Code Teil von http://www.sqlprofessionals.com und habe ein kleines problem mit der Umarbeitung.
An sich funktioniert das auch alles recht gut, wenn nicht sogar zu gut. Alle Festplatten werden ausgelessen und auch in den SQL Server geschrieben, aber ich würde mir etwas aus der Rubrik für die Übertragung wünschen:
(Rein vom Output nicht von der Formatirung)
Was ich aber Bekomme ist das (und das ist nur ein Ausschnitt):
die Richtige platte ist zwar dabei aber halt auch viele andere. Zusätzlich doppeln sich die Laufwerk buchstaben.
Wenn es jetzt also nur noch die Richtigen Platten angezeigt werden würden währe alles perfekt.
Ich habe ja die vermututng das es mit dem CIMV2 zusammenhängt aber ich weiß nicht wie ich es richtig raus bekommen soll.
Ich würde mich über jede hilfe freuen da ich langsam alles was mir ein fiel versucht habe. Vielen Dank im Vorraus.
Mit Freundlichen Grüßen
GeretCondit
heute habe ich ein etwas Komplexeres Problem. Ich versuche seit kurzem den Speicher Verbrauch unsere Server per PowerShell abzugreifen und dan in eine MS SQL Datenbanck zu schreiben.
Die Übertragung von PowerShell zu dem SQL Server an sich funktioneirt aber ich habe einen Großen Code Teil von http://www.sqlprofessionals.com und habe ein kleines problem mit der Umarbeitung.
$servers = get-content "C:\<pfad>\Server.txt"
foreach ( $server in $servers){
[object]$Volumes = Get-WmiObject -NameSpace "root/cimv2" -ComputerName $servers Win32_Volume -Filter "DriveType = 3" ;
[string]$XmlData = "<root><cimv2>";
$Volumes | % { $XmlData = $XmlData + "<Win32_Volume Name=`"" + $server + "`" DriveLetter=`"" + $_.DriveLetter + "`" Capacity=`"" + $_.Capacity + "`" FreeSpace=`"" + $_.FreeSpace + "`"></Win32_Volume>" };
$XmlData = $XmlData + "</cimv2></root>";
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = "Data Source=<DB>;Initial Catalog=Speicherauslastung;Integrated Security=True;";
$SqlConnection.Open();
$SqlCommand = New-Object System.Data.SqlClient.SqlCommand;
$SqlCommand.CommandTimeout = 120;
$SqlCommand.Connection = $SqlConnection;
$SqlCommand.CommandText = "EXECUTE [dbo].[InsertDiskVolume] @XmlData = N'$XmlData';";
$Result = $SqlCommand.ExecuteNonQuery();
$SqlConnection.Close();
}
An sich funktioniert das auch alles recht gut, wenn nicht sogar zu gut. Alle Festplatten werden ausgelessen und auch in den SQL Server geschrieben, aber ich würde mir etwas aus der Rubrik für die Übertragung wünschen:
(Rein vom Output nicht von der Formatirung)
Was ich aber Bekomme ist das (und das ist nur ein Ausschnitt):
die Richtige platte ist zwar dabei aber halt auch viele andere. Zusätzlich doppeln sich die Laufwerk buchstaben.
Wenn es jetzt also nur noch die Richtigen Platten angezeigt werden würden währe alles perfekt.
Ich habe ja die vermututng das es mit dem CIMV2 zusammenhängt aber ich weiß nicht wie ich es richtig raus bekommen soll.
Ich würde mich über jede hilfe freuen da ich langsam alles was mir ein fiel versucht habe. Vielen Dank im Vorraus.
Mit Freundlichen Grüßen
GeretCondit
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 284141
Url: https://administrator.de/contentid/284141
Ausgedruckt am: 24.11.2024 um 05:11 Uhr
17 Kommentare
Neuester Kommentar
Moin GeretCondit,
Gruß grexit
aber ich würde mir etwas aus der Rubrik für die Übertragung wünschen:
Und was genau ??Wenn es jetzt also nur noch die Richtigen Platten angezeigt werden würden währe alles perfekt.
Und welche sind bei dir die "richtigen" Platten ?Ich würde mich über jede hilfe freuen da ich langsam alles was mir ein fiel versucht habe.
Und wir uns über Konkretisierung deiner gewünschten Ausgabe Gruß grexit
Guten Morgen,
was gibt eine Ausgabe mit diesem Code?
Ich würde deine Abfrage genauer spezifiezieren(siehe oben). Dann hast du im Zweifel weniger Fehlerquellen.
Falls es ein virtueller Server(VMWare) ist, ich könnte die einpowerCli-Skript zur Verfügung stellen.
was gibt eine Ausgabe mit diesem Code?
Get-WmiObject win32_volume -computername vm-pc | Select-Object Name, Capacity, freespace | where Name -like "*:\" | where freespace -gt 0.5 | fl
Ich würde deine Abfrage genauer spezifiezieren(siehe oben). Dann hast du im Zweifel weniger Fehlerquellen.
Falls es ein virtueller Server(VMWare) ist, ich könnte die einpowerCli-Skript zur Verfügung stellen.
> $servers = get-content "C:\<pfad>\Server.txt"
>
> foreach ( $server in $servers){
> > [object]$Volumes = Get-WmiObject -NameSpace "root/cimv2" -ComputerName $servers Win32_Volume -Filter "DriveType = 3" ;
> [string]$XmlData = "<root><cimv2>";
>
> $Volumes | % { $XmlData = $XmlData + "<Win32_Volume Name=`"" + $server + "`" DriveLetter=`"" + $_.DriveLetter + "`" Capacity=`"" + $_.Capacity + "`" FreeSpace=`"" + $_.FreeSpace + "`"></Win32_Volume>" };
Ist es gewollt, dass du in deiner Foreach-Schleife noch ein foreach hast?
$Volumes | % {
Das ist der Auszug aus einem meiner Skripte:
Das müsste eig. deine Anforderung komplett erfüllen.
Wenn du willst, kann ich dir den Rest auch geben (HTMl/css-Formatierung + Mail-Versand)
clear-host
$server = ListeanServern
Get-WmiObject win32_logicaldisk -ComputerName $Server | where{$_.DriveType -eq 3} |select `
@{Expression={$_.PSComputername};Label="System"}, `
@{Expression={$_.DeviceID};Label="Partition"}, `
@{Expression={[decimal]("{0:N0}" -f($_.Size/1gb))};Label="Max.(GB)"},`
@{Expression={[decimal]("{0:N0}" -f($_.Freespace/1GB))};Label="Frei(GB)"}, `
@{Expression={if((($_.freespace/1gb)/($_.size/1gb))*100-gt 10) {"{0:P0}" -f(($_.freespace/1gb)/($_.size/1gb))}else{"{0:P0}" -f(($_.freespace/1gb)/($_.size/1gb))}};Name="Frei(%)"}, `
@{Expression={if((($_.freespace/1gb)/($_.size/1gb))*100-gt 10) {"OK"}else{"Warnung"}};Name="Status"}
Das müsste eig. deine Anforderung komplett erfüllen.
Wenn du willst, kann ich dir den Rest auch geben (HTMl/css-Formatierung + Mail-Versand)
Zitat von @GeretCondit:
Zur erklärung was ich mit "Jeder Server mit jeder Festplatte" meine. Die einträge werden für jden Server abgefahren aber jeder Server zeigt auch die Platten der anderen server + seine eigenen an.
Kein Wunder .... Schau dir mal die Variable für Computername an Zur erklärung was ich mit "Jeder Server mit jeder Festplatte" meine. Die einträge werden für jden Server abgefahren aber jeder Server zeigt auch die Platten der anderen server + seine eigenen an.
Get-WmiObject -NameSpace "root/cimv2" -ComputerName $servers