Office 365 Powershell Download/Setup/Installation

Die Windows PowerShell für Office 365 ist ein sehr leistungsfähiges Tool. Erweiterbar wie ein IBM Universal  Business Adapter und in etwa auch so komplex. Es gibt einen Punkt in der Lernkurve, an dem Anfänger häufig den Faden verlieren; dies passiert in der Regel nach dem Erlernen der einfachsten Cmdlets und bevor die Erstellung nützlicher Lösungen vollständig verstanden worden ist. Es ist eine einfache Sache „Get-Process“ auszuführen, aber eine andere eine Reihe von Cmdlets in eine Pipeline für einen Remotecomputer einzureihen, um eine Aktion remote auszuführen. Grade Office 365 ist beispielsweise nicht vollständig in die „Ausliefershell“ integriert und benötigt einige zusätzliche Module und die Initialisierung der Remote-Shell.

So gehts auf in die Office 365 Powershell

  1. Betriebssysteme unter Windows7/2008R2 brauchen WinRM2.0 mit der Powershell 2.0
  2. Download und Installation Microsoft Online Services Sign-in Assistant
  3. Download und Installation Azure Active Directory (AD) Module (x64, eine 32-bit-VErsion gibt es noch, wird aber nicht mehr supported)
  4. Optional: „SharePoint Online Module“ (Zur Sharepoint-Verwaltung)
  5. Optional: „Skype for Business Online Module“ (Zur Lync Skype for Business Verwaltung)

Verbindung zur Office 365 Powershell

$credential = get-credential
Import-Module MSOnline
Connect-MsolService -Credential $credential

Verbindung zur Skype for Business Powershell

Import-Module LyncOnlineConnector
$lyncSession = New-CsOnlineSession -Credential $credential
Import-PSSession $lyncSession

Verbindung zur Sharepoint Powershell

Import-Module Microsoft.Online.Sharepoint.PowerShell
Connect-SPOService -url https://contoso-admin.sharepoint.com -Credential $credential

Verbindung zur Exchange Powershell

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $credential -Authentication "Basic" -AllowRedirection
Import-PSSession $ExchangeSession

Verbindung zu den Office 365 Onlinediensten via Poweshell-Function

function Connect-O365 {
<#
.Synopsis
 Connects powershell to Office 365
.DESCRIPTION
 Use this to connect powershell to Office 365. You will be prompted for credentials.
.EXAMPLE
 Connect-O365
#>
 Set-ExecutionPolicy RemoteSigned
 $Cred = Get-Credential
 $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection
 Import-Module (Import-PSSession $Session -Allowclobber) -Global
 Connect-MsolService -Credential $Cred
}

(Danke Alex)

Powershell Skripts als geplante Tasks in der Aufgabenplanung starten

Powershell-Script lassen sich an der (Powershell-) Kommandozeile komfortabel starten, jedoch nicht ohne weiteres in geplanten Tasks.

Das geht so:
powershell-aufgabenplanung-startenFeld Programm/Script:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

Argumente:

-noninteractive -command "&{C:\PFAD\SCRIPTNAME.ps1}"

Mehr Details dazu hat das MSDN in diesem Artikel, aber im Prinzip ist es das schon.

PowerShell: Gruppen aus dem ActiveDirectory mit ihren Mitgliedern auflisten

Problem

Eine Management-Anforderung:

Bitte erstellen sie mal eben eine Liste alle Gruppen aus unserem ActiveDirectory mit allen Mitgliedern darin. Oh, am besten sowohl der DisplayName und auch der ganze LDAP-Pfad – und wenn es verschachtelte Gruppen, gibt nur den Gruppennamen.

Lösung

Der finde Admin weiss: So eine Liste ist, einmal erstellt, recht statisch und daher über die Zeit mehr und mehr realitätsfern, aber das zu erstellen ist natürlich ein Problem. Die Ausgabe ist natürlich ein schneller Hack, der erfahrene Admin baut selbstverständlich besser erst ein Objekt zusammen und wendet auf dessen Eigentschaften eine ausgabemethode an.

$Groups = Get-ADGroup -Properties * -Filter *
Foreach($G In $Groups) {
    $G.Name         | Out-File -Append .\gruppenliste.txt
    "---------------------" | Out-File -Append .\gruppenliste.txt
    $G.Members      | Out-File -Append .\gruppenliste.txt
    }

Die Gruppenliste liße sich selbstverständlich auch Filtern, zum Beispiel „Nur Gruppen die ‚rothaarig‘ im Namen haben“:

# $Groups = Get-ADGroup -Properties * -Filter {name -like "*rothaarig*"}

Powershell Fehler „0x80131515“ beim laden von Modulen (Import-Module)

Problem

Ein neues Powershell Modul oder Script möchte nicht geladen werden, stattdessen gibt es den Fehler:

Import-Module : Die Datei oder Assembly 
"file:///C:\Windows\system32\WindowsPowerShell\v1.0\Modules\NTFSSecurity\FOOBARNAME.dll" oder eine Abhängigkeit davon 
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In Zeile:1 Zeichen:1
+ Import-Module NTFSSecurity
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-Module], FileLoadException
    + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.ImportModuleCommand

Lösung

  1. .NET Framework 2.0 Installieren
    Install-WindowsFeature Net-Framework-Core -source \\HOST\PFAD\sxs
  2. NTFS-Feature „Zulassen“ auf den entsprechenden Dateien aktivieren
  3. Die gute alte Execution-Policy anpassen
    Set-ExecutionPolicy Unrestricted

Warum die ansonsten zu überaus clevere Scripting Guys allerdings ein „Datei nicht gefunden“ an dieser Stelle ausgeben ist uns ein Rätsel.

ActiveDirectory: Liste aller Computer mit Betriebssystem in einer OU erstellen

Diese PowerShell Zeile erstellt eine Liste alle Computer aus dem ActiveDirectory mit Name und Betriebssystem:

Get-ADComputer -Filter * -Property * -searchbase "OU=MEINEOU, DC=DOMAENE, DC=DOMAENETLD" -searchscope 1 | Format-Table Name,OperatingSystem -Wrap -Auto

Das Ergebnis, vor allem dessen Spalten, lassen sich über die Properties in „Format Table“ anpassen und erweitern. Mehr Beispiele folge sicher noch, aber aus reiner Faulheit sei dieser Schnippsel (den ich öfter benötige) hier schon mal abgelegt 🙂

Exchange 2010/2013 PST-Dateien per PowerShell importieren (und mögliche Fehler)

Es ist seit Exchange 2010 SP1 möglich, mit der PowerShell PST-Dateien direkt in Exchange-Mailboxen zu importieren. Dazu verwendet man man am bestem das CMDlet New-MailboxImportRequest. Die PST-Dateien müssen auf einem UNC-Pfad zur Verfügung stehen.

Vorher: Exchange Role („Rolle“) „Mailbox Import Export“ anpassen

New-ManagementRoleAssignment –Role "Mailbox Import Export" –User MEINUSER

Der aufrufende Nutzer muss Mitglied der RBAC-Rolle „Mailbox Import Export“ sein. NAch diesem PowerShell-Kommando ab- und wieder anmelden und eine neue Powershell-Sitzung starten. Erst dann steht das New-MailboxImportRequest CMDlet zur Verfügung.

Eine PST Mailbox Importieren
Nur eine einzige PST in eine einzige Mailbox:

New-MailboxImportRequest -Mailbox USERAALIAS -FilePath \\esp-ho-ex2010a\pst\USERAALIAS.pst -BadItemLimit 20

Das BadItemLimit ist eine Vorsichtmaßnahme aus der Praxis, damit der Import nicht an einer kaputten Spam-Mail aus dem Jahr 1994 scheitert. Für Härtefälle die PST-Datei mehrfach mit Scanpst behandeln oder mittels „-AcceptLargeDataLoss“ alle Defekte ausschliessen.

Eine PST Mailbox Importieren, in einen Postfach-Unterordner

New-MailboxImportRequest -FilePath \\SERVER\c$\PST\foobar.pst -Mailbox foobar -TargetRootFolder "NAME DES ORDNERS" -BadItemLimit 20

Ab und an macht das Sinn, vor allem wenn Benutzer ihr Postfach dringend mal aufräumen sollten …

Eine PST Mailbox Importieren, in ein persönliches Archiv

Einfach ein -IsArchive an den New-MailboxImportRequest anhängen. Das persönliche Exchange Archiv muss schon existieren und entsprechend lizenziert sein.
Mehrere PST-Dateien in Mailboxen Importieren
Sofern der Benutzer-Alias und der Name der PST-Datei übereinanderstimmen, ist es kein Problem alle Import-Auträge auf eoinmal zu erstellen (Exchange arbeitet diese Nacheinander ab):

Get-ChildItem \\SERVER\c$\PST\*.pst | %{ New-MailboxImportRequest -BadItemLimit 20 -Mailbox $_.BaseName -FilePath $_.FullName }

Status des Importvorganes kontrollieren

Get-MailboxImportRequest -Identity USERALIAS | Get-MailboxImportRequestStatistics -IncludeReport

Alle Importvorgänge (nach Status sortiert) kontrollieren

Get-MailboxImportRequest -Status Completed
Get-MailboxImportRequest -Status Queued
Get-MailboxImportRequest -Status InProgress
Get-MailboxImportRequest -Status Failed

Statusmeldung „StalledDueToCI“ und kein Fortschritt

Exchange 2013 hat eien Bug, der die Gruppe für den Suchdienst nicht korrekt anlegt. Mit dem Setup aus CU7 oder höher ist das behoben. Das kann man aber manuell nacholen:

  • Erstelle die Gruppe „ContentSubmitters“ (genau so geschrieben) in CN=Users
  • Den „Administratoren“ und dem „Netzwerkdienst“ Vollzugriff auf diese GRuppe geben
  • Den „Microsoft Exchange Search“ und den „Microsoft Exchange Search Host Controller“ Dienst neu starten.

Alle Importvorgänge aus der Warteschlange löschen

Get-MailboxImportRequest | Remove-MailboxImportRequest

Vollständige Importvorgänge aus der Warteschlange löschen

Get-MailboxImportRequest | where {$_.status -eq "Completed"} | Remove-MailboxImportRequest

ActiveDirectory Rechte-Vererbung via Powershell einschalten

Problem

active-directy-vererbung-einschaltenIm ActiveDirectory wurde die Vererbung von übergeordneten Rechten für Benutzer oder Computerobjekte ausgeschaltet. Obwohl es bestimmte Szenarien gibt, in denen eine solche Anpassung Sinn ergibt, führt das auslassen der Domänen-Rechtehirachie doch gerne auch zu schwer zu suchenden Fehlern.

Zum Beispiel:

  • ExchangeSynchronisationsfehler 86000C0A bei betroffenen Benutzern, obwohl OWA korrekt funktioniert
  • Dateisystems-Auflistung im Explorer schlängt mit 0x86000Cxx Fehlern Fehl
  • Fehler im Ereignisprotokoll von MSExchange ActiveSync mit dem Inhalt „Active directory Antwort: 00000005: SecErr: DSID-031521D0, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0″.“

Das sind noch nicht alle Fehler, es gibt noch einige weitere. Oft auch im Zusammenhang mit BlackBerry Enterprise Servern oder -Services.

Lösung

Wenn nur ein Objekt betroffen ist: Im Benutzerobjekt auf dem Tab Sicherheit unten die „Vererbung aktivieren“ und die folgenden Meldung abnicken.

Für mehrere Objekte hilft ein kurzes PowerShell-Script. Am einfachsten ist die Anwendung, wenn man eine PowerShell ISE als Administrator ausführt (!) und das Script in den oberen Script-Teil einfügt:

Import-Module activedirectory
$OU = "OU=INDIESEROUWERDENUSERGESUCHT,DC=MEINDOMAENE,DC=TLD"
$Users=get-aduser -Filter * -SearchBase $OU
if ($Users -ne $null) {
foreach ($Entry in $Users) {
 [string]$dn = (Get-ADUser $Entry).DistinguishedName
 $user = [ADSI]”LDAP://$dn”
 $acl = $user.objectSecurity
 Write-Host "Pruefe Benutzer:" (Get-ADUser $Entry).SamAccountName
 if ($acl.AreAccessRulesProtected){
 Write-Host "Fixe Benutzer:" (Get-ADUser $Entry).SamAccountName
 $acl.SetAccessRuleProtection($false,$true)
 $inherited = $acl.AreAccessRulesProtected
 $user.commitchanges()
 }
 }
}
else {
Write-Host "Keine Benutzer in $OU gefunden"
}

Referenz: http://support.microsoft.com/kb/2579075 und http://www.techguy.at/active-directory-objekte-mittels-powershell-wiederherstellen/

Office365 „winmal.dat“ (TNEF) versand abschalten

Problem

Einige Empfänger berichten, das Sie anstelle des gewünschten anhanges eine Datei namens „winmail.dat“ erhalten. Das betrifft vor allem ältere E-Mail-Programme, Apple-Mail und Systeme hinter älteren Firewalls/Mailfiltern.

Lösung

Man kann dem ausgehenden Connector des Office365 Exchange Online Dienstes das versenden des Microsoft TNEF-Formates vollständig abgewöhnen. Man stellt eine Verbindung zur Office365 Powershell her und konfiguriert die Einstellung mit dem Commandlet Set-RemoteDomain.

$Cred = Get-Credential
$shell = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $cred -Authentication Basic –AllowRedirection
Import-PSSession $shell
Set-RemoteDomain Default -TNEFEnabled $false

Mit „Get-RemoteDomain |fl“ lassen sich die aktuellen Einstellungen für den Connector überprüfen. Die folgenden Einstellungen sind für den Parameter TNEFEnabled verfügbar:

  • $true: TNEF wird für alle Nachrichten verwendet
  • $false TNEF wird nie für Nachrichten verwendet
  • $null der Absender gibt die Einstellung vor (Standardeinstellung). Funktioniert TOTAL großartig, denn jeder Mensch weiss ja wie man in Outlook-Kontakten das TNEF-Format konfiguriert. </ironic mode=“off“>

Gezielt lässt sich die Einstellung für bestimmt Domains so setzen:

Set-RemoteDomain foo.bar -TNEFEnabled $false