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"}