blog.icewolf.ch

Let's talk about IT!
posts - 1301, comments - 295, trackbacks - 0

My Links

Archives

Post Categories

icewolf

Thursday, January 11, 2018

Outlook for Android private Appointments are finally available

Hallo zusammen,

Bei der Android Outlook App gab es ein Update 2.2.74 (239). Damit ist es nun endlich möglich Termine auch als "Privat" zu markieren. Ebenfalls kann man nun den Status festlegen (Beschäftigt / Frei / Mit Vorbehalt / Ausser Haus)

 

Grüsse
Andres Bohren

posted @ Thursday, January 11, 2018 10:32 PM | Feedback (0) | Filed Under [ UM/Mobile O365 ]

Exchange 2016 RecoverServer

Hallo zusammen

Wo ich schon dabei bin, habe ich auch gleich mal ein Exchange 2016 Recovery durchgeführt. Nach einer erfolgreichen Installation von Exchange 2016 habe ich den Windows 2016 Server "platt gemacht". Rhoderick Milne hat eine gute Zusammenfassung dazu geschrieben.

Exchange 2016 RecoverServer
https://blogs.technet.microsoft.com/rmilne/2017/04/26/exchange-2016-recoverserver/

Exchange Server Prerequisits

Zuerst müssen die benötigen Windows Rollen und Features installiert werden.

Nun kann Exchange mittels dem Parameter RecoverServer wiederhergestellt werden.

setup.exe /IAcceptExchangeServerlicenseTerms /Mode:RecoverServer

Nach einem Neustart war Exchange wieder vollständig installiert.

Ob alles in Ordnung ist prüft man mit am besten folgendermassen

Get-HealthReport -Identity ICESRV06 | where {$_.state -ne "NotApplicable"}

Danach muss man nur noch folgende Arbeiten machen:

  • Zertifikate installieren
  • Zertifikate den Services zuweisen (Enable-ExchangeCertificates)
  • Server zum DAG hinzufügen (falls notwendig)
  • Datenbanken wiederherstellen / mounten
Liebe Grüsse
Andres Bohren

posted @ Thursday, January 11, 2018 8:29 PM | Feedback (0) | Filed Under [ Exchange ]

Exchange 2016 Installation Screenshots

Hallo zusammen,

In meinem Labor habe ich nun Exchange 2016 installiert. Ich habe mir das Cumulative Update 18 heruntergeladen. Das CU ist eine vollständige Installation und etwa 5.6 GB gross.

Exchange 2016 system requirements
https://technet.microsoft.com/en-us/library/aa996719(v=exchg.160).aspx

Exchange 2016 prerequisites (Ab CU 18 kann direkt .Net 4.7.1 installiert werden)
https://technet.microsoft.com/en-us/library/bb691354(v=exchg.160).aspx

Vor der Installation sollten diese zwei Packete installiert werden.

Kumulative Update 8 für Exchange Server 2016
https://support.microsoft.com/de-ch/help/4035145/cumulative-update-8-for-exchange-server-2016

Der Readyness Check hat erkannt, dass ich das UCMA noch nicht installiert habe. Ausserdem ist MAPI over HTTP noch nicht aktiviert.

Bevor ich das Mapi over HTTP aktiviere, setze ich noch die externe URL

Get-MapiVirtualDirectoty -Server ICESRV09

Get-MapiVirtualDirectoty -Server ICESRV09 | Set-MapiVirtualDirectory -ExternalURL https://mail.icewolf.ch/mapi -IISAuthenticationMethods NTLM,Negotiate,OAuth

Nun kann MAPI over HTTP aktiviert werden

Set-OrganizationConfig -MapiHttpEnabled $true
Set-OrganizationConfig | fl MapiHttpEnabled

Da dies der erste Exchange 2016 in meinem Active Directory ist, wird "PrepareSchema", "PrepareAD" und "PrepareDomain" ausgeführt.

Grüsse
Andres Bohren

posted @ Thursday, January 11, 2018 7:46 PM | Feedback (0) | Filed Under [ Exchange ]

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

posted @ Thursday, January 11, 2018 7:07 PM | Feedback (0) | Filed Under [ O365 ]

Powered by:
Powered By Subtext Powered By ASP.NET