Get-Content -Path "C:\bla.txt" -Wait
Category: Powershell (Page 1 of 5)
Hier am Beispiel einer iManage Konfig-Datei, bei der das Debug-Log aktiviert wird.
$XMLPath = join-path $env:APPDATA "iManage\Work\Configs\logconfig.xml" $XMLOUTPath = join-path $env:LOCALAPPDATA "iManage\Work\Configs\logconfig.xml" $xmlDoc = [System.Xml.XmlDocument](Get-Content $XMLPath); $xmldoc.configuration.log4net.logger.level.value = "DEBUG" $xmlDoc.Save($XMLOUTPath);
Authentifiziertes Senden
$MailFrom = "absender@domain.de"
$MailTo = "empfaenger@domain.de"
$Username = "Benutzername@domain.de"
$Password = "Password"
$SmtpServer = "mail.domain.de"
$SmtpPort = "25"
$MessageSubject = "Mail Betreff"
$Message = New-Object System.Net.Mail.MailMessage $MailFrom,$MailTo
$Message.IsBodyHTML = $true
$Message.Subject = $MessageSubject
$Message.Body = @' <!DOCTYPE html> <html> <head> </head> <body> Testnachricht </body> </html> '@
$Smtp = New-Object Net.Mail.SmtpClient($SmtpServer,$SmtpPort)
$Smtp.EnableSsl = $true
$Smtp.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)
$Smtp.Send($Message)
Attachments können wie folgt hinzugefügt und entfernt werden:
$Message.Attachments.Add("C:\test.txt") $Message.Attachments.Add("C:\test.txt") # Über Index entfernen $Message.Attachments.RemoveAt("0") $Message.Attachments.RemoveAt("1")
Header können mit folgendem Befehl hinzugefügt werden:
$Message.Headers.Add("X-Test-Header","Daten")
Anonymes Senden
Mit folgender einfachen Funktion kann man über Powershell emails anonym, also ohne Benutzeraccount, an einen Mailserver senden. Bitte vorher die Empfänger, das From und den Mailserver anpassen.
function Send-Mail($subject, $body="", $attachments="", $highpriority=$false) { $msgTo = @("rcp1@domain.de", "rcp2@domain.de") $msgFrom = "$($env:computername)@domain.de" $mailServer = "" $utf8 = New-Object System.Text.utf8encoding $anonUsername = "anonymous" $anonPassword = ConvertTo-SecureString -String "anonymous" -AsPlainText -Force $anonCredentials = New-Object System.Management.Automation.PSCredential($anonUsername,$anonPassword) if ($highpriority -and $attachments.length -gt 0) { send-mailmessage -to $msgTo -from $msgFrom -subject $subject -body $body -smtpServer $mailServer -credential $anonCredentials -encoding $utf8 -priority High -Attachments $attachments } elseif ($attachments.length -gt 0) { send-mailmessage -to $msgTo -from $msgFrom -subject $subject -body $body -smtpServer $mailServer -credential $anonCredentials -encoding $utf8 -Attachments $attachments } elseif ($highpriority) { send-mailmessage -to $msgTo -from $msgFrom -subject $subject -body $body -smtpServer $mailServer -credential $anonCredentials -encoding $utf8 -priority High } else { send-mailmessage -to $msgTo -from $msgFrom -subject $subject -body $body -smtpServer $mailServer -credential $anonCredentials -encoding $utf8 } }
Anmerkungen:
Das Script baut eine anonyme Verbindung mit dem Mailserver auf. Der Mailserver benötigt hierzu also einen EmpfangsConnector (MS Exchange), der anonyme Verbindungen von dem Host erlaubt, auf dem das Script ausgeführt wird.
Man kann mit der WinSCP Assembly über PowerShell ganz einfach SFTP-Uploads durchführen. WinSCP hat dazu eine gute Doku, die auch zeigt, wie man die Assembly als COM Objekt nutzt und wie man Ressourcen zu einem .NET Projekt hinzufügt und in eine temporäre Datei entpackt:
Das Ausführen von Powershell Befehlen mit dem Systemkonto erreicht man am besten mit PsExec aus der Sysinternals Suite, die inzwischen zu Microsoft gehört:
Start-Process -FilePath cmd.exe -Verb Runas -ArgumentList ‘/k C:\tools\PsExec.exe -i -s powershell.exe’
https://www.heise.de/download/product/sysinternals-suite-48696
Wer Wildcard Zertifikate in Exchange 2013 oder 2016 einsetzen will, muss ein paar Dinge beachten. Microsoft macht es mal wieder etwas komplizierter als nötig.
Für die Aufgabenplanung einen Task mit Hilfe von Powershell erstellen:
$objTime=[datetime]::ParseExact("09.12.2020 03:00:00", "dd.MM.yyyy HH:mm:ss", $null) $CMD = New-ScheduledTaskAction -Execute """\\Pfad mit Leerzeichen\script.bat""" $Time = New-ScheduledTaskTrigger -Once -At $objTime $User = "domain\_svc_taskrunner" $Password = "" Register-ScheduledTask -TaskName "Script Install" -Trigger $Time -User $User -Password $password -Action $CMD -AsJob -Force -RunLevel Highest
Eine Remotesitzung über Enter-PSSession muss hergestellt sein. Siehe hier.
$url = "https://installer.bea-brak.de/cs/installation/1/beAClientSecurity-Installation.zip" $outputPath = "C:\Temp\" $outputFile = "beAClientSecurity-Installation.zip" if (-Not(Test-Path "c:\temp")) { New-Item -Path "c:\" -Name "Temp" -ItemType "directory" } Invoke-WebRequest -Uri $url -OutFile (Join-Path -Path $outputPath -ChildPath $outputFile) Expand-Archive (Join-Path -Path $outputPath -ChildPath $outputFile) $outputPath $app = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "bea*" } $app | foreach-object {$_.uninstall()} TASKKILL /F /IM beAClientSecurity.exe /T Remove-Item "C:\Program Files (x86)\BRAK" -Recurse -Force $runcmd = Join-Path -Path $outputPath -ChildPath "beAClientSecurity-Installation.exe" Start-Process $runcmd -ArgumentList "-q" -wait
In Teil 1 ging es um das Herstellen der Voraussetzungen für das Remotemanagement. In diesem Teil greifen wir nun auf den Client zu und führen administrative Aufgaben aus.
Einmal findet der Zugriff über den Hostnamen statt und einmal über die IP, falls der Hostname nicht mit der momentanen IP im DNS eingetragen ist.
Zugriff über den Hostnamen
Dies ist die normale Art der Remoteadmnistration. Das funktioniert direkt, sofern dem Client über DNS eine IP zugeordnet ist und der Client den DNS Server erreichen kann, um Kerberos Tickets abzuholen. Wenn diese Voraussetzungen nicht erfüllt sind geht es als Fallback über die IP, siehe weiter unten.
Als Administrator auf Server anmelden, Powershell starten.
Enter-PSSession clientname
Die Shell wechselt bei Erfolg auf den Client und der Prompt wechselt zu soetwas wie
[clientname:] PS C:\users\adminman\Documents>
Zugriff über die IP
Der Zugriff per IP geschieht in mehreren Schritten
- TrustedHosts auf Serverseite definieren
- Credentials abfragen
- Session starten
Zuerst als Administrator auf Server anmelden, Powershell als Administrator starten.
1. TrustedHosts auf Serverseite definieren
cd wsman:\localhost\Client Set-Item TrustedHosts -Value * -Force dir
Ein Sternchen bedeutet alle Hosts sind vertrauenswürdig. Die Einstellung ist Beispielhaft und sollte in einem Produktivsystem angepasst werden. Z.B. immer auf die Client-IP, den man erreichen will. Oder auf die Client DHCP Range.
Man löscht die TrustedHosts mit
Set-Item TrustedHosts -Value "" -Force
2. Credentials abfragen
Beim Zugriff über eine IP muss eine explizite Authentifizierung erfolgen.
$cred = Get-Credential
3. Session starten
Enter-PSSession <ip> -credential $cred -Authentication Negotiate
Fertig
Die Eingabe von Kommandos kann nun erfolgen. Sie werden im Kontext des Benutzers ausgeführt, der den Befehl Enter-PSSession ausgeführt hat. Ein sogenannter second Hop ist nicht möglich. Man kann von dem Client aus keine anderen Computer oder Netzlaufwerke über die Windows-Authentifizierung erreichen. HTTP und HTTPS geht aber zum Beispiel.
In diesem Zusammenhang ein paar Scriptebeispiele, die in einer solchen Sitzung Sinn machen:
Remotesupportsoftware bietet nicht immer die Möglichkeit administrative Aufgaben durchzuführen. Man Programme also nur im Kontext des aktuell angemeldeten Benutzers ausführen. Bei Teamviewer, Teams und diversen anderen Programmen, bei denen man den Desktop freigeben kann, ist dies der Fall.
Eine Ausnahme sei erwähnt: der Fastviewer Client kann das. Soll keine Werbung sein, ist nur der einzige Client den ich kenne, der das kann.
Hier eine Anleitung zur vorbereitung der Client für PowerShell Remotemanagement über VPN. Das ist eine besondere Form, da man Remotesitzungen in Powershell normalerweise über den Hostnamen durchführt. Dazu muss der Client mit der IP im DNS registriert sein. Das ist bei VPN-Verbindungen oft nicht der Fall. Deshalb zeige ich in diesem Artikel auch wie man über eine IP per Powershell auf einen Client zugreifen kann und welche Voraussetzungen dafür erfüllt sein müssen.
Zuerst werden die nötigen Gruppenrichtlinien ausgerollt:
- Firewallausnahmen auf dem Client setzen
- WinRM Dienst starten
- TrustedHost Liste für die Clients definieren (für Zugriff über IP nötig)
- Ausführungsrichtlinie bestimmen
Diese Gruppenrichtlinien sind alle für die Clients bestimmt. Also in der entsprechenden OU ausrollen.
1. Firewallausnahmen auf dem Client setzen
Diese Art der Firewallkonfiguration funktioniert erst ab Windows 10. Davor musste man die Ports über die folgende GPO konfigurieren Richtlinien->Administrative Vorlagen->Netzwerk-Netzwerkverbindungen->Windows Defender Firewall->{Profil}->Eingehende Portausnahme festlegen.
Hier ein Beispiel für WSMan:
Also los gehts!
Richtlinien->Windows-Einstellungen->Sicherheitseinstellungen->Windows-Firewall mit erweiterter Sicherheit->Eingehende Regeln
Rechte Maustaste->Neue Regel
Vordefinierte Regel->Windows-Remoteverwaltung->HTTP eingehend
Dann mit der rechten Maustaste auf die eben erstellte Regel klicken, den Bereich einschränken und bei Bedarf auch für das öffentliche Netzwerk freigeben. Man sollte auf jeden Fall den Bereich der Server einschränken, über die man die Remoteverwaltung durchführen kann:
Ping aktiviert man mal besser gleich mit:
Rechte Maustaste->Neue Regel
Vordefinierte Regel->Datei- und Druckerfreigabe->ICMPv4 eingehend
WinRM Dienst starten
Einstellungen->Systemsteuerungseinstellungen->Dienste
Rechts Mausteste->Neu->Dienst
3. TrustedHost Liste für die Clients definieren (für Zugriff über IP nötig)
Richtlinien->Administrative Vorlagen->Windows-Komponenten->Windows-Remoteverwaltung (Windows Remote Management, WinRM)->WinRM-Client->Vertrauenswürdige Hosts
Die Eingabemöglichkeiten sind gut erklärt. Man kann mit Domänennamen arbeiten oder mit IP-Adressen. In meinem Fall habe ich beides gemacht und eingetragen: *.domain.com, 10.0.1.*
Die Domaine und die Ip’s sind natürlich individuell anzupassen. In meinem Fall ist die IP Range 10.0.1.* Mein Serverbereich. Man kann also nur von den Servern aus auf die Clients per PowerShell unter Angabe der IP zugreifen.
4. Ausführungsrichtlinie bestimmen
Bei PowerShell gibt es sogenannte Ausführungsrichtlinien. Diese bestimmen ob ein Script unsigniert ausgeführt werden darf. Mehr dazu hier:
Wir definieren, dass alle Scripte, die nicht lokal ausgeführt werden, signiert seien müssen. Die nächsthöhere Sicherheitsstufe ist, dass alle Script signiert seien müssen. Stichwort Set-AuthenticodeSignature.
Richtlinien->Administrative Vorlagen->Windows-Komponenten->Windows PowerShell->Scriptausführung aktivieren
Weiter geht es mit Teil 2: