estefania
Goto Top

Ein Script auf einem oder mehreren, entfernten Rechnern ausführen - Wie kann ich es umsetzen ?

Guten Morgen.

Ich habe eine Frage an erfahrene User von euch.
Habe da etwas spezielles nur leider weiss ich nicht, wie ich es am Besten umsetzen soll.
Es ist ein Script, welches von meinem Rechner auf dem Remote Rechner kopiert, ausgeführt und anschließend wieder gelöscht werden soll.
Es besteht aus 4 Dateien, die sich auf dem Remote Rechner in einem Verzeichnis befinden müssen.
Es sollte wie folgt ausgeführt werden:

1. 4 Dateien auf den Remote-Rechner in das Verzeichnis C:´\SCRIPT kopieren
2. Von meinem Rechner aus den Befehl mitgeben, daß aus dem C:\SCRIPT des Remote-Rechners die Datei Starten.cmd ausgeführt werden soll und zwar mit Administrator Rechten
3. Am besten wäre es wenn ich auf meinem Rechner die Ausgabe des Scripts sehen würde, aber ist kein Muss.
4. Sobald das Script abgearbeitet wurde, soll sich das komplette Verzeichnis C:\SCRIPT auf dem Remote-Rechner löschen

Wie bekomme ich sowas hin?

Mile Grazie

Content-ID: 270701

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

Ausgedruckt am: 25.11.2024 um 13:11 Uhr

uebeltat
uebeltat 30.04.2015 um 07:26:55 Uhr
Goto Top
Guten Morgen

Schau dir mal die PsTools an, speziell PsExec

Ich denke das ist genau das, was du suchst, damit habe ich ähnliche Dinge auch schon gemacht.

Gruss
Estefania
Estefania 30.04.2015 um 07:37:38 Uhr
Goto Top
Mit PsExec habe ich es bereits probiert, aber irgendwo hakt es immer und wird nicht komplett ausgeführt.
Ich hätte das ganze gerne in einem Befehl.. Ich denke, daß es eher was für leute ist die scripten können
Tommy70
Tommy70 30.04.2015 um 13:24:11 Uhr
Goto Top
Hallo,

du schreibst ja nichts darüber was dein Script so macht. Aber mit einem Powershell Script sollte sich eigentlich alles abdecken lassen.

Tom
colinardo
Lösung colinardo 30.04.2015, aktualisiert am 02.05.2015 um 10:03:41 Uhr
Goto Top
Hallo Estefania,
hier zwei Beispiel mit Powershell:
back-to-topVariante 1: Nativ mit Powershell und aktiviertem PSRemoting auf den Clients
(Die Liste der Rechner kann man natürlich auch aus dem AD oder einer Textdatei auslesen, das dient hier nur als einfaches Beispiel)
# Script mit einem Account ausführen der Admin-Rights auf den Clients besitzt (z.B. einem Domain-Admin)
# Für die Funktion muss PSRemoting auf den Clients aktiviert werden ('Enable-PSRemoting -Force' auf dem Client ausführen reicht wenn der PS in einer Domäne hängt) 

$computers = @("Rechner1",'Rechner2','Rechner3')  
$computers |%{
    Write-host "Starte Skript auf PC '$_'" -ForegroundColor Green   
    # Ordner auf Zielrechner anlegen
    md "\\$_\c$\Scripts" -Force -EA SilentlyContinue | out-null  
    # Script auf Remote-PC kopieren
    copy-item  'C:\Share\test.cmd' "\\$_\c$\Scripts" -Force  
    # Script auf Remote-PC ausführen
    Invoke-Command -ComputerName $_ -SccriptBlock {Start-Process "C:\Sripts\test.cmd"}  
}
back-to-topVariante 2: Mit Kombination aus Powershell und PSExec
$computers = @("Rechner1",'Rechner2','Rechner3')  
$computers |%{
    Write-host "Starte Skript auf PC '$_'" -ForegroundColor Green  
    # Ordner auf Zielrechner anlegen
    md "\\$_\c$\Scripts" -Force -EA SilentlyContinue | out-null  
    # Script auf Remote-PC kopieren
    copy-item  'C:\Share\test.cmd' "\\$_\c$\Scripts" -Force  
    # Script auf Remote-PC ausführen (mit psexec)
    & psexec "\\$_" "C:\Scripts\test.cmd"  
}
Die nötigen Firewallausnahmen für PSExec(Datei- und Druckerfreigabe reicht) und das Ausführen des Scripts als ein User der auf dem Zielrechner Admin-Rechte hat, sind natürlich Voraussetzung für das Funktionieren. Braucht das Script elevated Rights kann man psexec mit dem Parameter /s mitteilen das das Script mit dem System Account ausgeführt werden soll.

Viel Erfolg
Grüße Uwe
Estefania
Estefania 30.04.2015 um 19:05:20 Uhr
Goto Top
Danke Uwe.. Das hört sich ja gut an.
Werde ich mal ausprobieren.

Kann ich das in eine auszuführende Datei einpacken und die dann ausführen ohne die Befehle einzeln eingeben zu müssen? So eine Script Datei.. wie lautet die denn für PowerShell ?
colinardo
Lösung colinardo 30.04.2015, aktualisiert am 02.05.2015 um 10:03:53 Uhr
Goto Top
Kann ich das in eine auszuführende Datei einpacken und die dann ausführen ohne die Befehle einzeln eingeben zu müssen? So eine Script Datei.. wie lautet die denn für PowerShell ?
back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine administrative Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
  • Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy ByPass -File "C:\Pfad\Script.ps1"
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Estefania
Estefania 01.05.2015 um 10:35:02 Uhr
Goto Top
So langsam wird es was.. hab jetzt noch ein kleines problem
Ich kopiere in das Verzeichnis C:\SCRIPT insgesamt 4 Dateien...
1 davon heißt script.cmd und die andere wichtige ist eine vbs datei
in dieser script.cmd wird ein befehl mit cscript vbs-datei ausgegeben.
wenn ich es starte dann wird die vbs datei im C:\SCRIPT nicht genommen,
stattdessen sucht windows im \windows\system32 danach

gut ich könnte die datei vorher dorthin kopieren, aber läßt es sich nicht so umbiegen
daß die vbs datei aus diesem Verzeichnis genommen wird?

Und wie geht das mit der Textdatei erstellen, in der mehrere Rechner angegeben werden?
Habe es nicht so ganz verstanden

danke
uebeltat
uebeltat 01.05.2015 um 10:46:12 Uhr
Goto Top
Zitat von @Estefania:

wenn ich es starte dann wird die vbs datei im C:\SCRIPT nicht genommen,
stattdessen sucht windows im \windows\system32 danach

schreibe in deine cmd-Datei vorher einfach ein cd C:\SCRIPT oder gib den vollen Pfad (C:\SCRIPT\datei.vbs) beim Aufruf an

Gruss
Estefania
Estefania 01.05.2015 um 10:58:09 Uhr
Goto Top
ja stimmt. Das hat dann auch geklappt.
Jetzt fehlt mir nur noch die Info wie ich eine Textdatei mit allen Computerrechnern erstellen soll, so daß es dann nacheinander abgearbeitet wird.

Danke
Estefania
Estefania 01.05.2015 um 11:07:59 Uhr
Goto Top
Leider hat sich ein weiteres Problem eingeschlichen.. die vbs datei kann nicht per Remote ausgeführt werden.
Permission Denied !!!
Obwohl ich als Domänen-Benutzer in der Gruppe der lokalen Administratoren auf dem Zielrechner bin

Kann ich in dem Powershell Script irgendwie einen anderen Account mitgeben? z.B. lokalen ?
114757
114757 01.05.2015 aktualisiert um 12:05:25 Uhr
Goto Top
Zitat von @Estefania:

ja stimmt. Das hat dann auch geklappt.
Jetzt fehlt mir nur noch die Info wie ich eine Textdatei mit allen Computerrechnern erstellen soll, so daß es dann
nacheinander abgearbeitet wird.
Alle Computernamen untereinander in eine Textdatei schreiben, und so kannst du sie dann einlesen
$computers = gc 'c:\computers.txt'  
Alle Rechner kann man sich auch aus dem AD ziehen:
Import-Module ActiveDirectory
Get-AdComputer -Filter * | select -Expand Name | out-file 'c:\computers.txt'  
114757
114757 01.05.2015 aktualisiert um 12:03:44 Uhr
Goto Top
Zitat von @Estefania:

Leider hat sich ein weiteres Problem eingeschlichen.. die vbs datei kann nicht per Remote ausgeführt werden.
Permission Denied !!!
Obwohl ich als Domänen-Benutzer in der Gruppe der lokalen Administratoren auf dem Zielrechner bin

Kann ich in dem Powershell Script irgendwie einen anderen Account mitgeben? z.B. lokalen ?
Wenn bei deinem Script die UAC anschlägt musst du es bei psexec mit dem Parameter /s ausführen. Oder den Command Remote elevated ausführen:
Powershell Script mit Benutzerabfrage

Psexec kennt ebenfalls Parameter für Username und Passwort.
Estefania
Estefania 02.05.2015 aktualisiert um 09:08:06 Uhr
Goto Top
Wenn bei deinem Script die UAC anschlägt musst du es bei psexec mit dem Parameter /s ausführen. Oder den Command Remote
elevated ausführen:
Powershell Script mit Benutzerabfrage

Psexec kennt ebenfalls Parameter für Username und Passwort.

mit dem /s Schalter bei psexec habe ich es ausführen können als Domänen-Admin. Problem besteht nur, wenn z.B. der Zielrechner nicht mehr in der Domäne ist und nur mit lokalen Accounts gearbeitet werden kann. Gut ich könnte mit COMPUTERNAME\Administrator und Passwort das Tool psexec ausführen, nur ist es etwas mühselig wenn man für jeden Rechner den COMPUTERNAMEN extra angeben muss. Gibt es einen Ersatz in Form einer Variable oder ähnliches damit der Computer immer weißt, daß er den lokalen Administrator Account des Zielrechners nehmen soll?
114757
114757 02.05.2015 aktualisiert um 09:15:47 Uhr
Goto Top
Der Computername steht ja schon in der Pipeline-Variablen der Schleife $_ ! Er enthält immer den aktuellen Computernamen welcher gerade verarbeitet wird. Also kannst du ihn nutzen um den Account zusammen zu bauen
"$_\Administrator"
Estefania
Estefania 02.05.2015 um 09:49:51 Uhr
Goto Top
Der Computername steht ja schon in der Pipeline-Variablen der Schleife $_ ! Er enthält immer den aktuellen Computernamen
welcher gerade verarbeitet wird. Also kannst du ihn nutzen um den Account zusammen zu bauen
> "$_\Administrator"
> 

Ich habe diese Variable hinter dem psexec Befehl gesetzt. Ich müsste aber schon von anfang an alles mit diesem lokalem account ausführen wie z.B. das kopieren der dateien auf den zielrechner usw. Kann man sowas irgendwie in dem Script am Anfang hinterlegen !?
114757
114757 02.05.2015 aktualisiert um 11:39:34 Uhr
Goto Top
Zitat von @Estefania:
Ich habe diese Variable hinter dem psexec Befehl gesetzt. Ich müsste aber schon von anfang an alles mit diesem lokalem
account ausführen wie z.B. das kopieren der dateien auf den zielrechner usw. Kann man sowas irgendwie in dem Script am Anfang
hinterlegen !?
Das geht dann aber nicht, weil wenn du z.B. den Copy-Befehl mit den local Admin rights des anderen Rechners ausführen würdest hätte dieser keine Berechtigung auf dein lokales Laufwerk zuzugreifen face-wink

Splite das ganze am besten auf in Domain Rechner und Non-Domain-Rechner... oder mappe das Laufwerk des anderen Rechners mit net use ...
Estefania
Estefania 02.05.2015 um 11:41:23 Uhr
Goto Top
Das geht dann aber nicht, weil wenn du z.B. den Copy-Befehl mit den local Admin rights des anderen Rechners ausführen
würdest hätte dieser keine Berechtigung auf dein lokales Laufwerk zuzugreifen face-wink

Splite das ganze am besten auf in Domain Rechner und Non-Domain-Rechner...

OK dann habe ich 2 scripts..
Da ich ja selbst in der Domäne bin, kann ich nicht auf den Rechner zugreifen, weil er nicht in der Domäne ist.
Ich könnte also die Dateien auf den Zielrechner nur mit dem lokalen Account der Zielrechners drauf kopieren.
Eine Lösung wäre auf meinem Rechner den gleichen lokalen Account für die Zwecke einzurichten und dann entweder mit dem Account
an meinem Rechner angemeldet, das Script ausführen.. Gibt es da nicht eine schönere Lösung ohne den Account bei mir erstellen zu müssen
und vorallem sich nicht mit dem lokalen Account selbst erst an meinem Rechner anmelden zu müssen !?
114757
114757 02.05.2015 aktualisiert um 11:43:20 Uhr
Goto Top
Das entfernte Laufwerk im Script mit net use mappen und die Files drauf kopieren ...
Estefania
Estefania 02.05.2015 um 11:45:32 Uhr
Goto Top
Zitat von @114757:

Das entfernte Laufwerk im Script mit net use mappen und die Files drauf kopieren ...

Dann müsste ich es bei jedem Rechner machen, was sehr mühselig wäre. Gibt es da keine besser Lösung für ?
114757
114757 02.05.2015 aktualisiert um 12:09:42 Uhr
Goto Top
Zitat von @Estefania:
Dann müsste ich es bei jedem Rechner machen, was sehr mühselig wäre. Gibt es da keine besser Lösung für ?
Du verstehst mich falsch... Du mappst das Laufwerk des entfernten Rechners im Script also auf dem Rechner wo du das Script ausführst ! Also keine Arbeit auf den Clients nötig ...
Estefania
Estefania 02.05.2015 um 12:12:18 Uhr
Goto Top
Ok.. ich weiss nur nicht ob ich DOS Befehle mit PowerShell Befehlen einfach so mischen kann !?
114757
114757 02.05.2015 aktualisiert um 12:16:08 Uhr
Goto Top
Doch kannst du ... es gibt halt ein paar Dinge zu beachten. Aber dazu gibt's ja Google.
https://social.technet.microsoft.com/Forums/windowsserver/en-US/5428116d ...
Wir machen hier ja kein Grundkurs Powershell ...
Estefania
Estefania 04.05.2015 um 19:06:54 Uhr
Goto Top
Hi.

Mit dem Verbinden des Laufwerkes hat es geklappt und somit konnte ich die Daten rüberkopieren.
Wenn ich nur einen Rechner angebe, dann funktioniert es einwandfrei.
Sobald es einen 2-ten gibt, führt es die Arbeiten nicht durch beim 2-ten.
Gibt es ein Kommando wo ich vielleicht den Sprung zum nächsten Rechner verzögern kann?
Unter Windows hat es diesen Befehl "wait" gegeben.. Sowas ähnliches unter PowerShell !?
colinardo
colinardo 04.05.2015 aktualisiert um 19:28:30 Uhr
Goto Top
Zitat von @Estefania:
Mit dem Verbinden des Laufwerkes hat es geklappt und somit konnte ich die Daten rüberkopieren.
Wenn ich nur einen Rechner angebe, dann funktioniert es einwandfrei.
Sobald es einen 2-ten gibt, führt es die Arbeiten nicht durch beim 2-ten.
Du solltest ja das Laufwerk wieder trennen nachdem du kopiert hast face-wink sonst kann das Laufwerk ja nicht erneut zugewiesen werden! net use x: /del
Gibt es ein Kommando wo ich vielleicht den Sprung zum nächsten Rechner verzögern kann?
Unter Windows hat es diesen Befehl "wait" gegeben.. Sowas ähnliches unter PowerShell !?
Powershell wartet bis der Befehl beendet wurde. Das wird also nicht dein Problem gewesen sein, eher meine Vermutung von oben das du das Laufwerk nicht getrennt hast.
Ansonsten gibt es noch start-process mit dem Parameter -wait oder auch sleep(3) um eine gewisse Zeit zu warten.

Dir sollte schon klar sein, dass das obige Script natürlich nur eine Basisvariante ist, welche man beliebig erweitern kann um z.B. noch zu überprüfen ob ein Rechner überhaupt online ist ! (Wie z.B. hier demonstriert.)
Etwas solltest du sich dann vielleicht doch mit Powershell beschäftigen (Ich kann es nur wärmstens empfehlen, Windows Systeme wirst du in Zukunft nicht mehr ohne Powershell vernünftig administrieren können) . Bei Bedarf kann ich dir auch gerne gegen Bezahlung ein erweitertes Script schreiben, wenn das nicht so dein Ding ist.

Grüße Uwe