marcimarc85
Goto Top

Datei mit IP Adressen per Powershell einlesen und abarbeiten

Hi,

Ich möchte per Powershell Script ein Update-Script auf mehreren Servern ausführen lassen. Das ganze wollt ich mit psexec in Powershell machen, was auch soweit für einen Server im test funktioniert.
Nun möchte ich gern eine Textdatei haben, die von der Powershell eingelesen wird, in der die IP-Adressen aller betroffenen Server untereinander eingetragen werden können und die dann im Powershell-Script nacheinander in einer Schleife geupdated werden.

Da sich die zu updatenden Server imme rmal wieder ändern, dachte ich per anpassbarer textdatei ist das am Einfachsten.

Wie lautet denn das Kommando um z.B. "D:\serverlist.txt" einzulesen und dann per

param (
[Parameter(Mandatory=$true)][String]$new_version
)

$computers = @("Rechner1",'Rechner2','Rechner3')    
$computers |%{
Write-host "Starte Skript auf PC '$_'" -ForegroundColor Green     
 # Script auf Remote-PC ausführen (mit psexec)
    & PsExec "\\$_" /s -i "powershell" "D:\powershell_tools\update_wizard.ps1" $new_version   
}

Content-ID: 9946139982

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

erikro
Lösung erikro 17.01.2024 um 09:14:17 Uhr
Goto Top
Moin,

ausgehend davon, dass die IPs untereinander gelistet sind:

PARAM (

     $list = "x:\woauchimmer\ips.txt"  

)

$ips = get-content $list -encoding UTF8 #Oder welche Kodierung auch immer
foreach($ip in $ips) {

     Write-host "Starte Skript auf PC '$ip'" -ForegroundColor Green       
 # Script auf Remote-PC ausführen (mit psexec)
    & PsExec "\\$ip" /s -i "powershell" "D:\powershell_tools\update_wizard.ps1" $new_version  

}

get-content liest eine Datei zeilenweise in ein Array ein. Jede Zeile ist ein Element des Arrays.

hth

Erik
Tobi-2001
Tobi-2001 17.01.2024 um 09:19:46 Uhr
Goto Top
Moin Marc,

also ich habe keine Lösung dafür, aber das Thema Sicherheit würde mich hier interessieren. Wenn man das mit einem Priveligierten User über Psexec auf verschiedenen Servern laufen lässt, ist das nicht problematisch?
MarciMarc85
MarciMarc85 17.01.2024 um 09:49:23 Uhr
Goto Top
Zitat von @Tobi-2001:

Moin Marc,

also ich habe keine Lösung dafür, aber das Thema Sicherheit würde mich hier interessieren. Wenn man das mit einem Priveligierten User über Psexec auf verschiedenen Servern laufen lässt, ist das nicht problematisch?

es sind Testumgebungen, die bei uns in der Firma laufen. Es geht mir nur darum, nicht jeden Morgen auf X-Servern das Update manuell anzustoßen, sondern es zentral von einem System aus.
MarciMarc85
MarciMarc85 17.01.2024 um 11:04:16 Uhr
Goto Top
Zitat von @erikro:

Moin,

ausgehend davon, dass die IPs untereinander gelistet sind:

PARAM (

     $list = "x:\woauchimmer\ips.txt"  

)

Perfekt! Klappt hervorragend. Kann man den gesamten Inhalt der Textdatei mit den IP-Adressen auch auf einmal ausgeben? Ich würde gern am Ende des Scripts automatisch noch eine Mail versenden, welche Systeme das Update erhalten haben.

$ips = get-content $list -encoding UTF8 #Oder welche Kodierung auch immer
foreach($ip in $ips) {

     Write-host "Starte Skript auf PC '$ip'" -ForegroundColor Green       
 # Script auf Remote-PC ausführen (mit psexec)
    & PsExec "\\$ip" /s -i "powershell" "D:\powershell_tools\update_wizard.ps1" $new_version  

}

get-content liest eine Datei zeilenweise in ein Array ein. Jede Zeile ist ein Element des Arrays.

hth

Erik
aqui
aqui 17.01.2024 um 11:48:07 Uhr
Goto Top
Sinnfrei die Antwort in den Codeblock gepostet...aber egal! face-sad
Und...man muss auch nicht immer überflüssigerweise alles zitieren...wir können alle lesen!
erikro
erikro 17.01.2024 um 12:37:01 Uhr
Goto Top
Zitat von @aqui:

Sinnfrei die Antwort in den Codeblock gepostet...aber egal! face-sad
Und...man muss auch nicht immer überflüssigerweise alles zitieren...wir können alle lesen!

Gut, dass Du das sagst. Ich hatte mich schon gewundert, warum der TO meinen Code unkommentiert zitiert. face-wink
erikro
erikro 17.01.2024 aktualisiert um 14:23:50 Uhr
Goto Top
$body = "" #Muss vor der Schleife stehen!  
foreach($ip in $ips) {

   $body +=  "Starte Skript auf PC '$ip`n"  

try {
 # Script auf Remote-PC ausführen (mit psexec)
    & PsExec "\\$ip" /s -i "powershell" "D:\powershell_tools\update_wizard.ps1" $new_version   
   $body += "$ip erfolgreich aktualisiert.`n`n"  
}
catch {

$body += "$ip wurde nicht erfolgreich aktualisiert.`n`n"  

}
}
# Ergebnis der Suche nach "Mit der Powershell Mails verschicken" ;-) 

Edit: Zeilenumbrüche korrigiert (`n)
MarciMarc85
MarciMarc85 17.01.2024 um 14:19:18 Uhr
Goto Top
Sorry wegen dem Zitat und vielen lieben Dank für die Unterstützung!