Powershell Copyjob mit SMB und Email

Man kann auch ohne nervige Popups nach Tracking fragen. Siehste hier. Stimmst du dem zu?

Wenn du einen Button klickst, setze ich ein Cookie, damit ich weiß, was du geklickt hast. Google Analytics. Ich frage einmal pro Browser-Sesison.
Hier stehen einige Logindaten im Quelltext. Um Himmels Willen, nutzt never ever die Domain-Adminlogindaten. Das ist fatal. Richtig fatal. Erstellt einen neuen AD-User. Gebt ihm nur die Rechte auf die zwei Verzeichnisse. Das ist sonst fahrlässig. Grob fahrlässig. Ich scherze nicht.

In diesem Beispiel nutzen wir den Domain-Admin für Login über SMB. Siehe oben. Shame on me. Wir lernen drei Powershell-Scripte kennen – zum Kopieren von Daten von einem SMB-Pfad zu lokal, von lokal zu SMB und von lokal zu lokal. Warum man SMB zu SMB machen sollte, ist mir unverständlich, daher poste ich hier keinen Quelltext dazu.

Vorbereitung: Ablegen des SMTP-Kennwortes

Damit die Email am Ende versendet werden kann, müssen wir erst das Kennwort in einem SecureString ablegen. Aus diesem können wir dann ein Object vom Typ PSCredential generieren.

(Get-Credential).password | ConvertFrom-SecureString > smtp.txt

Die Datei „smtp.txt“ muss im selben Verzeichnis wie das Powershell-Script liegen. Und zwingenderweise sogar im selben CWD. Also muss CWD = Verzeichnis von Powershell sein. Und da müssen das Powershell-Script und die Textdatei drin sein.

Kopieren von Daten von SMB zu lokalem Pfad

Die von mir empfohlene Variante. Im Falle einer Malware liegen die Logindaten auf dem Server, der die Backups macht, nicht auf dem, der nun Bitcoins farmt und fleißig Daten nach Nordkorea versendet.

# Daten des Quell-Servers
$Host = "DC"
$User = "TINO-RUGE\Administrator"
$Pass= "DasIstNichtMeinKennwort"
$Dir = "Freigabe\Ordner\Unterordner"

# Lokale Ziel-Daten
$Target = "D:\Backup"

# Speicherort des temporären Logfiles, bevor es per Mail rausgeht
$Logfile = "D:\CopyJobLog.txt"

# SMTP Daten
$SMTPHost = "";
$SMTPUser = "";
$SMTPSubject = "";
$SMTPMessage = "";
$SMTPFrom = "";
$SMTPTo = "";

# Login auf dem Remote-Server, Robocopy zu lokal, Trennen der Verbindung
NET USE \\$Host\IPC$ /u:$User $Pass
robocopy.exe \\$Host\$Dir\ $Target /XD * /Z /MIR /LOG:$Logfile
NET USE \\$Host\IPC$ /D

# Lesen des SMTP-Kennwortes, bauen des PSCredentials
$Cred = Get-Content .\smtp.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PSCredential $SMTPUser, $Cred

# Versenden der Email
Send-MailMessage -Credential $Cred -To $SMTPTo -From $SMTPFrom -Subject $SMTPSubject -Body $SMTPMessage -SmtpServer $SMTPHost -Attachments $Logfile

Kopieren von Daten von lokalem Pfad zu SMB

Kann man auch machen. Aber dann geht man zumindest eher von einem Hardware-Defekt aus.

# Lokale Daten, die kopiert werden
$Source = "D:\WichtigeDaten"

# Daten des Ziel-Servers
$Host = "BACKUP"
$User = "TINO-RUGE\Administrator"
$Pass= "DasIstNichtMeinKennwort"
$Dir = "Freigabe\Ordner\Unterordner"

# Speicherort des temporären Logfiles, bevor es per Mail rausgeht
$Logfile = "D:\CopyJobLog.txt"

# SMTP Daten
$SMTPHost = "";
$SMTPUser = "";
$SMTPSubject = "";
$SMTPMessage = "";
$SMTPFrom = "";
$SMTPTo = "";

# Login auf dem Remote-Server, Robocopy zu SMB, Trennen der Verbindung
NET USE \\$Host\IPC$ /u:$User $Pass
robocopy.exe $Source \\$Host\$Dir\ /XD * /Z /MIR /LOG:$Logfile
NET USE \\$Host\IPC$ /D

# Lesen des SMTP-Kennwortes, bauen des PSCredentials
$Cred = Get-Content .\smtp.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PSCredential $SMTPUser, $Cred

# Versenden der Email
Send-MailMessage -Credential $Cred -To $SMTPTo -From $SMTPFrom -Subject $SMTPSubject -Body $SMTPMessage -SmtpServer $SMTPHost -Attachments $Logfile

Kopieren lokal zu lokal (lame)

Sehe ich keinen persönlichen Grund drin. Dennoch, der Vollständigkeit halber:

# Lokale zu sichernde Daten
$Source = "D:\WichtigeDaten"

# Daten des Zieles
$Target = "D:\Backup"

# Speicherort des temporären Logfiles, bevor es per Mail rausgeht
$Logfile = "D:\CopyJobLog.txt"

# SMTP Daten
$SMTPHost = "";
$SMTPUser = "";
$SMTPSubject = "";
$SMTPMessage = "";
$SMTPFrom = "";
$SMTPTo = "";

# Langweiliges kopieren der Daten von lokal zu lokal
robocopy.exe $Source $Target /XD * /Z /MIR /LOG:$Logfile
# Gähn (kp ob Umlaute in Powershell gehen)

# Lesen des SMTP-Kennwortes, bauen des PSCredentials
$Cred = Get-Content .\smtp.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PSCredential $SMTPUser, $Cred

# Versenden der Email
Send-MailMessage -Credential $Cred -To $SMTPTo -From $SMTPFrom -Subject $SMTPSubject -Body $SMTPMessage -SmtpServer $SMTPHost -Attachments $Logfile

Kopieren von SMB zu SMB

Okay, ich habe gelogen. Hier ist das Script von SMB zu SMB. Allerdings nur teilweise.

# Zugangsdaten - angenommen sie sind bei Quelle und Ziel identisch
$User = "TINO-RUGE\Administrator"
$Pass= "DasIstNichtMeinKennwort"

# Daten, die gesichert werden
$SrcHost = "DC"
$SrcDir = "Freigabe\Ordner\Unterordner"

# Lokale Daten, die kopiert werden
$TargetHost = "BACKUP"
$TargetDir = "Sicherung"

# Speicherort des temporären Logfiles, bevor es per Mail rausgeht
$Logfile = "D:\CopyJobLog.txt"

# SMTP Daten
$SMTPHost = "";
$SMTPUser = "";
$SMTPSubject = "";
$SMTPMessage = "";
$SMTPFrom = "";
$SMTPTo = "";

# Login auf dem Remote-Server, Robocopy zu lokal, trennen der Verbindung
NET USE \\$SrcHost\IPC$ /u:$User $Pass
NET USE \\$TargetHost\IPC$ /u:$User $Pass
robocopy.exe \\$SrcHost\$SrcDir\ \\$TargetHost\$TargetDir\ /XD * /Z /MIR /LOG:$Logfile
NET USE \\$SrcHost\IPC$ /D
NET USE \\$TargetHost\IPC$ /D

# Lesen des SMTP-Kennwortes, bauen des PSCredentials
$Cred = Get-Content .\smtp.txt | ConvertTo-SecureString
$Cred = New-Object System.Management.Automation.PSCredential $SMTPUser, $Cred

# Versenden der Email
Send-MailMessage -Credential $Cred -To $SMTPTo -From $SMTPFrom -Subject $SMTPSubject -Body $SMTPMessage -SmtpServer $SMTPHost -Attachments $Logfile

Tipp: sollten Logindaten bei Quelle und Ziel unterschiedlich sein, muss ein bisschen was angepasst werden. Ich schmeiße mal folgende 6 Zeilen Code in den Raum, was ihr wo ergänzen und/oder ersetzen müsst, dürft ihr raten. Es sollte offensichtlich sein:

$SrcUser = "TINO-RUGE\Administrator"
$SrcPass= "DasIstNichtMeinKennwort"
$TargetUser = "TINO-RUGE\Administrator"
$TargetPass= "DasIstNichtMeinKennwort"
NET USE \\$SrcHost\IPC$ /u:$SrcUser $SrcPass
NET USE \\$TargetHost\IPC$ /u:$TargetUser $TargetPass