Office 365 Service Communications API with Powershell

Hallo zusammen,

Ich habe mich in den letzten Tagen mit dem Office 365 Service Communications API auseinandergesetzt. Mein Ziel war es, den Status der Office 365 Services per Powershell auszulesen.

Office 365 Service Communications API reference (preview)
https://msdn.microsoft.com/de-ch/office-365/office-365-service-communications-api-reference

Als erstes habe ich im Azure Portal eine App Registriert

Wie die Anmeldung funktioniert wird nachfolgend beschrieben. Der Tenant Admin muss die Anfrage freigeben und so kommt man an den "AUTH CODE". Mit dem Code kann man sich anschliessend ein "Access Token" holen. Und mit dem Access Token autorisiert man sich bei den Rest API's.

Get started with Office 365 Management APIs
https://msdn.microsoft.com/de-ch/office-365/get-started-with-office-365-management-apis 

Mit dem folgenden Powershell Code holt man sich den AuthCode.

Function Show-OAuthWindow
{
    param(
        [System.Uri]$Url
    )

    Add-Type -AssemblyName System.Windows.Forms
 
    $form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width=440;Height=640}
    $web  = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width=420;Height=600;Url=($url ) }
    $DocComp  = {
        $Global:uri = $web.Url.AbsoluteUri
        if ($Global:Uri -match "error=[^&]*|code=[^&]*") {$form.Close() }
    }
    $web.ScriptErrorsSuppressed = $true
    $web.Add_DocumentCompleted($DocComp)
    $form.Controls.Add($web)
    $form.Add_Shown({$form.Activate()})
    $form.ShowDialog() | Out-Null

    $queryOutput = [System.Web.HttpUtility]::ParseQueryString($web.Url.Query)
    $output = @{}
    foreach($key in $queryOutput.Keys){
        $output["$key"] = $queryOutput[$key]
    }
   
    $output
}

$adTenant = "serveralive.onmicrosoft.com"
$clientId = "659aee23-f0b2-491a-9a86-c9fd6d3b7097"
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$URLEncodedredirectUri = [System.Web.HttpUtility]::UrlEncode($redirectURI)
$resource = "https://manage.office.com"
$URLEncodedResource = [System.Web.HttpUtility]::UrlEncode($resource)
$authority = "https://login.microsoftonline.com/$adTenant/oauth2/authorize?"

$uri = "$Authority" +
"client_id=$clientId" +
"&response_type=code" +
"&redirect_uri=$URLEncodedredirectUri" +
"&response_mode=query" +
"&resource=$URLEncodedResource" +
"&prompt=admin_consent"

$queryOutput = Show-OAuthWindow -Url $uri
$code = $queryOutput.Code

Wenn die Funktion "Show-OAuthWindow" aufgerufen wird, wird folgendes Fenster angezeigt.

 

Als Tenant Admin müssen nun die Berechtigungen erteilt werden.

Mit dem folgenden Powershell Code hole ich mir nun den Access- und RefreshToken

$adTenant = "serveralive.onmicrosoft.com"
$clientId = "659aee23-f0b2-491a-9a86-c9fd6d3b7097"
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$URLEncodedredirectUri = [System.Web.HttpUtility]::UrlEncode($redirectURI)
$resource = "https://manage.office.com"
$URLEncodedResource = [System.Web.HttpUtility]::UrlEncode($resource)
$authority = "https://login.windows.net/$adTenant/oauth2/token"

$body = "resource=$URLEncodedResource" +
"&client_id=$clientId" +
"&redirect_uri=$URLEncodedredirectUri" +
"&grant_type=authorization_code" +
"&code=$code"

$result = Invoke-RestMethod -Method POST -uri $authority -Body $body
$result

Die Werte in den Variablen "expires_on und "not_before" sind in Unixzeit und in UTC gespeichert.

Das kann aber mit Powershell in eine DateTime Objekt umgewandelt werden. Ausserdem muss noch das UTC Offset der lokalen Machine berücksichtigt werden. Dazu muss dann noch die "expires_in" (Sekunden bis der Token ausläuft) hinzugerechnet werden.

[Int]$ctime=1515017952
[datetime]$epoch = '1970-01-01 00:00:00'
[datetime]$expiretime = $epoch.AddSeconds($Ctime)
write-host $expiretime
$expiretime.ToUniversalTime()
$TimeZone = Get-TimeZone
$UTCOffset = $TimeZone.BaseUtcOffset
$expiretime + $utcOffset

Nun können die vier Rest API's abgefragt werden

  • Get Services: Get the list of subscribed services.
  • Get Current Status: Get a real-time view of current and ongoing service incidents and maintenance events
  • Get Historical Status: Get a historical view of service health, including service incidents and maintenance events.
  • Get Messages: Find Incident, Planned Maintenance, and Message Center communications.

Mit dem folgenden Powershell Code können die Services angezeigt werden

#Get Services: Get the list of subscribed services.
$uri = "https://manage.office.com/api/v1.0/$adTenant/ServiceComms/Services"
$headers = @{"Authorization" = "Bearer " + $access_token}
$services = Invoke-RestMethod -Method GET -uri $uri -Headers $headers
$services.value

Mit dem folgenden Powershell Code kann der aktuelle Status der Services angezeigt werden

#Get Current Status: Get a real-time view of current and ongoing service incidents and maintenance events
$uri = "https://manage.office.com/api/v1.0/$adTenant/ServiceComms/CurrentStatus"
$headers = @{"Authorization" = "Bearer " + $access_token}
$status = Invoke-RestMethod -Method GET -uri $uri -Headers $headers
$status.value | ft id,WorkloadDisplayName, status, statusDisplayName,IncidentIds
$status.value | ft WorkloadDisplayName, status, statusDisplayName,IncidentIds
$Servicestatus = $status.value | where {$_.id -eq "Exchange"}
$featureStatus = $status.value | where {$_.id -eq "Exchange"}
$featureStatus.FeatureStatus | ft FeatureDisplayName,FeatureServiceStatus

Mit dem folgenden Powershell Code kann der historische Status der Services angezeigt werden

#Get Historical Status: Get a historical view of service health, including service incidents and maintenance events.
$uri = "https://manage.office.com/api/v1.0/$adTenant/ServiceComms/HistoricalStatus"
$headers = @{"Authorization" = "Bearer " + $access_token}
$HistStatus = Invoke-RestMethod -Method GET -uri $uri -Headers $headers
$HistStatus.value

Mit dem folgenden Powershell Code können die Meldungen aus dem O365 Message Center abgerufen werden

#Get Messages: Find Incident, Planned Maintenance, and Message Center communications.
$uri = "https://manage.office.com/api/v1.0/$adTenant/ServiceComms/Messages"
$headers = @{"Authorization" = "Bearer " + $access_token}
$Messages = Invoke-RestMethod -Method GET -uri $uri -Headers $headers
$Messages.value
$Messages.value | ft ActionType, AffectedWorkloadDisplayNames,Id, ImpactDescription #AffectedTenantCount, AffectedUserCount
$Messages.value | where {$_.id -eq "EX125946"}
$Messages.value | where {$_.id -eq "EX126202"}

Grüsse
Andres Bohren