PowerShell – WebAccess Installation/Konfiguration

Windows Server 2012 bringt ein neues Feature mit sich: PowerShell Web Access. Damit kann man in so gut wie jedem Browser, eine PowerShell Session öffnen. Das tolle an diesem Feature ist, dass man beim Login jeden Computer/Server zur Anmeldung auswählen kann. Somit muss nicht nicht extra eine Remote Session aufbauen.

PowerShell WebAccess Instalieren

Um die Funktion benutzen zu können, muss ein Windows Feature installiert werden.

PowerShell WebAccess Instalieren – Windows Feature

Mit dem folgendem Befehl, wird das Windows Feature installiert:

Install-WindowsFeature -Name WindowsPowerShellWebAccess -ComputerName localhost -IncludeManagementTools -Restart

PowerShell WebAccess Instalieren – Einrichtung des Gateway

Sollte bereits ein gültiges SSL Zertifikat dem IIS zugeordnet sein, kann folgender Befehl zur Konfiguration ausgeführt werden:

Install-PswaWebApplication

Sollte noch kein SSL Zertifikat dem IIS zugeordnet sein, kann folgender Befehl zur Konfiguration ausgeführt werden und es wird ein selbstsigniertes Zertifikat erstellt:

Install-PswaWebApplication -UseTestCertificate

PowerShell WebAccess Instalieren – Autorisierungsregel

Dem Usernamen * und dem Computernamen * wird der Zugriff erlaubt. Man kann natürlich auch nur einem bestimmten Benutzer/Computer den Zugriff erlauben.

Add-PswaAuthorizationRule -UserName * -ComputerName * -ConfigurationName microsoft.powershell

Beispiel

Das ganze sieht dann so aus:

Exchange Server 2010 – Öffentliche Ordner – Zombie User entfernen

Wenn ein Benutzer vollständig gelöscht oder nur die Mailbox gelöscht wird, erscheint dieser als „NT User:xxxxxxxxxxxxxxxxxxxxxxxxxx“ in den Berechtigungen des Öffentliches Ordners. Diese Berechtigungen sind eigentlich nicht per Exchange Console oder Powershell entfernbar und verbleiben an dem Ordner. Mit ExFolders kann man diese händisch löschen, was aber sehr viel manueller Aufwand bedeutet. Ich habe ein Script geschrieben, dass diese Zombie Benutzer löschen kann:

Get-PublicFolder "\" -recurse -resultsize unlimited | Get-PublicFolderClientPermission | Where { $_.User.ToString().Contains("NT User:") -eq $true } | Remove-PublicFolderClientPermission -confirm:$false

Es werden alle Zombie User gelöscht, die Berechtigungen in der gesammten öffentlichen Ordner Struktur hatten.

PowerShell – Nützliche Exchange Server 2010 Befehle

Da sich die PowerShell Befehle für den Exchange Server großer Beliebtheit erfreuen, habe ich mal ein paar neue Befehle hinzugefügt.

Exchange Server – ActiveSync

Liste aller ActiveSync Geräte

Get-ActiveSyncDevice | ft

ActiveSync-Statistik eines Postfaches

Get-ActiveSyncDeviceStatistics -mailbox "manuel.maliszewski"

Alle ActiveSync Geräte der OU „Ausgeschiedene User“ löschen

Get-ActiveSyncDevice -OrganizationalUnit "Ausgeschiedene User" | Remove-ActiveSyncDevice

Exchange Server – Datenbanken

Übersicht über Datenbanken und deren Größe

Get-MailboxDatabase -Status | ft name, databasesize

Übersicht über Datenbanken mit Informationen zu Retentation und Recoverable Quotas

Get-MailboxDatabase | Select Name, Server, MailboxRetention, Recoverab* |ft

Exchange Server – Postfächer

Übersicht der Postfächer einer Datenbank – Sortiert nach letztem Login mit den Feldern: Benutzername, Größe, Datum der letzten Anmeldung, Letzte Anmeldung

Get-Mailbox -Database "Berlin II - Datenbank II" | Get-MailboxStatistics | Sort LastLogonTime | ft DisplayName, TotalItemSize, LastLogonTime, LastLoggedOnUserAccount

Detailiert Übersicht eines Postfaches mit Unterordnern und dessen Größe

Get-MailboxFolderStatistics -identity "manuel.maliszewski" | ft FolderPath, FolderSize, ItemsInFolder, FolderAndSubfolderSize

Alle Postfächer mit Weiterleitung

Get-Mailbox | Where-Object { $_.ForwardingAddress –ne $null } | Select Name, ForwardingAddress

Alle Postfächer mit „Sende als“ und „volle Postfachberechtigung“

Get-Mailbox | Get-ADPermission | Where-Object { ($_.ExtendedRights -like "*send-as*") -and -not ($_.User -like "nt authority\self") }

Postfächer auf die der Benutzer „chilli“ volle Berechtigungen hat

Get-Mailbox | Get-MailboxPermission | Where-Object { ($_.AccessRights -eq "*fullaccess*") -and ($_.User -like "*chilli*") }

Exchange Server – Warteschlange

Warteschlange anzeigen auf Server S8K011

Get-Queue -Server S8K011

Warteschlangen Queue verschieben

./Move-TransportDatabase.ps1 –QueueDatabasepath “C:\Queue” –QueueDatabaseLoggingPath “D:\Queue”

Exchange Server – System

Alle Exchange-Dienste starten

Test-ServiceHealth | Select ServicesNotRunning | foreach { Start-Service $_.ServicesNotRunning }

Exchange-Dienste Status in Tabelle

Test-ServiceHealth | ft

Testet die Exchange Organisation auf Fehler

Test-SystemHealth

Exchange Server – Verschiedenes

Sprache aller Postfächer auf dem Server S8K011 auf Deutsch setzen

Get-Mailbox -Server S8K011 | Set-Mailbox -language de-DE

Sprache der Postfächer auf Server S8K012 anzeigen, nach Sprache sortieren und als Tabelle mit Namen und Sprache anzeigen

Get-Mailbox -Server S8K012 | sort Languages | ft name, Languages

Liste der Benutzer die den Abwensenheitsassistenten aktiviert haben

Get-Mailbox | Get-MailboxAutoReplyConfiguration | Where-Object { $_.AutoReplyState –eq “scheduled” }

Datenbank – RPC CAS abfragen

Get-MailboxDatabase -Server s8k011 | fl name, rpc\*

Datenbank-Index

Standardmäßig werden alle Datenbanken mit aktiviertem Index angelegt. in diesem Ordner wird der Index erstellt: %datenbankpfad%\CatalogData-Guid. Diesen kann man allerdings aktivieren:

Set-MailboxDatabase MailboxDatabaseName -IndexEnabled:$false

Erste Datenbank löschen

Beim Installieren von Exchange Server 2010 wird automatisch eine Datenbank angelegt. Diese Läst sich nicht über die Gui löschen, auch wenn alle Postfächer verschoben sind. Darum muss man die

System-Postfächer verschieben:

Get-mailbox -Arbitration | New-MoveRequest -TargetDatabase "Berlin I - Postfach I"

Danach muss man noch die Verschiebungsanforderungen löschen und die Datenbank ist entfernbar.

Scripts

Alle Mitglieder einer Gruppe anzeigen und das bis zu 5 Ebenen.

Import-Module ActiveDirectory
$DG = Read-Host

function Get-MySubGroupMembersRecursive
{
	$Mitglieder = Get-ADGroupMember $DG
	ForEach ($Mitglieder in $Mitglieder)
	{
		If ($Mitglieder.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive1
		}
		If ($Mitglieder.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive1
{
	$Mitglieder2 = Get-ADGroupMember $Mitglieder.Name
	ForEach ($Mitglieder2 in $Mitglieder2)
	{
		If ($Mitglieder2.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive2
		}
		If ($Mitglieder2.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder2.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive2
{
	$Mitglieder3 = Get-ADGroupMember $Mitglieder2.Name
	ForEach ($Mitglieder3 in $Mitglieder3)
	{
		If ($Mitglieder3.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive3
		}
		If ($Mitglieder3.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder3.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive3
{
	$Mitglieder4 = Get-ADGroupMember $Mitglieder3.Name
	ForEach ($Mitglieder4 in $Mitglieder4)
	{
		If ($Mitglieder4.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive4
		}
		If ($Mitglieder4.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder4.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive4
{
	$Mitglieder5 = Get-ADGroupMember $Mitglieder4.Name
	ForEach ($Mitglieder5 in $Mitglieder5)
	{
		If ($Mitglieder5.ObjectClass -eq "Group")
		{
			Get-MySubGroupMembersRecursive5
		}
		If ($Mitglieder5.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder5.Name)
		}
	}
}

function Get-MySubGroupMembersRecursive5
{
	$Mitglieder6 = Get-ADGroupMember $Mitglieder6.Name
	ForEach ($Mitglieder6 in $Mitglieder6)
	{
		If ($Mitglieder6.ObjectClass -eq "User")
		{
			Write-Host ($Mitglieder6.Name)
		}
	}
}

Get-MySubGroupMembersRecursive

PowerShell – Tutorial

Betriebssysteme mit und ohne PowerShell

Ohne PowerShell (kann nach installiert werden)

  • Windows XP
  • Windows Server 2003 & R2
  • Windows Server 2008
  • Windows Vista

Mit PowerShell

  • Windows Vista SP1 – PowerShell 1
  • Windows 7 – PowerShell 2
  • Windows Server 2008 R2 – PowerShell 2

PowerShell Umgebung vorbereiten

Ausführung von lokalen Scripts zulassen

Set-ExecutionPolicy remotesigned

PowerShell durch Community Extensions erweitern

Man kann die PowerShell durch Extensions erweitern und hat damit mehr Commandlests, Funktionen und Aliase zur Verfügung. Ein Erweiterung mit den unter anderem hier beschrieben Commandlets, nennt sich PSCX. Die Installation von Extensions anhand des Beispiels PSCX:

Den Ordner an folgende Stelle Kopieren: %USERPROFILE%\Documents\WindowsPowerShell\Modules\ und dann folgendes cmdlet ausführen:

Import-Modules PSCX

Power Shell ISE

Die Integrated Scripting Enviroment (ISE) ist ein einfacher Scripteditor, der mit PowerShell 2.0 mitgeliefert wird. Diese kann man aus dem Startmenu oder mit dem Befehl „ise“ starten.

Vergleichsoperatoren

Vergleich Vergleich o. Groß/Kleinschreibung Beschreibung
-lt -ilt Kleiner
-le -ile Kleiner oder gleich
-gt -igt Größer
-ge -ige Größer oder gleich
-eq -ieq Gleich
-ne -ine Ungleich
-like -ilike Ähnlichkeit zwischen Zeichenketten
-notlike -inotlike Keine Ähnlichkeit zwischen Zeichenketten
-match Vergleich mit regulärem Ausdruck
-nomatch Stimmt nicht mit regulärem Ausdruck überein
-is Typvergleich

Logische Operatoren

Logischer Operator Beschreibung
-not oder ! Nicht
-and Und
-or Oder

Power Shell verwenden

Mögliche Befehle und Hilfe

Alle installierten Commandlets ausgeben lassen:

Get-Command

Hilfe zu einem Commandlet anzeigen lassen, in diesem Fall Get-Process:

Get-Help Get-Process

Hilfe zu Parametern eines Commandlets anzeigen lassen:

Get-Help Get-Process -parameter ""

Objektorientiertes Piplining

Wie auch in der Unix-Shell oder der Windows-Console, wird für die Pipeline | verwendet.

Alle Datensätze deren id kleiner als 5 ist:

| Where-Object { $_.id -lt 5 }

Von allen Datensätzen nur die Felder Name und id ausgeben:

| Select-Object Name, id

Alle Datensätze nach dem Feld Name sortieren:

| Sort-Object Name

Alle Datensätze nach dem Feld Name gruppieren:

| Group-Object Name

Alle Datensätze in einer Tabelle formatueren:

| Format-Table

Alle Datensätze in die Datei export.txt exportieren:

| Out-File export.txt

Alle Datensätze in eine dynamische Tabelle exportieren:

| Out-GridView

Für jedes Objekt:

| Foreach-Object

Alternativ zum einfache weiterleiten innerhalb der Pipe, kann man das Ergebnis auch zwischenspeichern.

Praktische Beispiele der Anwendung

Alle Objekte der Klasse Benutzer werden in die Datei C:\user.txt geschrieben:

Get-ADObject -dis "LDAP://server/dc=domain, dc=local" -class user | out-file c:\user.txt

Alle User werden anhand ihres SAMAccountName ausgegeben und nach diesem Sortiert:

Get-ADObject -dis "LDAP://server/dc=domain, dc=local" -class user | Select-Object SAMAccountName | sort SAMAccountName

Alle Opjekte der Klasse Grupe aus dem AD auslesen, deren „Name“ mit „SG – “ anfangen und nach Name sortieren und nur Name anzeigen.

Get-ADObject -dis "LDAP://server/dc=domain, dc=local" -class group | Select-Object Name | where { $_.Name -ilike "SG - " } | sort Name

Alle User anzeigen, die ihr Home Directory auf dem fileserver1 haben:

Get-ADObject -dis "LDAP://server/dc=domain, dc=local" -class user | Select-Object Name, homeDirectory | where { $_.homeDirectory -ilike "\\fileserver1\" }

Alle Prozesse des InterneExplorers beenden:

Get-Process iexplore | Stop-Process

Datum auslesen, formatieren und in $date speichern:

$date = (Get-Date).ToShortDateString()

Objekte der Klasse Dienste, mit dem Status „running“ aulesen, nur den DisplayName anzeigen und zählen:

$services = "Services: " + (Get-Service | where { $_.Status -ieq "running" } | Select-Object DisplayName).Count

Objekte der Klasse Prozesse auslesen, deren handles > 0 ist und nur den Namen anzeigen und zählen:

$processes = "Prozesse: " + (Get-Process | where { $_.Handles -igt 0 } | Select-Object Name).Count

Dienste mit dem Status „running“ anzeigen und nur den DisplayName ausgeben:

Get-Service | where { $_.Status -ieq "running" } | Select-Object DisplayName

Prozesse mit dem ProcessName „winlogon“ auslesen und den ProcessName im GridView ausgeben:

Get-Process | where { $_.ProcessName -ieq "winlogon" } | Select-Object ProcessName | Out-GridView

Für jedes Objekt der Klasse Prozesse nach Format-List konvertieren:

Get-Process | ForEach-Object { $_.ProcessName } | Format-List

Prozesse auslesen und nach namen selektieren und gruppieren:

Get-Process | Select-Object name | group name

Alle Unterobjekte von C:\Windows die mit „s“ anfangen und nur die ersten 5 davon ausgeben:

Get-ChildItem C:\Windows\ | Where-Object { $_.Name -ilike "s" } | Select-Object -first 5