K.inc Tec Blog

Mein kleines EDV Logbuch

Category: Powershell (Page 1 of 5)

Tail -f Powershell equivalent

Get-Content -Path "C:\bla.txt" -Wait

PowerShell XML bearbeiten

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);

PowerShell Mail senden

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.

Powershell S-FTP Upload

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:

https://winscp.net/eng/docs/library_install#downloading

Weiterlesen

Powershell als Systembenutzer ausführen

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

Exchange Nutzung von Wildcard Zertifikaten

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.

Weiterlesen

Powershell Sheduled Task erstellen

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

beA Remoteinstallation über die PowerShell

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

PowerShell Remotemanagement über VPN Teil 2 von 2: Remotezugriff

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

  1. TrustedHosts auf Serverseite definieren
  2. Credentials abfragen
  3. 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:

PowerShell Remotemanagement über VPN Teil 1 von 2: Client GPO’s

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:

  1. Firewallausnahmen auf dem Client setzen
  2. WinRM Dienst starten
  3. TrustedHost Liste für die Clients definieren (für Zugriff über IP nötig)
  4. 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:

WSMan in Client Firewall für ältere Clients erlauben

Also los gehts!

Richtlinien->Windows-Einstellungen->Sicherheitseinstellungen->Windows-Firewall mit erweiterter Sicherheit->Eingehende Regeln

Rechte Maustaste->Neue Regel

Vordefinierte Regel->Windows-Remoteverwaltung->HTTP eingehend

Nur die Regel für die Domäne auswählen

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:

Bereich einschränken
Netzwerkprofile wählen

Ping aktiviert man mal besser gleich mit:

Rechte Maustaste->Neue Regel

Vordefinierte Regel->Datei- und Druckerfreigabe->ICMPv4 eingehend

Ping erlauben

WinRM Dienst starten

Einstellungen->Systemsteuerungseinstellungen->Dienste

Rechts Mausteste->Neu->Dienst

WinRM Dienst starten
2. Reiter. Bei Problemen neu starten

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:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.1

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

Scriptausführung

Weiter geht es mit Teil 2:

Page 1 of 5

© 2016 kinc.de