casi4711
Goto Top

Parallele Prozesse in PS

Hallo allerseits,

ich versuche nun schon seit geraumer Zeit ein Script zu erstellen um eine PS Datei simultan auf mehreren Rechnern zu starten. Ich habe jett das folgende, er sagt zwar Prozeß ist gestartet, aber egal welche Datei ich auch ausführe, die Datei existiert auf jedem Zielrechner im Pfad, es wird nichts wirklich ausgeführt. Die PS Datei funktioniert auch lokal auf dem Remote Rechner. Es ist vollkommen egal was für eine Datei ich starten will, er macht einfach nichts. Vielleicht kann mir ja einer veraten was ich falsch mache.

$computers = "La-1", "La-2"  
$username = "lax\administrator"  
$password = ConvertTo-SecureString "abcd" -AsPlainText -Force  
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

$scriptBlock = {
    # Führe die PowerShell-Datei aus
    & "C:\Users\Administrator\Downloads\inventory\Inventory-Network.ps1"  
}

Invoke-Command -ComputerName $computers -Credential $credential -ScriptBlock $scriptBlock -AsJob -ThrottleLimit $computers.Count

Content-ID: 63168384743

Url: https://administrator.de/forum/parallele-prozesse-in-ps-63168384743.html

Ausgedruckt am: 22.12.2024 um 06:12 Uhr

Kraemer
Kraemer 22.04.2024 um 11:41:53 Uhr
Goto Top
Moin,

Firewall & Co. richtig konfiguriert?

Poste mal die Ausgabe von:
Test-WSMan -ComputerName "LA-1"  

Gruß
casi4711
casi4711 22.04.2024 um 11:47:42 Uhr
Goto Top
Vielen Dank erst mal für die Antwort, also die Ausgabe sieht in ISE wie folgt aus:

wsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
ProductVersion  : OS: 0.0.0 SP: 0.0 Stack: 3.0

lg

Casi
TK1987
TK1987 22.04.2024 um 13:36:53 Uhr
Goto Top
Moin,

teste mal mit nur einem Rechner und lass den AsJob-Parameter bei Invoke-Command weg, so bekommst du ggfs. auch eine Fehlermeldung angezeigt.

Gruß Thomas
casi4711
casi4711 22.04.2024 um 17:14:28 Uhr
Goto Top
jo danke, hab ich gemacht,

nun sehe ich die Abarbeitung ses Serciptes, dieses fragt einige Einstellungen des entsprechenden Rechners ab und legt dise als CSV auf dem Fileserver ab, am Ende steht folgendes, was wohl offensichtlich auf ein Zugriffsproblem hinweisst. Wenn ich das PS lokal auf dem Rechner ausführe hat es aber Zugriff.

Systemfehler 1376 aufgetreten.
NotSpecified: (:String) [], RemoteException
Die angegebene lokale Gruppe ist nicht vorhanden.
NotSpecified: (:String) [], RemoteException
Current user does not have administrator privileges.
Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\Apps.csv" wurde verweigert.  
Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\Apps.csv" wurde verweigert.  
nein
nix drin
Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\InventoryFull.csv" wurde verweigert.  
Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\InventoryShort.csv" wurde verweigert.  
Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\Printers.csv" wurde verweigert.  
Copy-Item: Zugriff verweigert
Copy-Item: Der Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA" kann nicht gefunden werden, da er nicht vorhanden ist.  

Danke noch mal
12764050420
12764050420 22.04.2024 aktualisiert um 17:28:15 Uhr
Goto Top
Hallo
Zitat von @casi4711:

jo danke, hab ich gemacht,

nun sehe ich die Abarbeitung ses Serciptes, dieses fragt einige Einstellungen des entsprechenden Rechners ab und legt dise als CSV auf dem Fileserver ab, am Ende steht folgendes, was wohl offensichtlich auf ein Zugriffsproblem hinweisst. Wenn ich das PS lokal auf dem Rechner ausführe hat es aber Zugriff.

Ist das typische "double hop" Problem mit der Credential Delegation, die lokal definierten Creds werden auf dem Remote System nicht mehr für den Zugriff auf den UNC Pfad benutzt, siehe

Gruß schrick.
casi4711
casi4711 22.04.2024 aktualisiert um 18:42:52 Uhr
Goto Top
das ist aber der domänen user und das pw sind über all gleich, er soll es doch im admini Kontext ausführen. Ich lese mal das mit dem CredSSP, ich geh mal davon aus dass das dann auf allen Remote PCs eingerichtet werden muss. Aber das mit den parallelen Jobs ist damit nicht gelöstface-sad
casi4711
casi4711 22.04.2024 um 18:52:38 Uhr
Goto Top
so ich habe jetzt mal testweise einen Remote PC hiermit bestückt:
Invoke-Command -ComputerName La-Data -ScriptBlock { Register-PSSessionConfiguration -Name Demo -RunAsCredential 'lax\administrator' -Force }  

leider scheint er damit nicht zufrieden zu sein, das Zugriffsproblem ist immer noch da beim Ausführen des Scripts:

PowerShell Credential Request: Bei Windows PowerShell anmelden
Warning: A script or application on the remote computer LA-DATA is requesting your credentials. Enter your credentials
only if you trust the remote computer and the application or script that is requesting them.

Geben Sie Ihre Anmeldeinformationen ein.
Password for user lax\administrator: ************

WARNING: Wenn "RunAs" für eine Windows PowerShell-Sitzungskonfiguration aktiviert ist, kann vom Windows-Sicherheitsmodell keine Sicherheitsbegrenzung zwischen verschiedenen Benutzersitzungen erzwungen werden, die mithilfe dieses Endpunkts erstellt werden. Stellen Sie sicher, dass die Windows PowerShell-Runspacekonfiguration nur die benötigten Cmdlets und Funktionen umfasst.  
WARNING: Sie führen eine Remotesitzung aus und haben die Option "Force" ausgewählt. Dies bedeutet, dass der WinRM-Dienst neu starten kann. Wenn der WinRM-Dienst neu startet, wird diese Remotesitzung beendet, und Sie müssen eine neue Sitzung erstellen, um den Vorgang fortzusetzen  

PSPath            : Microsoft.WSMan.Management\WSMan::localhost\Plugin\Demo
PSParentPath      : Microsoft.WSMan.Management\WSMan::localhost\Plugin
PSChildName       : Demo
PSDrive           : WSMan
PSProvider        : Microsoft.WSMan.Management\WSMan
PSIsContainer     : True
PSComputerName    : La-Data
RunspaceId        : 41e0cd6f-82c3-42e5-b5c6-5aa5ad9db747
Keys              : {Name=Demo}
Name              : Demo
TypeNameOfElement : Container
Type              : Container

OpenError: [La-Data] Processing data from remote server La-Data failed with the following error message: Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen. For more information, see the about_Remote_Troubleshooting Help topic.
PS C:\Program Files\PowerShell\7>

lg

casi
casi4711
casi4711 24.04.2024 um 10:05:37 Uhr
Goto Top
Gut dann vergessen wir das mal mit dem Zugriffsproblem ses Scriptes, da soll sich der Netzwerkadministrator druim kümmern, aber warum funktioniert das generell nicht im parallelen Modus. Wie muss dass denn grundsätzlich im einfachsten Fall aussehen damit es funktioniert, also zumindest mit Scripoten mir lokaler Zugangsbereechtigung? Kann da jemand etwas mehr Licht ins Dunkel bringen?


Vielen Dank noch mal


lg
12764050420
12764050420 24.04.2024 aktualisiert um 10:25:36 Uhr
Goto Top
Zitat von @casi4711:
Gut dann vergessen wir das mal mit dem Zugriffsproblem ses Scriptes,
Links etwas exakter lesen wäre ja schon mal ein Anfang face-wink.
aber warum funktioniert das generell nicht im parallelen Modus.
Doch das funktioniert out of the box sofern dein Skript selbst auch funktioniert, fehlerfrei ist oder Fehler abfängt und auf die Verarbeitung per Remote-Session vorbereitet ist.
Wie muss dass denn grundsätzlich im einfachsten Fall aussehen damit es funktioniert,
Wenn man Invoke-Command mehrere Computer im Parameter -Computer mitgibt verarbeitet es diese automatisch parallel, du musst also nichts weiter tun, nur sicherstellen das dein Skript ordnungsgemäß gestaltet ist, denn fehlerhafte Skripte auf 100 Computern auszuführen bringt dir ja kein Ergebnis face-wink.
Und nein, ein Skript das man lokal ausführt und das dort scheinbar funktioniert muss eben nicht auch per Remote funktionieren, dies gilt es vorher in einer eigenen Remote-Session zu prüfen bevor man es auf x Computer los lässt!
casi4711
casi4711 24.04.2024 um 11:20:11 Uhr
Goto Top
ok er scheint jetzt was zu machen, zumindest wenn ich das jeweilige Ausgabeverzeichnis lokal belasse. Aber dann mal die Frage wann muss man denn den Parameter -parallel benutzen, wenn er es so auch simultan macht?

lg
12764050420
12764050420 24.04.2024 aktualisiert um 11:25:20 Uhr
Goto Top
Frage wann muss man denn den Parameter -parallel benutzen, wenn er es so auch simultan macht?
Garnicht , denn einen Parameter "-parallel" gibt es bei Invoke-Command nicht 🙃. RTFM
casi4711
casi4711 24.04.2024 um 14:02:25 Uhr
Goto Top
okay? hm, komisch in irgend einem Forum hatte ich den gelesen und nichts hatte bisher geklappt. na wie auch immer dann löse ich jetztnoch mein Zugrifftsproblem.


Vielen Dank noch mal und eine schöne Woche
TK1987
TK1987 24.04.2024 um 14:17:21 Uhr
Goto Top
Moin,

Zitat von @casi4711:
na wie auch immer dann löse ich jetztnoch mein Zugrifftsproblem.
das hast du doch hier bereits getan. Du solltest nun eigentlich in der Lage sein, mit...
Invoke-Command -ComputerName "LA-DATA" -ConfigurationName "Demo" -ScriptBlock {  
  #...
}
auf den Server zuzugreifen.

Gruß Thomas
casi4711
casi4711 24.04.2024 um 15:35:33 Uhr
Goto Top
ja ne, sobald in meinem Script Ressourcen in der Fileablage angesprochen werden, werden die Credentials ja eben nicht weitergegeben. Aber mal um die Ecke gedacht: PSExec hat ja mit den credentials kein Problem, wenn man PS damit verknüpfen würde zB wie folgt, wäre das ein Plan?


clear
$Computernames = Get-Content "host.txt"  
#$Computernames = Get-ADComputer -Filter * -Searchbase = ... |


$Computernames | ForEach -Parallel {
    $ComputerName = $_

    try {
        #psexec "\\$ComputerName" -h -u larch\administrator -p <pass> -s -d -f -c "C\Users\Administrator\Downloads\inventory\test.ps1" 
       
            }
    catch {
        # ... error
    }
}


Pause
12764050420
12764050420 24.04.2024 aktualisiert um 16:16:44 Uhr
Goto Top
ja ne, sobald in meinem Script Ressourcen in der Fileablage angesprochen werden, werden die Credentials ja eben nicht weitergegeben
Wie gesagt, du hast die Fehlermeldung nicht aufmerksam gelesen. 😵‍💫 Ich bin raus.
casi4711
casi4711 24.04.2024 um 20:59:06 Uhr
Goto Top
Die Fehlermeldung war

Export-Csv: Der Zugriff auf den Pfad "\\LA-DFS.lax.berlin.de\Freigaben\Austausch-Daten\Rickl\inv2\LA-DATA\InventoryFull.csv" wurde verweigert.

das habe ich ja verinnerlicht, aber es nützt leider nichts für die Lösung
casi4711
casi4711 24.04.2024 um 21:00:24 Uhr
Goto Top
oder meinst Du diese:

E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen
casi4711
casi4711 26.04.2024 um 13:13:35 Uhr
Goto Top
ok dann versuche ich es noch mal mit meinem alternativen Ansatz, einen PSexec befehl zu parallelisieren, leider schaint das noch nicht ganz korrekt so zu sein, was mache ich falsch:

# Die Liste der Computer
$hostsFile = "host.txt"  
$computers = Get-Content $hostsFile

# Anmeldeinformationen für die Remotecomputer
$username = "lax\administrator"  

# Passwort abfragen
$password = Read-Host "Geben Sie das Kennwort ein" -AsSecureString  

# PSCredential-Objekt erstellen
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

# PSExec-Befehl für die Batch-Datei
$psexecCommand = "psexec64.exe"  

# Pfad zur Batch-Datei auf dem Netzwerk
$batchFilePath = "\\ds2\Larchdaten\Austausch-Daten\Riegert\INSTALL\IS\NetSetup2.bat"  

# Für jeden Computer PSExec starten
foreach ($computer in $computers) {
    $psexecArgs = "\\$computer -u $($credential.UserName) -p $($credential.GetNetworkCredential().Password) -h cmd /c `"$batchFilePath`""  
    Start-Process -FilePath $psexecCommand -ArgumentList $psexecArgs -NoNewWindow -Wait
}n



pause


lg und ein schönes WE


casi
casi4711
casi4711 28.04.2024 um 19:38:39 Uhr
Goto Top
okidoki,
ich habe mal etwas ausgetüftelt, eigenlich wars realiv einfach, aber da ich mir vorstellen kann, dass ich nicht der einzige mit diesem Problem bin, will ich mit der Lösung auhc nicht hinter dem berg halten:

# Die Liste der Computer aus der host.txt-Datei laden
$hostsFile = ".\host.txt"  
$computers = Get-Content $hostsFile | Where-Object { $_ -ne $null -and $_ -ne '' }  

# Überprüfen, ob Computer gefunden wurden
if ($computers.Count -eq 0) {
    Write-Host "Keine Computer gefunden."  
    exit
}

# Username und Passwort
$username = "dom\administrator"  
$password = Read-Host "Geben Sie das Kennwort ein" -AsSecureString  
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

# Pfade und Befehle für PsExec und die Batch-Datei
$psexecCommand = "psexec64.exe"  
$batchFilePath = "\\ds2\Fileablage\INSTALL\NetSetup2.bat"  

# Für jeden Computer PsEXEC Job starten
foreach ($computer in $computers) {
	
    # PsExec-Befehl ausführen
    $psexecArgs = "\\$computer -u $($credential.UserName) -p $($credential.GetNetworkCredential().Password) -h cmd /c `"$batchFilePath`""  
    Start-Job -ScriptBlock {
        param($psexecCommand, $psexecArgs)
        Start-Process -FilePath $psexecCommand -ArgumentList $psexecArgs -NoNewWindow -Wait
    } -ArgumentList $psexecCommand, $psexecArgs | Out-Null  # Ausgabe unterdrücken
}

# Warten, bis alle Jobs abgeschlossen sind
Get-Job | Wait-Job

# Ausgabe, dass die Aufgaben abgeschlossen sind
Write-Host "Alle Aufgaben wurden abgeschlossen."  

# Alle Jobs entfernen
Get-Job | Remove-Job


Einen schönen Sonntag noch und lg