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)
- Microsoft Online Services
Sign-In Assistant
32-bit http://g.microsoftonline.com/0bd00en-us/568
64-bit http://g.microsoftonline.com/0bd00en-us/569 - Microsoft Online Services
Module for Windows PowerShell
32-bit http://g.microsoftonline.com/0BX10EN/230
64-bit http://g.microsoftonline.com/0BX10EN/423
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
-
PSRemote
Exchange Remote Powershell nutzen -
WinRM
Powershell remote ansprechen - Powershell: How to connect
to Office 365 with Powershell
http://www.thomasmaurer.ch/2011/05/powershell-how-to-connect-to-office-365-with-powershell/
Weitere Links
- PSRemote
- Powershell Beispiele
- PowerShell4Admin
- Office 365 – How to connect
with Powershell
http://www.thomasmaurer.ch/2011/07/office-365-how-to-connect-with-powershell/ - Windows PowerShell cmdlets
for Office 365
http://onlinehelp.microsoft.com/en-us/office365-enterprises/hh125002.aspx - Reference to Available
PowerShell Cmdlets in Exchange
Online
http://help.outlook.com/en-us/140/dd575549.aspx - Administering Microsoft
Office 365 using Windows
PowerShell
http://blog.powershell.no/2011/05/09/administering-microsoft-office-365-using-windows-powershell/ - Getting Started with Office
365
http://tfl09.blogspot.com/2011/04/getting-started-with-office-365.html - Use Windows PowerShell to
manage Office 365
http://onlinehelp.microsoft.com/en-us/office365-enterprises/hh124998.aspx






