Dienstag, 30. Juni 2020

[Office 365] Portal Sprache in einer Hybrid-Umgebung ändern


Die meisten Firmen synchronisieren ihre lokalen Active Directory Benutzerkonten mit Office 365. Sobald die Konten synchronisiert werden, können manche Einstellungen nur noch durch den Office 365 Administrator durchgeführt werden. Man spricht dann von einer hybriden Office 365 Umgebung.



Bei der Anzeigesprache des Portals ist dies ebenso. In folgendem Screenshot kann man gut erkennen, dass manche Einstellungen einfach ausgeblendet werden, sobald man einen Hybrid-Account hat.




Um nun aber die Sprach-Einstellungen für einen hybrid User zu ändern, muss man im lokalen Active Directory die Useraccount Attribute anpassen. Dort gibt es ein Attribut für "preferredLanguage". Hier wird dann der passende Sprach-Code hinterlegt. In diesem Fall sollte das Office 365 Portal in Niederländisch angezeigt werden. Aus diesem Grund muss man "nl" als Wert eintragen. Eine Liste der derzeit verfügbaren Ländercodes, ist am Ende des Beitrags zu finden. Je nachdem welche Sprache man benötigt, wird dann der passende Code eingegeben.

Wichtig: Diese Anpassung findet in der lokalen AD statt und muss erst mit der AzureAD synchronisiert werden. Die meisten Umgebungen haben hier einen festen Intervall und man muss nur die nächste Synchronisation abwarten.



Aktuell unterstütze Sprachen in Office 365

Folgende Tabelle zeigt die aktuellen Sprach-ID-Strings:

Language and regionLanguage in EnglishLanguage ID (string)
Bahasa Melayu (Brunei)Malay (Brunei)ms
Bahasa Melayu (Malaysia)Malay (Malaysia)ms
català (català)Catalanca
čeština (Česká republika)Czechcs
dansk (Danmark)Danishda
Deutsch (Deutschland)German (Germany)de
Deutsch (Liechtenstein)German (Liechtenstein)de-li
Deutsch (Luxemburg)German (Luxembourg)de-lu
Deutsch (Österreich)German (Austria)de-at
Deutsch (Schweiz)German (Switzerland)de-ch
eesti (Eesti)Estonianet
English (Australia)English (Australia)en-au
English (Belize)English (Belize)en-bz
English (Canada)English (Canada)en-ca
English (Hong Kong SAR)English (Hong Kong SAR)en
English (India)English (India)en
English (Indonesia)English (Indonesia)en
English (Ireland)English (Ireland)en-ie
English (Jamaica)English (Jamaica)en-jm
English (Malaysia)English (Malaysia)en
English (New Zealand)English (New Zealand)en-nz
English (Philippines)English (Philippines)en-ph
English (Singapore)English (Singapore)en
English (South Africa)English (South Africa)en-za
English (Trinidad and Tobago)English (Trinidad and Tobago)en-tt
English (United Kingdom)English (United Kingdom)en-gb
English (United States)English (United States)en-us
English (Zimbabwe)English (Zimbabwe)en-zw
español (Argentina)Spanish (Argentina)es-ar
español (Bolivia)Spanish (Bolivia)es-bo
español (Chile)Spanish (Chile)es-cl
español (Colombia)Spanish (Colombia)es-co
español (Costa Rica)Spanish (Costa Rica)es-cr
español (Ecuador)Spanish (Ecuador)es-ec
español (El Salvador)Spanish (El Salvador)es-sv
español (España, alfabetización internacional)Spanish (International Sort)es-es
español (Estados Unidos)Spaniesh (United States)es-us
español (Guatemala)Spanish (Guatemala)es-gt
español (Honduras)Spanish (Honduras)es-hn
español (México)Spanish (Mexico)es-mx
español (Nicaragua)Spanish (Nicaragua)es-ni
español (Panamá)Spanish (Panama)es-pa
español (Paraguay)Spanish (Paraguay)es-py
español (Perú)Spanish (Peru)es-pe
español (Puerto Rico)Spanish (Puerto Rico)es-pr
español (República Dominicana)Spanish (Dominican Republic)es-do
español (Uruguay)Spanish (Uruguay)es-uy
español (Venezuela)Spanish (Venezuela)es-ve
euskara (euskara)Basqueeu
français (Belgique)French (Belgium)fr-be
français (Cameroun)French (Cameroon)fr
français (Canada)French (Canada)fr-ca
français (Congo, République démocratique du)French (Congo)fr
français (Côte d’Ivoire)French (Ivory Coast)fr
français (France)French (France)fr
français (Haïti)French (Haiti)fr
français (La Réunion)French (Reunion Island)fr
français (Luxembourg)French (Luxembourg)fr-lu
français (Mali)French (Mali)fr
français (Maroc)French (Morocco)fr
français (Monaco)French (Monaco)fr-mc
français (Sénégal)French (Senegal)fr
français (Suisse)French (Switzerland)fr-ch
galego (galego)Galiciangl
hrvatski (Bosna i Hercegovina)Croatian (Bosnia and Herzegovina)hr
hrvatski (Hrvatska)Croatian (Croatia)hr
Indonesia (Indonesia)Indonesianid
italiano (Italia)Italian (Italy)it
italiano (Svizzera)Italian (Switzerland)it-ch
latviešu (Latvija)Latvianlv
lietuvių (Lietuva)Lithuanianlt
magyar (Magyarország)Hungarianhu
Nederlands (België)Dutch (Belgium)nl-be
Nederlands (Nederland)Dutch (Netherlands)nl
norsk bokmål (Norge)Norwegianno
polski (Polska)Polishpl
português (Brasil)Portugese (Brasil)pt-br
português (Portugal)Portugese (Portugal)pt
română (Republica Moldova)Romanian (Moldova)ro-md
română (România)Romanianro
slovenčina (Slovensko)Slovaksk
slovenščina (Slovenija)Sloveniansl
srpski (Bosna i Hercegovina)Serbiansr
srpski (Crna Gora)Serbiansr
srpski (Srbija)Serbiansr
suomi (Suomi)Finnishfi
svenska (Finland)Swedish (Finland)sv-fi
svenska (Sverige)Swedishsv
Tiếng Việt (Việt Nam)Vietnamesevi
Türkçe (Türkiye)Turkishtr
Ελληνικά (Ελλάδα)Greekel
български (България)Bulgarianbg
қазақ тілі (Қазақстан)Kazakhkk
русский (Молдова)Russian (Moldova)ru-md
русский (Россия)Russian (Russia)ru
српски (Босна и Херцеговина)Sebian (Bosnia and Herzegovina)sr
српски (Србија)Serbian (Serbian)sr
српски (Црна Гора)Serbian (Montenegro)sr
українська (Україна)Ukrainianuk
(עברית (ישראלHrebrewhe
(العربية (الأردنArabic (Jordan)ar-jo
(العربية (الإمارات العربية المتحدةArabic (United Arab Emirates)ar-ae
(العربية (البحرينArabic (Kingdom of Bahrain)ar-bh
(العربية (العراقArabic (Iraq)ar-iq
(العربية (الكويتArabic (Kuwait)ar-kw
(العربية (المملكة العربية السعوديةArabic (Saudi Arabia)ar-sa
(العربية (المملكة المغربيةArabic (Kingdom of Morocco)ar-ma
(العربية (اليمنArabic (Yemen)ar-ye
(العربية (تونسArabic (Tunisia)ar-tn
(العربية (عمانArabic (Oman)ar-om
(العربية (قطرArabic (Qatar)ar-qa
(العربية (لبنانArabic (Lebanon)ar-lb
(العربية (ليبياArabic (Libya)ar-ly
(العربية (مصرArabic (Egypt)ar-eg
हिंदी ( भारत )Hindihi
ไทย ( ไทย )Thaith
한국어 ( 대한민국 )Koreanko
中文 ( 中国 )Chinese (China)zh-cn
中文 ( 台灣 )Chinese (Taiwan)zh-tw
中文 ( 新加坡 )Chinese (Singapore)zh-sg
中文 ( 澳門特別行政區 )Chinese (Macao SAR)zh-mo
中文 ( 香港特別行政區Chinese (Hong Kong SAR)zh-hk
日本語 ( 日本 )Japaneseja

Donnerstag, 4. Juni 2020

[Windows 10] Upgrade von Windows 10 LTSC 2019 zur halbjährliche Kanalversion (1909, 2004, usw.)




Normalerweise stellt es kein Problem dar ein Windows 10 LTSC zu einer neueren Windows 10 Current Version (halbjährlicher Kanal) zu aktualisieren.

Jedoch scheint das Setup, neuerer Windows 10 Images, dies zu erkennen und ein Upgrade mit allen Programmen und Dateien zu blockieren.



Die bedeutet aber nicht, dass es nicht möglich ist. Das Setup erkennt nur den LTSC KMS Key und blockiert deshalb diese Option. Dies sieht dann wie folgt aus.


Um nun aber alle Optionen angezeigt zu bekommen, muss man die Setup.exe des Images mit einem speziellen Befehl und dem passenden KMS Key des halbjährlichen Kanals starten. Hierzu startet man die CMD und springt zu dem Pfad, in dem sich die Setup.exe befindet. Dies kann eine ISO sein, welche gemounted wurde oder auch ein herkömmliches DVD Laufwerk, in dem die Installations DVD von Windows liegt. Bei mir wurde das Image unter D: gemounted.


Durch das Starten der Setup.exe mit der Erweiterung /pkey und dem passenden Enterprise KMS Key, bietet das Setup nun die Möglichkeit alle Dateien und Programme mitzunehmen.



Freitag, 8. Mai 2020

[Office 365] SharePoint Online Publishing Sites beschleunigen


Wenn man Intranet Seiten über SharePoint Online betreibt, kann es unter Umständen vorkommen, dass die Ladezeiten des Intranets sehr langsam sind. Dies liegt unter Umständen an dem Speicherort der Daten. Jedes kleine / große Bild muss aus dem Rechenzentrum übertragen werden. Je mehr Content auf der Intranet Seite dargestellt wird, wird auch die Ladezeit länger dauern.

Man muss bedenken, dass in Europa meist die Daten in Amsterdam oder Irland liegen, was von Natur aus schon längere Ladezeiten bedeutet, wenn man sich in Deutschland befindet. Aber auch Firmen, welche mehrere Standorte verteilt in Europe oder der Welt haben, werden dasselbe Problem haben.

Aus diesem Grund kann man überlegen, seine Bilder und die statischen Website Daten, über CDNs auszuliefern. Die großen Unternehmen wie Netflix, Youtube, etc. arbeiten bereits mit CDNs (Content Delivery Network), um Ihre Videos ohne große Latenz zum Kunden zu bringen. Auch bei SharePoint ist dies möglich, jedoch hat man keine freie CDN Wahl. Dafür ist dieser Service aber kostenlos und muss nur aktiviert werden. Die Daten werden dann entweder in den eigenen Azure CDNs oder über die Akamai CDNs bereitgestellt.

Mittlerweile gibt es sehr viele CDNs und in der Regel befindet sich in jeder Region einer oder mehrere. Das Beste daran ist, dass sich der Client immer den schnellsten Weg suchen wird.

Nun aber die Übersicht, wie man seine SharePoint Intranet Seite für die CDNs vorbereitet.

Es gibt derzeit nur den Weg über die PowerShell. Damit man aber eine Verbindung zu SharePoint Online herstellen kann, benötigt man die passende SharePoint Online PowerShell Erweiterung. Diese kann man aber schnell über eine Google Suche finden.

Herstellen einer Verbindung zu SharePoint Online (bitte [your company name] durch den eigenen ersetzen):

Anzeigen, ob der CDN aktiv ist oder nicht:
Get-SPOTenantCdnEnabled -CdnType Private
Get-SPOTenantCdnEnabled -CdnType Public



Microsoft unterscheidet zwischen Public und Private. In den Public CDNs werden alle öffentlichen Daten gespeichert. Die Private CDNs sind hingegen verschlüsselt und die Daten können nur von Usern abgerufen werden, welche auch Zugriff auf das Intranet / den Tenant haben. In diesen werden dann die dynamischen Inhalte wie z.Bsp. Bilder gespeichert.
Falls die Abfrage ergab, dass der CDN nicht aktiviert war, muss dieser nun mit folgenden Befehlen aktiviert werden:
Set-SPOTenantCdnEnabled -CdnType Public
Set-SPOTenantCdnEnabled -CdnType Private


Sollte man die CDN Option deaktivieren wollen, muss man folgende Befehle ausführen:
Set-SPOTenantCdnEnabled -CdnType Public -Enable $false
Set-SPOTenantCdnEnabled -CdnType Private -Enable $false

Welche Dateitypen über den CDN bereitgestellt werden, kann man mit folgenden Befehlen abfragen. Anzeigen der CDN Policy:
Get-SPOTenantCdnPolicies -CdnType Private

Get-SPOTenantCdnPolicies -CdnType Public




Sollte man die Liste der inkludierten Dateitypen erweitern wollen, kann man dies über folgenden Befehl:
Set-SPOTenantCdnPolicy -CdnType Public -PolicyType IncludeFileExtensions -PolicyValue „Bitte alle Dateitypen mit Komma separiert eingeben.“

oder

Set-SPOTenantCdnPolicy -CdnType Private -PolicyType IncludeFileExtensions - PolicyValue „Bitte alle Dateitypen mit Komma separiert eingeben.“

Anzeige welche Datei-Orte / SharePoint Bibliotheken über CDN bereitgestellt werden:
Get-SPOTenantCdnOrigins -CdnType Public
Get-SPOTenantCdnOrigins -CdnType Private

Um eine neue Source (ggf. SharePoint Bibliothek) zu definieren, muss man folgende Befehle ausführen. Die roten Stellen bitte durch die gewünschte Bibliothek ersetzen:
Add-SPOTenantCdnOrigin -CdnType Public -OriginUrl sites/cdn/cndlibrary
Add-SPOTenantCdnOrigin -CdnType Private -OriginUrl sites/cdn/cndlibrary

Achtung: Bitte beim Hinzufügen neuer Sourcen beachten, dass wenn man Bibliotheken unter Public hinzufügt diese auch dann wirklich von jedem gelesen werden können. Sollte man also im Intranet eine SharePoint Bilder Datenbank haben, in der z.Bsp. die Bilder der letzten Firmenfeier sind, sollte man diese mit Private bereitstellen, da man sonst ein Datenschutzproblem hat.

Sollte man wieder eine Source (ggf. SharePoint Bibliothek) aus dem CDN entfernen wollen, kann man folgende Befehle verwenden. Die roten Stellen bitte durch die gewünschte Bibliothek ersetzen:
Remove-SPOTenantCdnOrigin -CdnType Public -OriginUrl sites/cdn/cndlibrary
Remove-SPOTenantCdnOrigin -CdnType Private -OriginUrl sites/cdn/cndlibrary

Zum Schluss sollte man noch beachten, dass jede Anpassung mehrere Stunden dauern kann, bis diese komplett von den CDNs verarbeitet werden.

Somit sind die wichtigsten Befehle erklärt. Leider kennen viele diese Möglichkeiten nicht und haben hierdurch eine langsame Intranet Seite. Vielleicht wird sich das in Zukunft ändern.

Dienstag, 21. April 2020

[Office 365 Groups] Erstellen von Office 365 Groups mit Powershell

Mit folgendem Script kann man Microsoft Office 365 Groups per PowerShell erstellen.
Bitte die rot markierten Texte an die eigene Umgebung anpassen.
Damit das Script funktioniert, muss die erforderliche Powershell Erweiterung (Exchange) installiert sein.




##########################################################################
#Connect Exchange-Online
Import-Module $((Get-ChildItem -Path $($env:LOCALAPPDATA+"\Apps\2.0") `
-Filter Microsoft.Exchange.Management.ExoPowershellModule.dll -Recurse ).FullName`
|?{$_ -notmatch "_none_"} | select -First 1)

$EXOSession = New-ExoPSSession

Import-PSSession $EXOSession -AllowClobber

#Defninieren der Groups Daten
$GroupName = "Der_Name_wie_die_Office365Groups_heißen_soll"
$GroupVisability = "Private"
$GroupMail = "MeineGroups365SMTPAdresse@yourcompany.com"
$GroupOwner = "BesitzerSMTPAdresse@yourcompany.com"

#Create Office 365 Group

New-UnifiedGroup -DisplayName "$GroupName" -Alias "$GroupName"

Start-Sleep -s 20

#Modify Office 365 Groups

Set-UnifiedGroup -Identity "$GroupName" -PrimarySmtpAddress "$GroupMail"
Set-UnifiedGroup -Identity "$GroupName" -HiddenFromAddressListsEnabled $false
Set-UnifiedGroup -Identity "$GroupName" -HiddenFromExchangeClientsEnabled:$false
Set-UnifiedGroup -Identity "$GroupName" -Language de-de
Set-UnifiedGroup -Identity "$GroupName" -AutoSubscribeNewMembers:$true
Set-UnifiedGroup -Identity "$GroupName" -RequireSenderAuthenticationEnabled $false
Set-UnifiedGroup -Identity "$GroupName" -AccessType "$GroupVisability"
Add-UnifiedGroupLinks -Identity "$GroupName" -LinkType Member -Links "$GroupOwner"
Add-UnifiedGroupLinks -Identity "$GroupName" -LinkType Owner -Links "$GroupOwner"

[Microsoft Teams] Erstellen von Teams mit Powershell

Mit folgendem Script kann man Microsoft Teams per PowerShell erstellen.
Bitte die rot markierten Texte an die eigene Umgebung anpassen.
Damit das Script funktioniert, müssen die erforderlichen Powershell Erweiterungen (für Teams / Exchange) installiert sein.






############################################################################
#Connect Teams
Connect-MicrosoftTeams -Credential $cred
#Connect Exchange-Online
Import-Module $((Get-ChildItem -Path $($env:LOCALAPPDATA+"\Apps\2.0") `
-Filter Microsoft.Exchange.Management.ExoPowershellModule.dll -Recurse ).FullName`
|?{$_ -notmatch "_none_"} | select -First 1)

$EXOSession = New-ExoPSSession

Import-PSSession $EXOSession -AllowClobber

#Defninieren der Teams Daten
$TeamName = "Der_Name_wie_das_Teams_heißen_soll"
$TeamDescription = "Der_Name_wie_das_Teams_heißen_soll"
$TeamVisability = "Private"
$TeamMail = "MeineTeamsSMTPAdresse@yourcompany.com"
$TeamOwner = "BesitzerSMTPAdresse@yourcompany.com"

#Create Teams

$group = New-Team -DisplayName "$TeamName" -Description "$TeamDescription" -Visibility "$TeamVisability" -MailNickName "$TeamName"
Add-TeamUser -GroupId $group.GroupId -User "$TeamOwner" -Role "owner"

Start-Sleep -s 20

#Modify Teams

Set-UnifiedGroup -Identity "$TeamName" -PrimarySmtpAddress "$TeamMail"
Set-UnifiedGroup -Identity "$TeamName" -HiddenFromAddressListsEnabled $false
Set-UnifiedGroup -Identity "$TeamName" -HiddenFromExchangeClientsEnabled:$false
Set-UnifiedGroup -Identity "$TeamName" -Language de-de
Set-UnifiedGroup -Identity "$TeamName" -AutoSubscribeNewMembers:$true
Set-UnifiedGroup -Identity "$TeamName" -RequireSenderAuthenticationEnabled $false
Add-UnifiedGroupLinks -Identity "$TeamName" -LinkType Member -Links "$TeamOwner"
Add-UnifiedGroupLinks -Identity "$TeamName" -LinkType Owner -Links "$TeamOwner"

[Microsoft Teams] Eine SharePoint Classic Seite (ohne eine Office 365 Group) zu einem Teams konvertieren



Wenn man im Unternehmen mehrere Classic SharePoint Seiten hat, welche noch nicht an eine Office 365 Group gebunden sind und diese zu einem Microsoft Teams konvertiert werden sollen, kann man dies komplett manuell erledigen oder mein folgendes Script verwenden. Dieses Script erstellt für die SharePoint Seite eine Office 365 Group, welche dann für die Microsoft Teams Erstellung verwendet wird. Bitte die rot markierten Texte an die eigene Umgebung anpassen. Den Rest sollte man so lassen.


Damit das Script funktioniert, müssen die erforderlichen Powershell Erweiterungen (für Teams / Exchange / Azure / SharePoint) installiert sein.


###############################################################################
# Script zum Verbinden einer Office365 Group an eine SharePoint Classic Site:
# Bitte folgende Variablen definieren
###############################################################################
$ClassicSPOSite = "URL_der_SharePoint_Seite" 
$GroupDisplayName="Der_Name_wie_das_Teams_heißen_soll" 
$GroupAlias="Der_Name_wie_das_Teams_heißen_soll"
$TeamOwner="BesitzerSMTPAdresse@yourcompany.com"
$TeamMail="MeineTeamsSMTPAdresse@yourcompany.com"
$TeamVisability="Private"

###############################################################################
###############################################################################
#
# Bitte das nachfolgende Script NICHT anpassen!!!!
# Nur sicherstellen, dass der richtige Tenant angegeben ist!!!
#
###############################################################################
###############################################################################

# Connect to SharePoint Online
Connect-SPOService -Url https://[your_tenant_name]-admin.sharepoint.com

#Connect Exchange-Online
Import-Module $((Get-ChildItem -Path $($env:LOCALAPPDATA+"\Apps\2.0") `
-Filter Microsoft.Exchange.Management.ExoPowershellModule.dll -Recurse ).FullName`
|?{$_ -notmatch "_none_"} | select -First 1)
$EXOSession = New-ExoPSSession
Import-PSSession $EXOSession -AllowClobber

#Connect AzureAD
Connect-AzureAD

#Connect Teams
Connect-MicrosoftTeams -Credential $cred

# Create Offic 365 Group for Classic Site
Set-SPOSiteOffice365Group -Site $ClassicSPOSite -DisplayName $GroupDisplayName -Alias $GroupAlias -IsPublic $false

# Kurze Pause / Cloud Zeit geben
Start-Sleep -s 90

# Ermitteln der Office 365 GroupID
$GroupID = Get-AzureADGroup -SearchString $GroupDisplayName |select ObjectId |ft -hide |Out-String | ForEach-Object { $_.Trim() }

# Erstellen des Microsoft Teams mithilfe der Office 365 GroupID
New-Team -Group $GroupID

# Kurze Pause / Cloud Zeit geben
Start-Sleep -s 30

# Besitzer zum Teams hinzufügen
Add-TeamUser -GroupId $GroupID -User "$TeamOwner" -Role "owner"

# Kurze Pause / Cloud Zeit geben
Start-Sleep -s 15

# Anpassung der Teams Einstellungen
$TeamName=$GroupDisplayName
Set-Team -GroupId $GroupID -Visibility $TeamVisability
Set-UnifiedGroup -Identity "$TeamName" -PrimarySmtpAddress "$TeamMail"
Set-UnifiedGroup -Identity "$TeamName" -HiddenFromAddressListsEnabled $false
Set-UnifiedGroup -Identity "$TeamName" -HiddenFromExchangeClientsEnabled:$false
Set-UnifiedGroup -Identity "$TeamName" -Language de-de
Set-UnifiedGroup -Identity "$TeamName" -AutoSubscribeNewMembers:$true
Set-UnifiedGroup -Identity "$TeamName" -RequireSenderAuthenticationEnabled $false
Add-UnifiedGroupLinks -Identity "$TeamName" -LinkType Member -Links "$TeamOwner"
Add-UnifiedGroupLinks -Identity "$TeamName" -LinkType Owner -Links "$TeamOwner"
Set-UnifiedGroup -Identity "$TeamName" -AutoSubscribeNewMembers:$true

Montag, 20. April 2020

[Microsoft Teams] Eigene Hintergrundbilder im Microsoft Teams Meeting verwenden

Seit kurzer Zeit, bietet Microsoft Teams die Möglichkeit innerhalb eines Video Meetings, Hintergrundbilder zu verwenden. Derzeit ist gibt es aktuell nur die Möglichkeit den Hintergrund weich zu zeichnen oder die Microsoft Standard Hintergrundbilder zu verwenden. Mit einem kleinen Trick, kann man aber auch seine eigenen Bilder (jpg, etc.) einbinden.

 Teams background images

Um nun eigene Bilder zu hinterlegen, muss man im Windows Explorer folgenden Pfad öffnen:
%AppData%\Microsoft\Teams\Backgrounds\Uploads



Unter diesem Pfad können dann die eigenen Bilder abgelegt werden.



Teams sollte nun beim nächsten Video Anruf diese Bilder verwenden können. In der Regel muss man noch nicht mal Teams neu starten.