Pozn.: Nejsem odborník na tuto oblast a další postupy nemusí být optimální, ale jsou funkční. Nestudoval jsem, zda je vhodnější využití Azure Active Directory PowerShell for Graph (AzureAD) nebo Microsoft Azure Active Directory Module for Windows PowerShell (MSOnline). Nebo něco jiného a používám oboje. Podobně pro Exchange Online doporučené využití EXO V2 module cmdletů.
PowerShell informace o účtech
Určité informace nám poskytnou PowerSehll dotazy do Active Directory. Více užitečné jsou rozšíření pro Exchange. Příkazy jsou stejné pro on-premises Exchange i Exchange Online (EXO), ale některé parametry a nastavení jsou pouze pro jedno prostředí. Pro Exchange Online (EXO) Microsoft doporučuje používat pro většinou příkazů novou variantu s předponou EXO, například Get-EXOMailbox
.
on-premises PowerShell ActiveDirectory
Active Directory module for Windows PowerShell
U uživatele v Active Directory si můžeme zobrazit Exchange atributy.
Get-ADUser novy -Properties * | FL UserPrincipalName, msExch*, proxyAddresses
Online PowerShell AzureAD
Azure Active Directory PowerShell
Pomocí AzureAD příkazů moc atributů ohledně pošty neuvidíme.
Install-Module -Name AzureAD Connect-AzureAD Get-AzureADUser -ObjectId bouska@firma.cz | FL UserPrincipalName, Mail, ProxyAddresses Get-AzureADUserExtension -ObjectId bouska@firma.cz
Azure Active Directory (MSOnline)
Install-Module -Name MSOnline Connect-MsolService Get-MsolUser -UserPrincipalName bouska@firma.cz
on-premises Exchange Management Shell
Exchange Server PowerShell (Exchange Management Shell)
Get-Mailbox -Identity novy@firma.cz | FL PrimarySmtpAddress, ExchangeGuid, Database, RecipientType Get-Recipient -Identity novy@firma.cz | FL PrimarySmtpAddress, ExchangeGuid, Database, RecipientType Get-MailboxLocation -Identity novy@firma.cz | FL MailboxGuid, MailboxLocationType, DatabaseLocation Get-RemoteMailbox Get-MailUser Get-User pokus@firma.cz | Select Name, *Recipient*
Exchange Online Management
Connect to Exchange Online PowerShell
Install-Module -Name ExchangeOnlineManagement -RequiredVersion 1.0.1 Import-Module ExchangeOnlineManagement Connect-ExchangeOnline -UserPrincipalName admin@firma.cz -ShowProgress $true Get-User pokus@firma.cz | Select Name, *Recipient* Get-Mailbox -Identity pokus@firma.cz | FL PrimarySmtpAddress, ExchangeGuid, Database, RecipientType Get-EXOMailbox -Identity pokus@firma.cz Get-EXORecipient | FT Name, Reci*
Microsoft 365 a práce s licencemi
Jak pracovat s přiřazováním a odebíráním licencí, nebo jen služeb/aplikací, se můžeme inspirovat v různých článcích.
- View Microsoft 365 account license and service details with PowerShell
- Assign Microsoft 365 licenses to user accounts with PowerShell
- Disable access to Microsoft 365 services with PowerShell
- Manage user access to Teams
- Assign Teams add-on licenses to users
- Removing the License for an Office 365 Feature with PowerShell
Častěji se v příkladech využívá Microsoft Azure Active Directory Module for Windows PowerShell (MSOnline), i když je možné využít oboje.
Install-Module -Name MSOnline Connect-MsolService
Předplatné, licenční plány a služby
Microsoft 365 Subscription (předplatné) obsahuje licenční plány (Licensing plans), které definují služby dostupné pro uživatele. Služby (Services), nebo také plány služeb (Service Plans), jsou produkty (aplikace), funkce a schopnosti dostupné v licenčním plánu. Každý licenční plán obsahuje určitý počet koupených licencí (Licenses). Ty přiřazujeme jednotlivým uživatelům.
V příkazech využíváme SkuPartNumber (LicensingPlan). Kompletní seznam, spolu se jmény licenčních plánů, se nachází v tabulce Product names and service plan identifiers for licensing (se kterou se dost těžko pracuje). Některé rozšířené příklady jsou
ENTERPRISEPACK
- Office 365 E3ENTERPRISEPREMIUM_NOPSTNCONF
- Office 365 E5 without Audio ConferencingO365_BUSINESS_PREMIUM
- Microsoft 365 Business StandardO365_BUSINESS_ESSENTIALS
- Microsoft 365 Business BasicSPE_E3
- Microsoft 365 E3SPE_E5
- Microsoft 365 E5
Někde se pracuje s AccountSkuId, což je jméno tenantu (organizace) spolu s licenčním plánem, např. firma:ENTERPRISEPACK
.
V licenčním plánu se nachází služby, nebo plány služeb, jako je
TEAMS1
- Microsoft TeamsEXCHANGE_S_STANDARD
- Exchange Online Plan 1EXCHANGE_S_ENTERPRISE
- Exchange Online Plan 2MCOSTANDARD
- Skype for Business OnlineOFFICESUBSCRIPTION
- Microsoft 365 Apps for enterpriseINTUNE_A
- Microsoft IntuneINTUNE_O365
- Mobile Device Management for Office 365
Informace o licencích, službách a uživatelích
Seznam dostupných licenčních plánů (Licensing plans) a počty licencí (Licenses)
PS C:\> Get-MsolAccountSku AccountSkuId ActiveUnits WarningUnits ConsumedUnits ------------ ----------- ------------ ------------- firmatest:ENTERPRISEPACK 0 25 0 firmatest:O365_BUSINESS_PREMIUM 25 0 6 firmatest:TEAMS_EXPLORATORY 100 0 1
Seznam přiřazených licencí uživateli
PS C:\> (Get-MsolUser -UserPrincipalName bouska@firma.cz).Licenses ExtensionData : System.Runtime.Serialization.ExtensionDataObject AccountSku : Microsoft.Online.Administration.AccountSkuIdentifier AccountSkuId : firmatest:O365_BUSINESS_PREMIUM GroupsAssigningLicense : {} ServiceStatus : {Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus, Microsoft.Online.Administration.ServiceStatus...} PS C:\> (Get-MsolUser -UserPrincipalName bouska@firma.cz).Licenses.Accountsku.Skupartnumber O365_BUSINESS_PREMIUM
Seznam služeb v daném licenčním plánu firmy
PS C:\> (Get-MsolAccountSku | where {$_.AccountSkuId -eq "firma:ENTERPRISEPACK"}).ServiceStatus ServicePlan ProvisioningStatus ----------- ------------------ POWER_VIRTUAL_AGENTS_O365_P2 Success CDS_O365_P2 Success PROJECT_O365_P2 Success DYN365_CDS_O365_P2 Success MICROSOFTBOOKINGS Success KAIZALA_O365_P3 Success MICROSOFT_SEARCH Success WHITEBOARD_PLAN2 Success MIP_S_CLP1 Success MYANALYTICS_P2 Success BPOS_S_TODO_2 Success FORMS_PLAN_E3 Success STREAM_O365_E3 Success Deskless Success FLOW_O365_P2 Success POWERAPPS_O365_P2 Success TEAMS1 Success PROJECTWORKMANAGEMENT Success SWAY Success INTUNE_O365 Success YAMMER_ENTERPRISE Success RMS_S_ENTERPRISE Success OFFICESUBSCRIPTION Success MCOSTANDARD Success SHAREPOINTWAC Success SHAREPOINTENTERPRISE Success EXCHANGE_S_ENTERPRISE Success
Seznam služeb, ke kterým má daný uživatel přístup
PS C:\> (Get-MsolUser -UserPrincipalName bouska@firma.cz).Licenses.ServiceStatus ServicePlan ProvisioningStatus ----------- ------------------ POWER_VIRTUAL_AGENTS_O365_P2 Success CDS_O365_P2 Success PROJECT_O365_P2 Success DYN365_CDS_O365_P2 Success MICROSOFT_SEARCH PendingProvisioning WHITEBOARD_PLAN1 Success MYANALYTICS_P2 Success DYN365BC_MS_INVOICING Success KAIZALA_O365_P2 Success STREAM_O365_SMB Success Deskless Success BPOS_S_TODO_1 Success MICROSOFTBOOKINGS Success FORMS_PLAN_E1 Success FLOW_O365_P1 Success POWERAPPS_O365_P1 Success O365_SB_Relationship_Management Success TEAMS1 Success PROJECTWORKMANAGEMENT Success SWAY Success INTUNE_O365 PendingActivation SHAREPOINTWAC Success OFFICE_BUSINESS Success YAMMER_ENTERPRISE Success EXCHANGE_S_STANDARD Success MCOSTANDARD Success SHAREPOINTSTANDARD Success
Seznam uživatelů, kteří mají přiřazenu licenci Office 365 E3 (ENTERPRISEPACK)
Get-MsolUser | Where-Object {$_.Licenses.AccountSku.SkuPartNumber -eq "ENTERPRISEPACK" -and $_.IsLicensed -eq $True}
Seznam dostupných licenčních plánů a jejich služeb
foreach($sku in (Get-MsolAccountSku)) { foreach($sp in $sku.ServiceStatus) { New-Object -TypeName PSObject -Property @{"AccountSkuId"=$sku.AccountSkuId;"ServicePlan"=$sp.ServicePlan.ServiceName} } }
Seznam dostupných licenčních plánů, kde se nachází určitá služba
PS C:\> foreach($sku in (Get-MsolAccountSku)) { foreach($sp in $sku.ServiceStatus | where {$_.ServicePlan.ServiceName -like "INTUNE*"}) { New-Object -TypeName PSObject -Property @{"AccountSkuId"=$sku.AccountSkuId;"ServicePlan"=$sp.ServicePlan.ServiceName} } } ServicePlan AccountSkuId ----------- ------------ INTUNE_O365 firma:ENTERPRISEPREMIUM_NOPSTNCONF INTUNE_A firma:SPE_E5 INTUNE_O365 firma:SPE_E5 INTUNE_A firma:SPE_E3 INTUNE_O365 firma:SPE_E3 INTUNE_O365 ccfirma:O365_BUSINESS_ESSENTIALS
Přiřazování a odebírání licencí
Přiřazení licence uživateli
Set-MsolUserLicense -UserPrincipalName bouska@firma.cz -AddLicenses "firma:ENTERPRISEPREMIUM_NOPSTNCONF"
Aby bylo možno přiřadit uživateli licenci, tak musí mít účet nastavenu UsageLocation na validní kód země
Set-MsolUser -UserPrincipalName bouska@firma.cz -UsageLocation CZ
Odebrání licence uživateli
Set-MsolUserLicense -UserPrincipalName bouska@firma.cz -RemoveLicenses "firma:ENTERPRISEPREMIUM_NOPSTNCONF"
Nahrazení jedné licence jinou (proběhne jako jedna operace)
Set-MsolUserLicense -UserPrincipalName bouska@firma.cz -AddLicenses "firma:ENTERPRISEPREMIUM_NOPSTNCONF" ` -RemoveLicenses "firma:ENTERPRISEPACK"
Odstranění služby z licence
Můžeme vytvořit speciální licenční objekt, kde vypneme určitou službu
$lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPACK" -DisabledPlans "EXCHANGE_S_ENTERPRISE"
Vypnout můžeme i více služeb (někdy je to podmínka, protože mají služby vzájemnou vazbu)
$lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPREMIUM_NOPSTNCONF" ` -DisabledPlans "EXCHANGE_S_ENTERPRISE", "THREAT_INTELLIGENCE", "EXCHANGE_ANALYTICS"
Ten pak můžeme nastavit na uživatele
Set-MsolUserLicense -UserPrincipalName bouska@firma.cz -LicenseOptions $lic
Pokud chceme opět všechny služby povolit
$lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPACK" Set-MsolUserLicense -UserPrincipalName bouska@firma.cz -LicenseOptions $lic
Hromadné operace - seznam uživatelů
Abychom provedli stejné nastavení pro více uživatelů, tak potřebujeme získat jejich seznam. Můžeme si uživatele vypsat dle určitých společných parametrů a aplikovat nějaký příkaz. Nebo můžeme vytvořit textový soubor, ať nějakým výstupem nebo ručně, kde můžeme kontrolovat jeho obsah.
Seznam uživatelů podle oddělení
Get-MsolUser -All -Department "správa IS" | Select UserPrincipalName
Seznam uživatelů s přiřazenou licencí (Office 365 E3) synchronizovaných z on-premises do cloudu
Get-MsolUser -Synchronized | Where-Object {$_.Licenses.AccountSku.SkuPartNumber -eq "ENTERPRISEPACK" -and $_.IsLicensed -eq $True} | Sort-Object UserPrincipalName | Select-Object UserPrincipalName
Seznam uživatelů se schránkou v cloudu synchronizovaných z on-premises
Get-User | Where-Object {$_.RecipientTypeDetails -eq "UserMailbox" -and $_.IsDirSynced } | Sort-Object UserPrincipalName | Select-Object UserPrincipalName
Seznam uživatelů se schránkou v cloudu, přiřazenou licencí (Office 365 E5 without Audio Conferencing), synchronizovaných z on-premises
Get-MsolUser -Synchronized | Where-Object {$_.Licenses.AccountSku.SkuPartNumber -eq "ENTERPRISEPREMIUM_NOPSTNCONF" ` -and $_.IsLicensed -eq $True -and (Get-User $_.UserPrincipalName).RecipientTypeDetails -eq "UserMailbox" } | Sort-Object UserPrincipalName | Select-Object UserPrincipalName
Hromadné operace s licencemi nad uživateli
Pokud si seznam uživatelů (jejich UserPrincipalName) uložíme do textového souboru accounts.txt, tak jej můžeme využít v různých příkazech a nastavení aplikovat na všechny uživatele v seznamu.
Pouze výpis obsahu souboru (po řádcích)
Get-Content "d:\accounts.txt" | foreach {$_}
Informace o typu příjemce (zda má schránku)
Get-Content "d:\accounts.txt" | foreach {Get-User $_ | Select Name,*Recipient*}
Nastavení licenčního objektu (odebrání služby) na uživatele ze souboru
Get-Content "d:\accounts.txt" | foreach {Set-MsolUserLicense -UserPrincipalName $_ -LicenseOptions $lic}
Seznam uživatelů a jejich přiřazených licencí
Get-Content "d:\accounts.txt" | foreach {$_; (Get-MsolUser -UserPrincipalName $_).Licenses.Accountsku.Skupartnumber}
Nastavení UsageLocation a přiřazení licence (mohli bychom zadat v jednom příkazu)
Get-Content "d:\accounts.txt" | foreach {Set-MsolUser -UserPrincipalName $_ -UsageLocation CZ} Get-Content "d:\accounts.txt" | foreach {Set-MsolUserLicense -UserPrincipalName $_ -AddLicenses "firma:ENTERPRISEPACK"}
Odebrání licence
Get-Content "d:\accounts.txt" | foreach {Set-MsolUserLicense -UserPrincipalName $_ -RemoveLicenses "firma:STREAM"}
Oprava účtu, kdy se odstraní duplicitní schránka v cloudu
Podrobně bude tento problém popsán v dalším článku. Pokud se stalo to, že má uživatel schránku na on-premises Exchange serveru a zároveň mu vznikla (nepoužívaná) schránka na Exchange Online. Tak aby vše správně fungovalo, potřebujeme cloudovou schránku odebrat a účet napojit na interní schránku.
Připravíme licenční objekt, kde z dané licence odstraníme službu Exchange Online
$lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPREMIUM_NOPSTNCONF" ` -DisabledPlans "EXCHANGE_S_ENTERPRISE", "THREAT_INTELLIGENCE", "EXCHANGE_ANALYTICS"
Nastavíme na uživatele ze souboru
Get-Content "d:\accounts.txt" | foreach {Set-MsolUserLicense -UserPrincipalName $_ -LicenseOptions $lic}
Uživatelům odstraníme informaci o předchozí schránce (bez potvrzování)
Get-Content "d:\accounts.txt" | foreach {Set-User $_ -PermanentlyClearPreviousMailboxInfo -Confirm:$false}
Vrátíme uživatelům službu Exchange Online
$lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPREMIUM_NOPSTNCONF" Get-Content "d:\accounts.txt" | foreach { Set-MsolUserLicense -UserPrincipalName $_ -LicenseOptions $lic }
Mezi jednotlivými kroky je dobré si vypisovat informace o typu příjemce, abychom další krok provedli, až dojde k uplatnění změn. Hlavně při odebrání služby Exchange docela dlouho trvá, než se uživatel změní z UserMailbox
na MailUser
. Celý proces může vypadat následně (nespouštíme najednou).
Get-Content "d:\accounts.txt" | foreach { Get-User $_ | Select Name,*Recipient* } $lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPACK" -DisabledPlans "EXCHANGE_S_ENTERPRISE" Get-Content "d:\accounts.txt" | foreach { Set-MsolUserLicense -UserPrincipalName $_ -LicenseOptions $lic } Get-Content "d:\accounts.txt" | foreach { Get-User $_ | Select Name,*Recipient* } Get-Content "d:\accounts.txt" | foreach { Set-User $_ -PermanentlyClearPreviousMailboxInfo -Confirm:$false } Get-Content "d:\accounts.txt" | foreach { Get-User $_ | Select Name,*Recipient* } $lic = New-MsolLicenseOptions -AccountSkuId "firma:ENTERPRISEPACK" Get-Content "d:\accounts.txt" | foreach { Set-MsolUserLicense -UserPrincipalName $_ -LicenseOptions $lic } Get-Content "d:\accounts.txt" | foreach { Get-User $_ | Select Name,*Recipient* }
Zatím zde nejsou žádné komentáře.