Remote-PowerShell Script gibt Probleme bei einigen Testrechnern
Hallo zusammen,
ich habe gerade ein Problem mit der Ausführung eines Powershell Scripts. Was nur bei einigen Testrechnern nicht Funktioniert ist die Laufwerksverknüpfung. Bei anderen geht es wieder.
Technischer Setup ist auf den Testrechnern Identisch (es sidn physische Rechner die gleich Ausgestattet sind). Das Script führe ich von meiner Arbeitsstation als Administrator (RunAs) aus.
Bei den Testdurchläufen sind folgende Sachen herausgekommen.
1. Testdurchlauf bei nur einem PC in der Textdatei, läuft Problemlos.
2. Testdurchlauf mit zwei PCs lief beim ersten Problemlos, beim Zweiten nicht.
2.a Was nicht lief beim zweiten Rechner war die Verbindung des Netzlaufwerks. Deinstallieren und den ganzen Rest hat er ohne zu Klagen und Nachvollziehbar getan.
3. Testdurchlauf nur Remote mit dem zweiten Rechner lief auch Einwandfrei bis zur verbindung des Netzlaufwerks.
Da dies anscheinend das einzige Problem ist habe ich die Verbindung des Netzlaufwerks mehrfach Versucht, auch mit NEW-PSDrive und der WMI Methode, jedoch scheitern sie alle. Eine Fehlermeldung finde ich weder im Ereignisprotokoll noch in der Ausgabe der Powershell ISE. Es ist auch Uninteressant ob ich für den Share eine IP-Adresse nutze oder den Namen.
Net Use gibt mir an das die Laufwerksverbindung Erfolgreich war.
New-PSDrive gibt mir das Laufwerk X an, jedoch sieht man keine Belegeung (Benutzer Festplattenspeicher, Verfügbarer Festplattenspeicher).
Wenn man jedoch nach dem Verbinden des Laufwerks ein Get-PSDrive eingibt und ausführt wird das Laufwerk X jedoch nicht angezeigt.
Mit meinem Latein bin ich am Ende, überlege ob ich das Script nicht so umschreibe das er die aktuelle Installation prüft und nur falls per Update eine neuere Version verfügbar ist diese dann Installiert... was aber auch wieder über ein Share laufen wird.
Wenn das Script komplett auf dem Rechner, wo das Laufwerksverbinden nicht klappt, ausführt funktioniert alles Einwandfrei. (Natürlich das Script so umgeschrieben das es Lokal läuft.)
Hier einmal der Code des gesamten Scripts.
Schon einmal vielen Dank für die Hilfe.
LG Althalus
ich habe gerade ein Problem mit der Ausführung eines Powershell Scripts. Was nur bei einigen Testrechnern nicht Funktioniert ist die Laufwerksverknüpfung. Bei anderen geht es wieder.
Technischer Setup ist auf den Testrechnern Identisch (es sidn physische Rechner die gleich Ausgestattet sind). Das Script führe ich von meiner Arbeitsstation als Administrator (RunAs) aus.
Bei den Testdurchläufen sind folgende Sachen herausgekommen.
1. Testdurchlauf bei nur einem PC in der Textdatei, läuft Problemlos.
2. Testdurchlauf mit zwei PCs lief beim ersten Problemlos, beim Zweiten nicht.
2.a Was nicht lief beim zweiten Rechner war die Verbindung des Netzlaufwerks. Deinstallieren und den ganzen Rest hat er ohne zu Klagen und Nachvollziehbar getan.
3. Testdurchlauf nur Remote mit dem zweiten Rechner lief auch Einwandfrei bis zur verbindung des Netzlaufwerks.
Da dies anscheinend das einzige Problem ist habe ich die Verbindung des Netzlaufwerks mehrfach Versucht, auch mit NEW-PSDrive und der WMI Methode, jedoch scheitern sie alle. Eine Fehlermeldung finde ich weder im Ereignisprotokoll noch in der Ausgabe der Powershell ISE. Es ist auch Uninteressant ob ich für den Share eine IP-Adresse nutze oder den Namen.
Net Use gibt mir an das die Laufwerksverbindung Erfolgreich war.
New-PSDrive gibt mir das Laufwerk X an, jedoch sieht man keine Belegeung (Benutzer Festplattenspeicher, Verfügbarer Festplattenspeicher).
New-PSDrive -Name X -PSProvider FileSystem -Root \\Server\Share\Unterordner
Wenn man jedoch nach dem Verbinden des Laufwerks ein Get-PSDrive eingibt und ausführt wird das Laufwerk X jedoch nicht angezeigt.
Mit meinem Latein bin ich am Ende, überlege ob ich das Script nicht so umschreibe das er die aktuelle Installation prüft und nur falls per Update eine neuere Version verfügbar ist diese dann Installiert... was aber auch wieder über ein Share laufen wird.
Wenn das Script komplett auf dem Rechner, wo das Laufwerksverbinden nicht klappt, ausführt funktioniert alles Einwandfrei. (Natürlich das Script so umgeschrieben das es Lokal läuft.)
Hier einmal der Code des gesamten Scripts.
# Deklarieren der lokalen Variablen und Scripte
$username = "<Domain\Administrator>"
$password = "<Passwort>"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
$PCLIST = Get-Content 'D:\Powershell\PCs_für_Deploy.txt'
$ScriptDeinstall1 = {
$app = Get-WmiObject -Class Win32_Product |where { $_.name -EQ 'AAFClientPackages' }
$app.uninstall()
}
$ScriptDeinstall2 = {
$app = Get-WmiObject -Class Win32_Product |where { $_.name -EQ 'AAFOutlookCTI' }
$app.uninstall()
}
$ScriptInstall1 = {
$args = "-i C:\Temp\ARGOPatch\AAFClientPackages.msi /qn /norestart ALLUSERS=1"
[diagnostics.process]::start("msiexec.exe", $args).WaitForExit()
}
$ScriptInstall2 = {
$args = "-i C:\Temp\ARGOPatch\AAFOutlookCTISetup.msi /qn /norestart ALLUSERS=1"
[diagnostics.process]::start("msiexec.exe", $args).WaitForExit()
}
$Textmassage = {
$CmdMessage = { C:\windows\system32\msg.exe * 'Die Installation des Updates ist beendet, es kann wieder gearbeitet werden.' }
$CmdMessage | Invoke-Expression
}
# Starten der Schleife für die Abarbeitung der Installation
ForEach ($computer in $PCLIST) {
# Aufbau einer neuen Remote-Session zum entfernten Computer und Setzen der Berechtigungen
New-PSSession -ComputerName $computer -Credential $cred
Invoke-Command -ComputerName $computer { Get-ExecutionPolicy } | Set-ExecutionPolicy -Force
Invoke-Command -ComputerName $computer { Set-ExecutionPolicy Unrestricted }
Invoke-Command -ComputerName $computer { Enable-PSRemoting -Force }
# InternetExplorer schließen
Write-Host "Internet Explorer wird geschlossen"
Invoke-Command -ComputerName $computer { Stop-Process -name iexplo* -Force }
# Deinstallation der alten ARGO-Pakete
Write-Host "AAFClientPackages werden Deinstalliert"
Invoke-Command -Computername $computer -ScriptBlock $ScriptDeinstall1 -Credential $cred -Verbose
Write-Host "AAFOutlookCTI wird Deinstalliert"
Invoke-Command -Computername $computer -ScriptBlock $ScriptDeinstall2 -Credential $cred -Verbose
# Verbinden des ARGO-Patchverzeichnisses
Write-Host "Laufwerk X wird verbunden"
Invoke-Command -ComputerName $computer { Net Use X: \\Server\Share\Unterordner /USER:<Domäne>\Administrator <Passwort>}
# Erstellen des Remoteverzeichnisses und Kopieren der Updatedateien
Invoke-Command -ComputerName $computer { mkDir C:\Temp\ARGOPatch }
Invoke-Command -ComputerName $computer { robocopy X: C:\Temp\ARGOPatch /MIR }
# Installation des Updates
Write-Host "Installation von AAFClientPackages"
Invoke-Command -ComputerName $computer -scriptblock $ScriptInstall1 -Credential $cred
Write-Host "Installation von AAFOutlookCTI"
Invoke-Command -ComputerName $computer -scriptblock $ScriptInstall2 -Credential $cred
# Entfernen des Remoteverzeichnisses und Löschen der Updatedateien
Invoke-Command -ComputerName $computer { Net Use X: /delete }
Invoke-Command -ComputerName $computer { rd C:\Temp\ARGOPatch -recurse }
# Freischaltung der NetFramework Dateien
Invoke-Command -ComputerName $computer { C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CasPol.exe -q -machine -chggroup Trusted_Zone FullTrust }
Invoke-Command -ComputerName $computer { C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\CasPol.exe -q -machine -chggroup Trusted_Zone FullTrust }
#Nachricht für die Benutzer dass das Update fertig ist
Invoke-Command -ComputerName $computer -Scriptblock $Textmassage
#Verlassen der Remote-Session
Exit-PSSession
}
Schon einmal vielen Dank für die Hilfe.
LG Althalus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 287137
Url: https://administrator.de/contentid/287137
Ausgedruckt am: 25.11.2024 um 14:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
ich würde mal vermuten das kommt daher das du hier für jeden einzelnen Befehl ein separaten Invoke-Command ausführst und nicht das Verbinden des LW zusammen mit den Befehlen die das LW nutzen, denn normalerweise wird bei jedem Invoke-Command eine separate Session zum Remote-System aufgebaut und deswegen das PSDrive vermutlich wieder getrennt ...
-Command ist ein Skriptblock, also kannst du problemlos mehrere Befehle in einen Aufruf packen, das ist schon der Performance wegen zu empfehlen, da ansonsten jedes mal eine Authentifizierung und Session gestartet werden muss!
Gruß grexit
ich würde mal vermuten das kommt daher das du hier für jeden einzelnen Befehl ein separaten Invoke-Command ausführst und nicht das Verbinden des LW zusammen mit den Befehlen die das LW nutzen, denn normalerweise wird bei jedem Invoke-Command eine separate Session zum Remote-System aufgebaut und deswegen das PSDrive vermutlich wieder getrennt ...
When you use -ComputerName, PowerShell will create a temporary connection that is
used only to run the specified command and is then closed.
If you need a persistent connection, use -Session
-Command ist ein Skriptblock, also kannst du problemlos mehrere Befehle in einen Aufruf packen, das ist schon der Performance wegen zu empfehlen, da ansonsten jedes mal eine Authentifizierung und Session gestartet werden muss!
Gruß grexit
Zitat von @Althalus:
Hallo grexit,
wobei ich mich frage warum es dann auf den anderen Maschinen klappt.
Das kann Zufall sein, das z.B. die vorherige Session noch nicht wieder komplett beendet ist und der nächste Command dann mit Überschneidung ausgeführt wird.Hallo grexit,
wobei ich mich frage warum es dann auf den anderen Maschinen klappt.
Netzlaufwerke sind ja immer nur User und Session bezogen verfügbar ...außer man setzt den Registry-Eintrag "EnableLinkedConnections"
Zitat von @Althalus:
Das heißt ich sollte alle Programmbefehle am besten innerhalb einer Schleife haben? Hier mein Bleistift:
?
Das ist keine Schleife sondern ein Skriptblock in dem du mehrere Befehle zusammenfasst ... Ist auf jeden Fall viel effizienter.Das heißt ich sollte alle Programmbefehle am besten innerhalb einer Schleife haben? Hier mein Bleistift:
$LWuK ={ anfang der ForEach-Schleife und dann Ende der ForEach-Schleife }
> Invoke-Command -Computername $computer -ScriptBlock $LWuK -Credential $cred
Ach so, na dann OK.