Benutzer mit den meisten Antworten
Serverüberwachung

Frage
-
Hallo zusammen
Ich habe wieder einmal meine Probleme mit einem Skript.
Ich schreibe ein Skript, bei welchem ich etwa 200 Server überprüfen muss.
Bei jedem lese ich ungefähr folgene Teile aus:
- Services, welche auf Atomatisch sind aber gestoppt
- Eventlog System die letzten 10 Error und Warning Events
- Eventlog Applikation die letzten 10 Error und Warning Events
- WSUS Updates, welche nicht installiert wurden, obwohl Sie hätten müssen und solche, welche nicht successful sind
- generelle Systeminformationen (OS, Prozessorlast, Diskspace, etc.)Alle diese Informationen sollen in eine Datenbank gespeichert werden.
Nun weiss ich wie ich die meisten Dinge abfragen kann, jedoch ist es ziemlich umständlich und mühsam und langsam.Da bei 200 Server die Performance sehr schnell verloren geht und eine Kompatibilität (Windows Server 2003 + 2008) gewährleistet werden muss, wollte ich fragen wie ihr das am besten machen würdet.
Damit Abfragen zeitgleich ablaufen können, habe ich an Powershell Jobs gedacht.
Jedoch weiss ich nicht genau, wie ich so viele unterschiedliche Daten mit Receive-Job erhalten kannIch habe momentan einen solche Ablauf:
Serverliste als Array
Für jeden Server:
Invoke Command als Job
Alle Informationen abfragen
Job receiven
In Datenbank schreibenCodeSnippets:
Get-WmiObject -Query "select * from win32_Service where StartMode='Auto' and State='Stopped'" Get-EventLog -LogName System -Newest 10 -EntryType Error,Warning Get-EventLog -LogName Application -Newest 10 -EntryType Error,Warning (Get-WmiObject -Query "SELECT LoadPercentage FROM win32_processor" | Select LoadPercentage).LoadPercentage $GWOMemory = Get-WmiObject -Query "SELECT FreePhysicalMemory,TotalVisibleMemorySize FROM Win32_OperatingSystem" | Select FreePhysicalMemory,TotalVisibleMemorySize $GWODisk = Get-WmiObject -Query "SELECT PercentFreeSpace,PercentFreeSpace_Base FROM Win32_PerfRawData_PerfDisk_LogicalDisk" | Select PercentFreeSpace,PercentFreeSpace_Base $DiskPercent = [System.Math]::Round((($GWODisk[0].PercentFreeSpace / $GWODisk[0].PercentFreeSpace_Base)*100), 0) $MemoryPercent = [System.Math]::Round((($GWOMemory.FreePhysicalMemory / $GWOMemory.TotalVisibleMemorySize)*100), 0)
Habt ihr vielleicht einige Ideen, Anmerkungen, Tipps?
Mfg Powerturtle
- Bearbeitet Powerturtle Dienstag, 10. Juli 2012 10:54
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 12. Juli 2012 13:59 Titel angepasst
Antworten
-
Moin,
an der Performance läßt sich nicht so viel optimieren. PowerShell Remoting gewinnt hier keine Preise, dafür ist es extrem einfach und flexibel.
Du willst verschiedene Daten von einem System abfragen und hast - wenn ich Deine Frage richtig verstanden habe - das Problem, daß schlicht zu viel verschiedene Datentypen in einem Array liegen und diese Daten somit nicht zu handhaben sind. Wenn dem so ist, könnte das folgende Script helfen, das ich in meinen Workshops als essentiell wichtig beim Thema Remoting betone. Dieses Script baut ein Objekt mit den nötigen Eigenschaften, weist dann die Werte den Eigenschaften zu und gibt somit pro Maschine nur EIN Objekt zurück und nicht ein unbestimmte Anzahl. Anstatt eines synthetischen Objekts könnte auch ein HashTable genutzt werden – Geschmacksache.Aufrufen kannst Du das Script dann auch via Invoke-Command.
$result = New-Object System.Object | Select-Object -Property HotFixes,Services,OSInfo,CurrentTime,SystemEventLog, ApplicationEventLog,Disks,Processes,IPConfig Write-Host "Getting Hotfixes from computer $($env:ComputerName)" $result.HotFixes = Get-HotFix Write-Host "Finished getting hotfixes from computer $($env:ComputerName)" Write-Host "Getting services from computer $($env:ComputerName)" $result.Services = Get-Service Write-Host "Getting OSInfo from computer $($env:ComputerName)" $result.OSInfo = Get-WmiObject -Class Win32_OperatingSystem $result.CurrentTime = Get-Date Write-Host "Getting system events from computer $($env:ComputerName)" $result.SystemEventLog = Get-EventLog ` -LogName system -Newest 50 Write-Host "Getting Hotfixes from computer $($env:ComputerName)" $result.ApplicationEventLog = Get-EventLog ` -LogName application -Newest 50 $result.Disks = Get-WmiObject -Class Win32_LogicalDisk $result.Processes = Get-Process $result.IPConfig = ipconfig /all return $result
HTH,
Raimund- Als Antwort markiert Powerturtle Mittwoch, 11. Juli 2012 08:51
Alle Antworten
-
Lösung 1
Du kannst dein SKript so gestalten das du Recive Job garnicht brauchst!
Schreib doch die Daten mit dem Skript direkt in die Datenbank!
Fehler beim ausführen, werden natürlich auch in die Datenbank geschrieben!Lösung 2
Man kann auch die last verteilen wenn alle Server PowerShell Installiert haben:
1. Das Skript auf ein Share legen an das alle Server herankommen
2. Mit PowerShell richtest du Remote auf allen Servern ein Sheduled Job (Tasksheduler)ein, der das Skript vom Share ausführt
3. siehe Lösung 1 ;-)Dadurch kannst du das Skript immer Zenral ändern und die Last ist verteilt!
Man sollte sich als Admin sowieso ein Zentrales Repository, mit Skripten und DOS Befehlen einrichten (Sysinternal Tools usw...)
Dann kann man diese Unternehmensweit nutzen.
Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '- Bearbeitet Peter Kriegel Dienstag, 10. Juli 2012 12:29
-
Vielen Dank für deine Antwort.
Ich habe diese zwei Lösungen angeschaut, jedoch sind beide ungeeignet für uns.
Bei Lösung eins, gibt es das Problem, dass nicht alle Server Zugriff auf die Datenbank haben.
Bei Lösung zwei ist es nicht gewünscht auf jedem Server einen Scheduled Task zu erstellen.
Ich muss wohl doch mit Jobs arbeiten...
Gruss Powerturtle
-
Moin,
an der Performance läßt sich nicht so viel optimieren. PowerShell Remoting gewinnt hier keine Preise, dafür ist es extrem einfach und flexibel.
Du willst verschiedene Daten von einem System abfragen und hast - wenn ich Deine Frage richtig verstanden habe - das Problem, daß schlicht zu viel verschiedene Datentypen in einem Array liegen und diese Daten somit nicht zu handhaben sind. Wenn dem so ist, könnte das folgende Script helfen, das ich in meinen Workshops als essentiell wichtig beim Thema Remoting betone. Dieses Script baut ein Objekt mit den nötigen Eigenschaften, weist dann die Werte den Eigenschaften zu und gibt somit pro Maschine nur EIN Objekt zurück und nicht ein unbestimmte Anzahl. Anstatt eines synthetischen Objekts könnte auch ein HashTable genutzt werden – Geschmacksache.Aufrufen kannst Du das Script dann auch via Invoke-Command.
$result = New-Object System.Object | Select-Object -Property HotFixes,Services,OSInfo,CurrentTime,SystemEventLog, ApplicationEventLog,Disks,Processes,IPConfig Write-Host "Getting Hotfixes from computer $($env:ComputerName)" $result.HotFixes = Get-HotFix Write-Host "Finished getting hotfixes from computer $($env:ComputerName)" Write-Host "Getting services from computer $($env:ComputerName)" $result.Services = Get-Service Write-Host "Getting OSInfo from computer $($env:ComputerName)" $result.OSInfo = Get-WmiObject -Class Win32_OperatingSystem $result.CurrentTime = Get-Date Write-Host "Getting system events from computer $($env:ComputerName)" $result.SystemEventLog = Get-EventLog ` -LogName system -Newest 50 Write-Host "Getting Hotfixes from computer $($env:ComputerName)" $result.ApplicationEventLog = Get-EventLog ` -LogName application -Newest 50 $result.Disks = Get-WmiObject -Class Win32_LogicalDisk $result.Processes = Get-Process $result.IPConfig = ipconfig /all return $result
HTH,
Raimund- Als Antwort markiert Powerturtle Mittwoch, 11. Juli 2012 08:51