Quantcast
Channel: Windows PowerShell Forum
Viewing all articles
Browse latest Browse all 2314

Mit PowerShell remote Snapshot setzen

$
0
0

Hallo zusammen!

Ich suche eine Möglichkeit per PS-Skript auf einem Remotecomputer einen Snapshot zu erstellen. Hintergrund ist ein Skript, das Treiber auf diesem Win XP-Client in der Domäne installiert. Bevor dieser Vorgang gestartet wird, soll zur Sicherheit ein neuer System-Wiederherstellungspunkt angelegt werden.

Da Checkpoint-Computer ohne Weiteres nur lokal funktioniert, habe ich verschiedene Ansätze probiert. Auffällig ist, dass der Code allein problemlos funktioniert, sobald er aber innerhalb eines (Test-)Skripts ausgeführt wird, wird entweder kein Snapshot erstellt oder das Skript startet (aus unbekannten Gründen) mit den nachfolgenden Cmdlets bei ca 20-30% der Snapshoterstellung und kein Snapshot wird erstellt. Tatsächlich hat es auch wenige Male funktioniert. Sowohl in der ISE als auch in der normalen shell tritt das Problem auf. Teilweise erscheint der obligatorische Ladebalken, der bei der Erstellung je nach Host unterschiedlich angezeigt werden sollte, auch überhaupt nicht.

Der Zielrechner ist für das Empfangen von PS-Remotebefehlen konfiguriert (Enable-PSRemoting).

while ((Invoke-Command -ComputerName $PC -ErrorAction SilentlyContinue -ScriptBlock {((Get-ComputerRestorePoint)[-1]).Description -eq "Test"}) -eq $false)
                                    {
                                        Write-Host "Systemwiederherstellungspunkt wird gesetzt..."
                                        Enter-PSSession -ComputerName $PC
                                        # Möglichkeit 1
                                        Checkpoint-Computer -Description "Test" -RestorePointType DEVICE_DRIVER_INSTALL
                                        # Möglichkeit 2, ReturnValue = 13
                                        $SystemRestore = [wmiclass]"\\$($PC)\root\default:systemrestore"
                                        $SystemRestore.CreateRestorePoint("Test", 10)
                                        Exit-PSSession
                                    }

Laut den WinError.h-Fehlercodes steht ReturnValue = 13 für "INVALID_DATA". Ich kann mir darauf keinen Reim machen, zumal Checkpoint-Computer die selbste Methode nutzt und das Cmdlet wie beschrieben mal seine Arbeit getan hat.

Auch wenn ich per psexec den folgenden Code remote ausführen lasse, funktioniert es nicht verlässlich:

\\Lager\Tools\psexec.exe \\$PC -s -h -d powershell.exe "if (!(Get-ComputerRestorePoint | Where-Object {$_.Description -eq  'Test'})){Write-Host 'Systemwiederherstellungspunkt wird gesetzt...'; Checkpoint-Computer -Description 'Test' -RestorePointType DEVICE_DRIVER_INSTALL} else {Write-Host 'Systemwiederherstellungspunkt bereits vorhanden!'}" 2>$env:temp\stderr.txt

Start-Job oder Start-Process haben auf Anhieb auch nicht weitergeholfen. Wie geagt: Als Code allein funktioniert es, der Ladebalken erscheint und ein Snapshot wird erstellt. Sobald aber der Code Teil eines Skripts ist, erscheint nur manchmal überhaupt der Ladebalken, und wenn füllt er sich nie mehr als ein Viertel und das Skript läuft weiter.

Zur Info falls es nützlich ist: Die nächsten Befehle im entsprechenden Skript sind Write-Host und diverse Variablendefinitionen.

Ich bin für jede Idee dankbar!

Scriptex

P.S. Eine Möglichkeit für Win7-Clients wäre ebenfalls hilfreich.



Viewing all articles
Browse latest Browse all 2314


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>