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

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.

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 for 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 "Commandletname"

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

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.

Beispiele

Leider repliziert der Office 365 Dirsync wirklich auch alle Objekte des lokalen Active Directory in die Cloud. Mir ist kein offizieller Weg bekannt, diese Verhalten zu ändern. Nett wäre es schon, wenn schon ein Filter in der Quelle eine Möglichkeit der Beschränkung bieten würde. So ist es aber, dass alle Benutzer, Kontakte und auch Gruppen übertragen werden. Das kann man sich natürlich zu nutzen machen.

Sie kennen vielleicht schon die Skripte Grp2ExInet und GRP2CAS, welche die Mitgliedschaft von Gruppen nutzt, um bestimmte Funktionen einzuschalten. Genau das gleiche können Sie mit der Powershell und Office 365 machen. Allerdings nutzt das Skript nun die Gruppen in Office 365. Eine einfache Verkettung in der folgenden Form geht aber leider nicht.

get-msolgroup -SearchString "+technik" | Get-MsolGroupMember

Das quittiert das zweite Commandlet mit einem Fehler:

Das Commandlet erwartet idealerweise die ObjectID der Gruppe. Wenn Sie sicher sind, dass die Suche nur genau eine Gruppe liefert, dann kann folgendes funktionieren.

PS C:\> get-msolgroupmember `
    -groupobjectid (get-msolgroup -SearchString "ExchangeUser").objectid.guid

Schöner (und lesbarer) ist vielleicht der Zwischenschritt über eine Variable ,vor allem wenn Sie die Mitglieder dann weiter verarbeiten wollen. Leider gibt es nicht den umgekehrten Weg, beim Benutzer zu prüfen, ob dieser in einer Gruppe enthalten ist. Wer also z.B. über die Mitgliedschaft einer Gruppe eine bestimmte Funktion in Office 365 bearbeiten will, muss sich zuerst die Mitglieder der Gruppen holen aber dann sequentiell alle Benutzer abarbeiten oder man nutzt doch die lokale Information über Gruppenmitgliedschaften und Veränderungen, wie ich das mit GET-ADChanges bei Kunden schon mache.

Hier mal eine einfache Version als "Volldurchlauf".

write-host "get group"
$group = get-msolgroup -SearchString "ExchangeUser")

write-host "Loading member of Group"
$member = get-msolgroupmember -groupobjectid $group.objectid.guid

write-host "copy members into hashtable"
$dictmember = @{}
$member | %{$dictmember.add($_.objectid.guid,$_.emailaddress)}

get-msoluser -all | % {
    write-host "Processing User "$_.emailaddress
    if ($dictmember.containskey($_.ObjectId.guid)) {
        write-host "User found. add license settings"
        Set-MsolUserLicense `
            -objectid $_.ObjectId.guid `
            -AddLicenses "Firmenname:ENTERPRISEPACK
    }
    else {
        write-host "User no found. remove license settings"
        Set-MsolUserLicense `
            -objectid $_.ObjectId.guid `
            -RemoveLicenses "Firmenname:ENTERPRISEPACK
    }
}

Das Skript sollte natürlich ausführlich getestet, um Monitoring und Alerting erweitert und dann regelmäßig gestartet werden. Idealerweise natürlich nach einem erfolgten Office 365 Dirsync.

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 $Cred `
    -Authentication Basic `
    -AllowRedirection 

Weitere Links

Keywords:Office365 Cloud Hosting