Office 365 - PowerShell

Für die Verwaltung von Office 365 eignet sich in einem kleinen Rahmen schon die GUI, besonders wenn Sie keinen Verzeichnisabgleich benutzen und die Anwender einer kleinen Firma (Siehe auch Office 365 - Zielgruppe) sich selten ändern.

Die alte MSOnline und AzureAD-Powershell ist abgekündigt. Siehe EOL MSOnline und AzureAD PowerShell. Zeit zum Update ihrer Skripte

Wer aber größere Stammdaten zu pflegen hat oder diese per DirSync noch mit einem lokalen Active Directory verbunden sind, wird schnell eine Option suchen, um elegant Massenänderungen durchzuführen. Einige Änderungen können Sogar gar nicht über die Weboberfläche erfolgen. Der Zugriff per PowerShell ist zum Glück nicht sonderlich schwer.

Warum brauch ich PowerShell?

Aus meiner Sicht gibt es drei Grüne, warum Sie PowerShell mit Office 365 nutzen müssen.

  • Nicht alle Einstellungen der Dienste sind im Portal
    Das gilt nicht nur für Teams sondern auch für Exchange Online, Azure, SharePoint und viele andere Cloud-Dienste., wo sie bestimmte Parameter nur per PowerShell setzen können
  • Automatisches Provisionieren von Benutzern
    Auch wenn ADSync als Office 365 Identity Management für Sie Benutzer und Gruppen im AzureAD verwaltet, so dass ADSync nur die Felder übertragen, die im lokalen Active Directory auch vorhanden sind.
    Bei Exchange im Hybrid Mode ist ADSync ja Pflicht aber dennoch müssen Sie die Einstellungen bezüglich POP3/IMAP, Quotas, ActiveSync Quarantäne in der Cloud vornehmen. Auch bei Skype/Teams ist der Dialplan nicht durch Informationen aus dem lokalen Active Directory einstellbar sondern nur in der Cloud
  • Zeitgewinn für Massenänderungen
    Selbst wenn bestimmte Einstellungen im Portal möglich sind, so kommen Sie bei vielen Änderungen an ihre Grenzen. Per PowerShell geht es dann doch schneller und zuverlässiger als per Browser.

Mittlerweise kann sogar die Office 365 Lizenzverwaltung über Gruppen erfolgen. Aber es gibt immer noch Dinge, die nur per PowerShell direkt gegen die Cloud konfiguriert werden können. Es gibt also durchaus "Arbeit" für ihr Identity Management mit einer Office 365 Einführung, da es nicht für alle Einstellungen ein entsprechendes LDAP-Feld im lokalen Active Directory gibt. Und diese Einstellungen müssen Sie direkt in der Cloud einstellen. Einige Einstellungen sind zwar per Webbrowser möglich aber letztlich werden Sie sich Skripte bauen, die solche Einstellungen in der Cloud vornehmen.

Eine PowerShell - Viele Module

Es gibt zwar nur die eine PowerShell.exe aber diese wird durch Module erweitert. Es gibt auch nicht die eine "Office 365"-PowerShell sondern pro Dienst ein eigenes Modul, welches Sie zum Teil sogar erst lokal installieren müssen, ehe Sie es verwenden können.

Modul Commandlets Einsatzbereich

Office 365

*-MSOL*

Verwalten aller Office 365 Benutzer, Gruppen, Tenant Einstellungen
Es gibt hier eine Überlappung mit AzureAD bei Benutzern, Gruppen Lizenzen etc.

AzureAD

*AzureAD*

Verwaltung von AzureAD Diensten und Einstellungen. Es gibt hier eine Überlappung mit Office 365 bei Benutzern, Gruppen Lizenzen etc.

Exchange Online

Exchange Commandlets. Leider ohne eigenes Präfix

Exchange Commandlets. Leider ohne eigenes Präfix.

Das ändert sich aber mit der

Exo PowerShell V2

Skype for Business

*-csonline*
*-csteams*

Administratoren, die Dialpläne, Policies etc in Skype for Business Online und Teams verwalten.

Teams

 

Verwalten von Teams Einstellungen im Teams, z.B. Kanäle, Channel etc
https://www.powershellgallery.com/packages/MicrosoftTeams/0.9.6

SharePoint

*-SPO*

Verwalten von SharePoint Online
https://www.microsoft.com/de-de/download/details.aspx?id=35588

InTune

Diverse PowerShell-Skripte

Nutzt Graph zur Verwaltung
https://GitHub.com/Microsoft/Intune-PowerShell-SDK

Hinweis
Immer mehr Funktionen sind auch per Graph API erreichbar. Schauen Sie speziell bei Automatisierungsaufgaben auch hier nach, ob dies keine elegantere Alternative zur PowerShell ist.

Sie können alle Module einzeln installieren und sich auch einzeln anmelden. Es gibt aber schon Skripte, die ihnen das ersparen

Azure Cloud Shell

Unter der Url http://shell.azure.com/ können Sie mit jedem Browser eine Shell in Azure öffnen. technisch startet Microsoft dann für ihre Session eine PowerShell Core-Umgebung auf Linux. Meist sind sie dann direkt in der BASH-Shell. Aber durch den Aufruf von "Pwsh" starten Sie die PowerShell Core. Zu Ablage von Skripten etc. benötigen Sie noch eine Azure File Storage.

Interessant ist dabei, dass Sie damit eine Azure CLI haben aber auch die Exchange PowerShell einbinden können.

Office 365 PowerShell installieren

Die PowerShell Erweiterung sind ein kostenfrei von Microsoft Online erhältlicher Download. Damit diese aber funktionieren, muss auch "Microsoft Online Services Sign-In Assistant" installiert sein. Er addiert ein paar Einträge in der Registrierung, dass die PowerShell auch die Online Dienste erreichen kann. (Siehe auch Office 365 Client)

Nach der Installation ist in der Regel kein Neustart erforderlich.

# Anfrage der aktuell installierten Version
(get-item C:\Windows\System32\WindowsPowerShell\v1.0\Modules\MSOnline\Microsoft.Online.Administration.Automation.PSModule.dll).VersionInfo.FileVersion

Powershell und HTTP-Proxy

Wenn die PowerShell mit der Cloud kommunizieren muss, dann ist ggfls. ein Proxy zu nutzen. Die PowerShell nutzt dabei nicht die Einstellungen des IE sondern erfordert Einstellungen in WinHTTP:

netsh winhttp set proxy xxxxx

Allerdings gibt es auch Commandlets die den Proxy nicht nutzen. Viele nutzen aber als Unterbau die HTTP-Requests und daher kann folgender Trick wirken: Sie machen einfach mal einen HTTP-Request zum gewünschten Ziel:

Invoke-WebRequest `
   -Proxy http://proxy.msxfaq,de:8080 `
   -ProxyUseDefaultCredentials `
   -Url https://provisioningapi.microsoftonline.com/provisioningwebservice.svc

Mit etwas Glück können Sie so eine PowerShell-Session über den Proxy aufbauen, die dann von anderen Befehlen mit genutzt wird.

Office 365 PowerShell starten und verbinden

Nach der Installation findet sich auf dem Desktop und im Startmenü der passende Link zum Start der PowerShell.

Wie bei einer PowerShell üblich hat ein Anwender dann erst mal eine schwarze Box vor sieht.

Hinweis:
Wenn Sie in der PowerShell z.B. ADFS einrichten wollen, dann müssen Sie auf dem ADFS-Server sein und die PowerShell "Als Administrator" starten, da die Commandlets auch lokal Änderungen durchführen.

Der erste Schritt ist daher die Herstellung einer Verbindung:

In einigen Anleitungen werden noch alte Commandlets (z.B. Set-MSOLContextCredential) verwendet, die aber nicht mehr gültig sind.

In der Version vom Jan 2012 wird eine Verbindung mit dem "Connect-MsolService"-Commandlet hergestellt, welches interaktiv nach den Anmeldedaten fragt oder per Parameter vorab erfasste Credentials übernimmt.

Connect-MSOLService

Im Netmon kann man gut sehen, dass die komplette Kommunikation per HTTPS abgewickelt wird:

Wer nicht die PowerShell über das Startmenü aufrufen will, sondern in einem bestehenden Skript einfach die Commandlets aktivieren will, der kann das Modul auch manuell nachladen.

PS> Get-Module | fl

Name              : MSOnline
Path              : C:\Windows\system32\WindowsPowerShell\v1.0\Modules\MSOnline
                    \Microsoft.Online.Administration.Automation.PSModule.dll
Description       : Microsoft Online Services Module für Windows PowerShell
ModuleType        : Binary
Version           : 1.0
NestedModules     : {Microsoft.Online.Identity.Federation.PowerShell}
ExportedFunctions : {}
ExportedCmdlets   : {Add-MsolGroupMember, Add-MsolRoleMember, Confirm-MsolDomai
                    n, Connect-MsolService...}
ExportedVariables : {}
ExportedAliases   : {}

Das Microsoft Online Modul laden Sie dann also mit folgendem Befehl nach:

import-module msonline

Commandlets für Office 365

Dank der Funktion "Get-Command" und dem Wissen, dass alle Office 365 Commandlets ein "MSOL" im Namen tragen, können Sie recht einfach eine vollständige Liste erhalten.

PS> get-command *msol*

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-MsolGroupMember             Add-MsolGroupMember -GroupOb...
Cmdlet          Add-MsolRoleMember              Add-MsolRoleMember -RoleObje...
Cmdlet          Confirm-MsolDomain              Confirm-MsolDomain -DomainNa...
Cmdlet          Connect-MsolService             Connect-MsolService [-Verbos...
Cmdlet          Convert-MsolDomainToFederated   Convert-MsolDomainToFederate...
Cmdlet          Convert-MsolDomainToStandard    Convert-MsolDomainToStandard...
Cmdlet          Convert-MsolFederatedUser       Convert-MsolFederatedUser -U...
Cmdlet          Get-MsolAccountSku              Get-MsolAccountSku [-TenantI...
Cmdlet          Get-MsolCompanyInformation      Get-MsolCompanyInformation [...
Cmdlet          Get-MsolContact                 Get-MsolContact [-HasErrorsO...
Cmdlet          Get-MsolDomain                  Get-MsolDomain [-Status <Nul...
Cmdlet          Get-MsolDomainFederationSett... Get-MsolDomainFederationSett...
Cmdlet          Get-MsolDomainVerificationDns   Get-MsolDomainVerificationDn...
Cmdlet          Get-MsolFederationProperty      Get-MsolFederationProperty [...
Cmdlet          Get-MsolGroup                   Get-MsolGroup [-UserObjectId...
Cmdlet          Get-MsolGroupMember             Get-MsolGroupMember [-GroupO...
Cmdlet          Get-MsolPartnerContract         Get-MsolPartnerContract [-Do...
Cmdlet          Get-MsolPartnerInformation      Get-MsolPartnerInformation [...
Cmdlet          Get-MsolRole                    Get-MsolRole [-TenantId <Nul...
Cmdlet          Get-MsolRoleMember              Get-MsolRoleMember [-RoleObj...
Cmdlet          Get-MsolSubscription            Get-MsolSubscription [-Tenan...
Cmdlet          Get-MsolUser                    Get-MsolUser [-ReturnDeleted...
Cmdlet          Get-MsolUserRole                Get-MsolUserRole -ObjectId <...
Cmdlet          New-MsolDomain                  New-MsolDomain [-Name <Strin...
Cmdlet          New-MsolFederatedDomain         New-MsolFederatedDomain [-Su...
Cmdlet          New-MsolGroup                   New-MsolGroup [-DisplayName ...
Cmdlet          New-MsolLicenseOptions          New-MsolLicenseOptions -Acco...
Cmdlet          New-MsolUser                    New-MsolUser [-ImmutableId <...
Cmdlet          Remove-MsolContact              Remove-MsolContact -ObjectId...
Cmdlet          Remove-MsolDomain               Remove-MsolDomain -DomainNam...
Cmdlet          Remove-MsolFederatedDomain      Remove-MsolFederatedDomain [...
Cmdlet          Remove-MsolGroup                Remove-MsolGroup -ObjectId <...
Cmdlet          Remove-MsolGroupMember          Remove-MsolGroupMember -Grou...
Cmdlet          Remove-MsolRoleMember           Remove-MsolRoleMember -RoleO...
Cmdlet          Remove-MsolUser                 Remove-MsolUser -ObjectId <G...
Cmdlet          Restore-MsolUser                Restore-MsolUser -ObjectId <...
Cmdlet          Set-MsolADFSContext             Set-MsolADFSContext [-ADFSUs...
Cmdlet          Set-MsolCompanyContactInform... Set-MsolCompanyContactInform...
Cmdlet          Set-MsolCompanySettings         Set-MsolCompanySettings [-Se...
Cmdlet          Set-MsolDirSyncEnabled          Set-MsolDirSyncEnabled -Enab...
Cmdlet          Set-MsolDomain                  Set-MsolDomain [-Name <Strin...
Cmdlet          Set-MsolDomainAuthentication    Set-MsolDomainAuthentication...
Cmdlet          Set-MsolDomainFederationSett... Set-MsolDomainFederationSett...
Cmdlet          Set-MsolGroup                   Set-MsolGroup [-ObjectId <Nu...
Cmdlet          Set-MsolPartnerInformation      Set-MsolPartnerInformation [...
Cmdlet          Set-MsolUser                    Set-MsolUser [-ImmutableId <...
Cmdlet          Set-MsolUserLicense             Set-MsolUserLicense -ObjectI...
Cmdlet          Set-MsolUserPassword            Set-MsolUserPassword -Object...
Cmdlet          Set-MsolUserPrincipalName       Set-MsolUserPrincipalName -O...
Cmdlet          Update-MsolFederatedDomain      Update-MsolFederatedDomain [...


#Alternativen
PS> (Get-Module msonline).exportedcommands

PS> get-command -Module msonline

Die alternativen Wegen zeigen ihnen auch alle Kommandos an. Mit GET-HELP "Commandlet-Name".

Kommunikation

Wer mit dem Netzwerkmonitor kontrolliert, welche Dienste und Ports genutzt werden, wird sehr schnell HTTPS als einziges Protokoll erkennen. Insofern ist es also ausreichend, wenn Sie von ihrem Client "Surfen" können.

Limits

Analog zu den PowerShell-Befehlen für das Active Directory und Exchange laden auch die MSOL-Commandlets nicht alle Elemente sondern laden nur die ersten 250 Einträge. Kleinere Firmen werden damit in der Regel kein Problem haben, aber wenn Sie ein Skript entwickelt, dann müssen Sie daraus Rücksicht nehmen, indem Sie schon über entsprechende Filter-Parameter die Anzahl der Elemente reduzieren oder eben ausreichend viele (sprich alle) Elemente holen und danach filtern.

get-MSOLGroup / get-MSOLGroupMember

-All [<SwitchParameter>]
    Wenn dieser Parameter vorhanden ist, werden alle Ergebnisse zurückgegeb
    en. Kann nicht zusammen mit dem Parameter "MaxResults" verwendet werden

 -MaxResults <int>
     Die Höchstanzahl der für eine Suche zurückgegebenen Ergebnisse. Wenn ke
     in Wert angegeben ist, werden 250 Ergebnisse zurückgegeben.
get-MSOLUser / get-MSOLContact

-All [<SwitchParameter>]
Wenn dieser Parameter vorhanden ist, werden alle Ergebnisse zurückgegeb
en. Kann nicht zusammen mit dem Parameter "MaxResults" verwendet werden

-MaxResults <int>
    Die Höchstanzahl der für eine Suche zurückgegebenen Ergebnisse. Wenn ke
    in Wert angegeben ist, werden 500 Ergebnisse zurückgegeben.

Throttling

Aber auch die Anzahl der ausgeführten Powershell-Befehle ist nicht endlos. Office 365 misst, wie lange die Ausführung eines Befehls benötigt und wie viele Ressourcen Sie damit benutzen. Parallel gibt es wie auch in Exchange EWS ein "Konto", von dem die verbrauchten Ressourcen abgezogen werden und auf der anderen Seite immer wieder was aufgebraucht wird. Es ist wie beim Girokonto mit regelmäßigem Gehaltseingang und Abbuchungen. Wenn das Konto aufgebraucht wird, geht es nicht mehr. Bei Office 365 geht es dann immer noch aber eben langsamer. Insofern ist es schon wichtig die Befehle so einzusetzen, damit sie nicht nur ein Ergebnis liefern, sondern auch effektiv arbeiten.

Wer z.B. eine Information über eine bestimmten Benutzer erhalten möchte, sollte daher nicht alle User holen und danach filtern, sondern schon die Anfrage zu filtern

Ineffektiv und damit teuer
Get-MSOLUser | where {$_.upn -eq "User1@msxfaq.onmicrosoft.com"}

#Besser
get-msolUser -identity "User1@msxfaq.onmicrosoft.com"

Es gibt noch weitere Tricks, wie z.B. die Verlagerung der Ausführung auf den Server:

# Ineffektiv
get-msolUser

invoke-comand `
   -session (get-pssession) `
   -scriptblock {get-msolUser}

Auch hier kann man in dem Skript Block natürlich auch noch filtern.

Auch die Anzahl der parallelen Sessions kann beschränkt sein:

"To help prevent denial-of-service (DoS) attacks, you're limited to three open remote PowerShell connections to your Exchange Online organization.
Quelle:  https://docs.microsoft.com/en-us/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/connect-to-exchange-online-powershell

Das kann Sie also durchaus treffen, wenn sie mehrere PowerShell-Skripte parallel ausführen

Azure PowerShell

Neben der MSOnline-Powershell gibt es natürlich noch eine Verwaltungskonsole für alle Azure Dienste. Auch hier gibt es Commandlets, mit denen auch AzureAD-Konten, d.h. Office 365 Benutzer und Gruppen verwaltet werden können.

Install-Module -Name AzureAD 
$UserCredential = Get-Credential 
Connect-AzureAD -Credential $UserCredential

Der Scope dieser PowerShell ist aber sicher eher die Azure-Umgebung.

Exchange Online

Bitte beachten Sie, dass diese PowerShell nur zur Verwaltung von Office 365 Konten dient aber nicht für Exchange oder Sharepoint genutzt werden kann. Hierzu gibt es eigene Zugängen, wie z.B. die Exchange Remote PowerShell.

$Session = New-PSSession `
    -ConfigurationName Microsoft.Exchange `
    -ConnectionUri https://outlook.office365.com/powershell-liveid/ `
    -Credential (get-credential) `
    -Authentication Basic `
    -AllowRedirection 
import-PSSession $session

Früher war auch ps.outlook.com eine gültige URL. Sie funktioniert auch noch.

Beachten Sie auch das Throttling, was die Anzahl der parallel ausgeführten Jobs beschränken könnte.

"To help prevent denial-of-service (DoS) attacks, you're limited to three open remote PowerShell connections to your Exchange Online organization.
Quelle:  https://docs.microsoft.com/en-us/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/connect-to-exchange-online-powershell

Beachten Sie, dass sie beim Einsatz von Exchange Hybrid Mode viele Einstellungen weiterhin "On-Premises" durchführen müssen.

SfB/Lync/Teams Online

Für die Verwaltung von Skype/Teams Online benötigen Sie eine Erweiterung für die PowerShell.

Skype for Business Online, Windows PowerShell Module
http://www.microsoft.com/en-us/download/details.aspx?id=39366

Eine einfache "Remote Verbindung" ist nicht möglich zu sein. Der Versuch mit folgendem Code und passenden Anmeldedaten wurde mit einem Fehler quittiert.

# Das geht leider nicht
$session = New-PSSession `
    -ConnectionURI "https://webdir0d.litwareinc.com/OcsPowerShellLiveId" `
    -Credential $cred

Insofern macht der Code im Downloadpaket wohl doch noch das ein oder andere zusätzlich. Daher muss man für die Verwaltung von Lync Online einfach eine "normale" PowerShell starten und dann folgendes ausführen:

# Zuerst gültige Office 365 Anmeldedaten eingeben
$credential = Get-Credential

# Verbindung zu Office 365 herstellen
$session = New-CsOnlineSession -Credential $credential -verbose

# Session in die aktuelle Umgebung importren
Import-PSSession $session -AllowClobber

# Test ob alles erfolgreich war. Die Funktion "get-cstenant" ist 
# erst verfügbar, wenn die Session erfolgreich importiert wurde.
get-cstenant


# Am ende sollten Sie die Session natürlich wieder sauber abbauen
Remove-PSSession $session

SharePoint Online Powershell

Auch für die Verwaltung von SharePoint ist eine eigene Powershell verfügbar. Hierzu ist eine ca. 2,4 MB große lokale Datei zu installieren 

SharePoint Online-Verwaltungsshell
https://www.microsoft.com/de-de/download/details.aspx?id=35588

Beispiele

Demo Scripts für "Using Remote Windows PowerShell to Manage Office 365"
http://www.microsoft.com/en-us/download/details.aspx?id=41953

Weitere Links

Connecting PowerShell to Microsoft Office 365
https://www.youtube.com/watch?v=cy9C6a9yRtQ

Learn PowerShell basics für managing Office 365
Part1: https://channel9.msdn.com/Shows/Mechanics/PowerShell-basics-for-managing-Office-365-and-the-space-race
Part2: https://channel9.msdn.com/Shows/Mechanics/Learn-PowerShell-basics-for-managing-Office-365-Part-2