Wie man einen Screenshot mit der „DRUCKEN“-Taste erstellt wissen wohl die meisten Computerbenutzer. Aber es kann auch Sinn machen Screenshots völlig automatisiert im Hintergrund speichern zu können. Dafür braucht man nicht einmal Drittsoftware. Man kann auch ein einfaches PowerShell-Skript nutzen, um automatisiert Screenshots unter Windows speichern zu lassen. Wie man das macht erfährst du in diesem Artikel.
Screenshot mit PowerShell speichern
Um einen Screenshot mit der PowerShell zu speichern erstellt man sich am besten direkt eine Funktion, die man dann nur noch aufrufen braucht. Für diese benötigt man die Assembly „System.Windows.Forms“, die man einfach nur einbinden muss. Ich habe diese SaveScreenshot genannt. Man könnte diese noch sinnvoll erweitern und bspw. den Speicherort und das Pattern für den Dateinamen als Parameter an die Funktion übergeben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
function SaveScreenshot(){ # Zielordner definieren $Path = "D:\ScreenCapture" # schauen ob Ordner existiert, wenn nicht erstellen if (!(Test-Path $path)) { New-Item -ItemType Directory -Force -Path $path } Add-Type -AssemblyName System.Windows.Forms $screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds # aktuelle Auflösung $image = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height) # Grafikobjekt erstellen $graphic = [System.Drawing.Graphics]::FromImage($image) $point = New-Object System.Drawing.Point(0, 0) $graphic.CopyFromScreen($point, $point, $image.Size); $cursorBounds = New-Object System.Drawing.Rectangle([System.Windows.Forms.Cursor]::Position, [System.Windows.Forms.Cursor]::Current.Size) # Screenshot erstellen [System.Windows.Forms.Cursors]::Default.Draw($graphic, $cursorBounds) # Screenshot als PNG ablegen $filename = "$Path\" + $env:computername + "_" + $env:username + "_" + "$((get-date).tostring('yyyy.MM.dd-HH.mm.ss')).png" $image.Save($filename, [System.Drawing.Imaging.ImageFormat]::Png) } SaveScreenshot |
Diese Funktion kann z. B. sinnvoll sein, wenn man auf einem System zum Zeitpunkt der Skriptausführung aus irgendeinem Grund sehen möchte was danach auf der Benutzeroberfläche zu sehen war. Oder wenn man prüfen möchte was ein Benutzer gemacht hat 😉 (Achtung: könnte rechtlich problematisch sein ohne Zustimmung des Benutzers!)
In dieser Variante werden die Screenshots unter Laufwerk D: im Ordner „ScreenCapture“ abgelegt und nach dem Format „Computername_Benutzername_Datum_Uhrzeit.png“ abgelegt. Das kann man nach Belieben abändern:
Automatisch Screenshots speichern
Um dann endlos Screenshots erstellen zu lassen, beispielsweise alle zwei Sekunden, braucht man diese Funktion dann nur in einer Schleife aufzurufen. Hierfür kann man z. B. einfach eine While-Schleife nehmen, deren Bedingung immer „true“ bleibt:
1 2 3 4 |
while ($true) { SaveScreenshot Start-Sleep -Seconds 2 } |
Dieses Skript könnte man dann z. B. einfach einmalig starten oder man könnte es als Windows Task einrichten. Dann bräuchte man allerdings die Schleife nicht unbedingt, wenn man diesen Task beispielsweise alle 10 Minuten ausführen lässt.
Screenshots mit PowerShell automatisch unter Windows speichern
Welche PowerShell-Version habe ich? – PowerShell-Version anzeigen
Was ist PowerShellCore? Windows PowerShell unter Linux und MacOS?
Powershell und CMD: Clear um Konsole zu leeren?
Powershell: Sudo-Befehl wie unter Linux nutzen für Administratorrechte?
COM-Port eines Geräts ändern per Powershell
CMD/Powershell: Ping-Ergebnis mit Errorlevel auswerten
Powershell: Netzwerkadapter-Konfiguration ändern (IP-Adresse, Gateway, DNS, DHCP)
Powershell-Skript als Benutzer-Anmeldeskript in einer Domäne nutzen?
Powershell: Fenster nach Skriptausführung nicht automatisch schließen
Powershell: UTF8-Problem beim Export
XML-Bearbeitung mit Powershell
Replace und Escaping in Powershell
MessageBox mit Powershell auf anderen Computern anzeigen
While- und Until-Schleifen in PowerShell und Batch
Einfaches inkrementelles Backup mit Powershell
Einfache Außer-Haus-Sicherung mit Powershell
Schnittstelle von XML zu MS-SQL mit Powershell realisieren
Powershell: Automatische Anwendungssteuerung
Macht die ExecutionPolicy für Powershell-Skripte Sinn?
Wiederkehrende E-Mail-Abwesenheitsnotiz für Outlook mit Powershell
HyperV-Netzwerkadapter per Powershell umbenennen und entfernen
Powershell: DELL Service Tags auslesen
Powershell-Backup-Skript für den Thunderbird-Profilordner
Download-Skript in Powershell
Einfache Powershell-Skripte
Java-Anwendungen über CMD oder Powershell starten
Pfad im Explorer schneller kopieren – auch als vollständigen UNC-Pfad
Windows 11: Startmenü anpassen, klassische Taskleiste, links ausrichten
Wie lange läuft mein PC schon? – PC Laufzeit auslesen unter Windows 10
Windows 10: Standorttyp des Netzwerks ändern
Windows Server 2016: WSUS startet nicht vernünftig
Hallo, das funktioniert ganz hervorragend. Ich hab allerdings versucht, das mit dem Aufgabenplaner zu automatisieren. Also Powershell starten und mit -command oder -File die .ps1 einbinden – da erhalte ich aber nur schwarze Bilder. Wenn ich die selbe Datei „normal“ von Hand starte, geht’s. Muß man da noch Parameter bei der Aufgabenerstellung einfügen?
Vielen Dank schonmal im voraus.
Hallo Jan,
freut mich, dass es grundsätzlich funktioniert. Wird das Skript eventuell unter einem anderen Benutzer ausgeführt? Wenn Bilder angelegt werden, scheint das Skript ja zumindest korrekt gestartet zu werden.
Viele Grüße
Tobias
Hallo Tobias, Danke erstmal für die schnelle Antwort.
Es ist egal, von welchem Benutzer ich das Script ausführe – das geht „von Hand“ immer. Ich habe die Aufgabe mit dem Administrator Konto erstellt und lasse das unabhängig von der Benutzeranmeldung ausführen. Egal welcher Benutzer sich anmeldet, es sind nur schwarze Bilder und hin und wieder ist der Mauszeiger drauf. Ich vermute, daß das mit dem Aufgabenplaner zusammenhängt – daß der also an den Scriptverweis noch irgendeinen Parameter angehängt haben will.
Gruß – Jan
Hallo Jan,
ah, so etwas habe ich vermutet. Das Problem wird vermutlich genau daran liegen, dass es als Administrator gestartet wird. Dieser hat ja keine aktive Sitzung in der das Bild deines anderen Benutzers zu sehen ist. Ich schaue mir das später nochmal an und ergänze noch meine Erkenntnisse im Post.
Viele Grüße
Tobias
Hallo Tobias,
genau so isses, wenn ich die Benutzer für die Stapelverarbeitung zulasse, geht´s. Ich überlege nur, ob das auch gut ist, oder ob ich besser nach einer anderen Möglichkeit suchen sollte.
Gruß – Jan
Hallo Jan,
danke für die Rückmeldung. Mir fällt jetzt auf die Schnelle zumindest nichts ein, was dagegen spricht. Die Benutzer konnten das Skript ja auch manuell ausführen.
Viele Grüße
Tobias