joshuatree
Goto Top

Powershell- Wie bekomme ich die Befehlszeile in ein vernünftiges Script

Hallo,

ich habe Folgenden Aufruf.

Dieser gibt aus was ich haben möchte, nämlich Servernaname, Prozessname, Username und Speichernutzung.

get-wmiobject win32_process|where{$_.name -eq "iexplore.exe"}|where{$_.ws -gt "300000000"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS  

Jetzt möchte ich das in eine Schleife umbauen

So ungfähr

$Serverliste = get-content serverliste.txt

ForEach ($Server in $Serverliste){
get-wmiobject win32_process|where{$_.name -eq "iexplore.exe"}|where{$_.ws -gt "300000000"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS  

}



Jezt kommt meine Frage, ich möchte wenn die Speichernutzung einen Grenzwert überschritten hat ein Event auslösen. Ne Mail an die Admins. Wie bekomme ich diese Zeile auseinander gebaut so das ich die einzelnen Werte ansprechen kann? In dem Fall $_.WS denn wenn der zu groß ist soll ne Mail raus.

Vg
Andreas

Content-Key: 206816

Url: https://administrator.de/contentid/206816

Printed on: April 25, 2024 at 12:04 o'clock

Member: JoshuaTree
JoshuaTree May 22, 2013 at 12:48:05 (UTC)
Goto Top
Habe es verändert und es läuft noch schon mal gut face-smile

$Serverlist = Get-Content serverliste.txt


ForEach ($Server in $Serverlist){

	get-wmiobject win32_process|
	where{$_.name -eq "iexplore.exe"}|  
	where{$_.ws -gt "10000000"}|  
	select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|  
	sort -descending WS

}

Ich würde gerne das Erbnis in eine Variable schreiben das ich meinen Event basteln kann.
Jetzt komme ich mit meinem Powershellwissen an meine Grenzen, wie kann ich das Ergebnis in eine Variable bekommen um es nach jedem Durchlauf(schleife) auswerten zu können?
Danke für die Hilfe
Member: filippg
filippg May 22, 2013 at 19:07:16 (UTC)
Goto Top
Hallo,

nicht alles geht in einer Zeile... aber dafür gibt's ja Variablen.

Ungefähr:
ForEach ($Server in $Serverliste){
  $res = get-wmiobject win32_process| .... sort -descending WS
  if($res.WS -gt 300000){
    write-host Warnung! Prozess: $($res.name), WS: $($res.WS)
  }
}

Gruß

Filipp
Member: JoshuaTree
JoshuaTree May 23, 2013 updated at 07:43:53 (UTC)
Goto Top
Hallo,

leider scheint in die Variable $res nichts geschrieben zu werden.
Denn die Ausgabe bleibt leer.
$Serverlist = Get-Content serverliste.txt

ForEach ($Server in $Serverlist){
	
	$res = get-wmiobject win32_process|where{$_.name -eq "dwm.exe"}|where{$_.ws -gt "100"}|select-object    

__Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS  
	If($res.WS -gt 100){
	write-host Warnung! Prozess: $($res.name), WS: $($res.WS)}

write-host $res
}

Zur kontrolle habe ich die Zeile write-host $res mit rein genommen und hier wird nichts ausgegeben.

Gebe ich dagegen die Zeile direkt ein
get-wmiobject win32_process|where{$_.name -eq "dwm.exe"}|where{$_.ws -gt "100"}|select-object __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS  

Erhalte ich ein Ergebnis:
__SERVER WS name owner
-- ---- -----
Server1 8941568 dwm.exe user1
Server1 8929280 dwm.exe user2
Server1 8921088 dwm.exe user3
Server1 8908800 dwm.exe user4

Woran liegt das?
Member: JoshuaTree
JoshuaTree May 23, 2013 at 09:02:24 (UTC)
Goto Top
Habe gerade noch ein bißchen rumprobiert.

Wenn ich am Prompt Folgendes eingebe. Und danach $a erhalte ich alles wie ich es mir wünsche.
$a=get-wmiobject win32_process|where{$_.name -eq "dwm.exe"}|where{$_.ws -gt "100"}|select-object  __Server,WS,name,@{n="owner";e={$_.getowner().user}}|sort -descending WS  


Gebe ich allerdings write-host $a bekomme ich nichts zu sehen. Auch nicht wenn ich sage write-host $a.WS oder $a.name

Das ist strange, wäre nett wenn mir mal jemand eine kleine Starthilfe geben könnte. Dachte eigenlich das wäre keine große Sache mit Powershell face-sad
Member: filippg
filippg May 23, 2013 at 18:41:49 (UTC)
Goto Top
Hallo,

das $a.name und $a.WS nicht funktionieren ist erklärbar (mein Fehler): get-wmiobject... wird i.a. nicht _ein_ Objekt liefern, sondern eine Liste (Vector ist glaube ich der genaue Datentyp bei Powershell). Diese hat kein Feld "name" oder "WS" (nur die darin enthaltenen Elemente), deswegen liefert $a.name auch keinen Wert.
Man müsste also noch über $a iterieren (foreach...). Allerdings sollte write-host $a trotzdem eine Ausgabe liefern.

Gruß

Filipp
Member: JoshuaTree
JoshuaTree May 26, 2013 at 11:17:46 (UTC)
Goto Top
$a=get-content c:\temp\serverliste.txt


foreach($server in $a){

Get-Wmiobject win32_process -computer $server |
Where-Object {$_.name -like "iexplore.exe" -and $_.ws -gt "100000"} |
Select-Object __Server,WS,name,@{n="owner";e={$_.getowner().user}} |
ForEach-Object { write-host "Warnung! Auf Server: $($_.__Server),Prozess: $($_.name), WS: $($_.WS), User: $($_.owner)"}
}

Habe es bis dahin hin bekommen.

Möchte aber nicht das es am Bildschirm ausgegeben wird sonder in ein logfile welches nach Durchlauf das per smtp versendet wir falls ein logfile erstellt wurde (nur dann)

Versuchte jetzt mit:
ForEach-Object { out-file "c:\temp\log.txt" -append "Warnung! Auf Server: $($_.__Server
eins zu erzeugen doch da hagelte es nur Fehler.
Wo liegt der Fehler ? Kann mir da jemand weiter helfen?