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.

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 müssenÄ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.

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 

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 aufgebucht 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-msilouser -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. 

Exchange und andere

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://ps.outlook.com/PowerShell/ `
    -Credential (get-credential) `
    -Authentication Basic `
    -AllowRedirection 
import-PSSession $session

Lync Online

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

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