Microsoft 365 pre helpdesk: Riešenie problémov s Exchange Online, Teams a licenciami (2026)

Praktický sprievodca pre helpdesk tímy na riešenie problémov s Microsoft 365. PowerShell príkazy pre diagnostiku Exchange Online, Teams, správu licencií, oprávnení k poštovým schránkam a reakciu na bezpečnostné incidenty.

Úvod: Prečo každý helpdesk technik potrebuje ovládať Microsoft 365

Povedzme si to na rovinu — ak robíte na IT helpdesku, Microsoft 365 je služba, s ktorou sa stretávate prakticky denne. Exchange Online, Microsoft Teams, SharePoint, OneDrive... tieto nástroje tvoria chrbtovú kosť moderného podnikového prostredia. A keď niečo z toho prestane fungovať? Hádajte, kto je prvý na rade.

Rok 2026 bol zatiaľ dosť divoký. Januárový výpadok, ktorý položil milióny používateľov po celom svete, nové PowerShell moduly pre správu Exchange Online, zmeny v licenčnom modeli a ten nekonečný prechod na nový Outlook — to všetko vytvára prostredie, kde sa jednoducho musíte neustále vzdelávať. Inak vás to prevalcuje.

V tomto článku sa zameriame na praktické riešenie najčastejších problémov pri správe Microsoft 365. Žiadna teória do šuplíka. Každá sekcia obsahuje konkrétne diagnostické príkazy, postupy riešenia a tipy z praxe. Či už riešite nedoručenú poštu, nefunkčné Teams hovory, alebo sa trápite s licenciami — mali by ste tu nájsť odpovede.

1. Pripojenie k Microsoft 365 cez PowerShell — základ všetkého

Inštalácia a konfigurácia Exchange Online Management modulu

Skôr než začnete čokoľvek riešiť v Microsoft 365, musíte sa vedieť pripojiť cez PowerShell. Bez toho ste v podstate slepí. V roku 2026 je štandardom modul Exchange Online Management V3, ktorý nahradil staršie moduly ako MSOnline a AzureAD.

# Inštalácia Exchange Online Management modulu
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber

# Kontrola nainštalovanej verzie
Get-InstalledModule ExchangeOnlineManagement | Select-Object Name, Version

# Pripojenie k Exchange Online
Connect-ExchangeOnline -UserPrincipalName [email protected]

# Pripojenie k Microsoft Graph (pre správu používateľov a licencií)
Install-Module Microsoft.Graph -Force
Connect-MgGraph -Scopes "User.ReadWrite.All", "Directory.ReadWrite.All"

Dôležitá vec — od roku 2025 Microsoft definitívne ukončil podporu modulov MSOnline a AzureAD. Ak ich stále používate (a z vlastnej skúsenosti viem, že veľa firiem stále používa), je najvyšší čas migrovať na Microsoft Graph PowerShell SDK. Staré moduly síce v niektorých prostrediach ešte fungujú, ale Microsoft ich môže kedykoľvek zablokovať. A verte mi, nechcete to riešiť v piatok o štvrtej popoludní.

Riešenie problémov s pripojením

Najčastejšie problémy pri pripájaní k Exchange Online cez PowerShell:

  • Chyba autentifikácie: Uistite sa, že váš účet má povolené MFA a že používate moderný autentifikačný tok. Basic Authentication je od roku 2023 vypnuté — konečne.
  • Firewall blokuje spojenie: PowerShell vyžaduje odchádzajúce spojenie na portoch 443 a 80 k doménam *.outlook.office365.com a login.microsoftonline.com.
  • Chýbajúce oprávnenia: Pre správu Exchange Online potrebujete rolu Exchange Administrator alebo Global Administrator.
# Diagnostika pripojenia — kontrola dostupnosti služby
Test-NetConnection outlook.office365.com -Port 443
Test-NetConnection login.microsoftonline.com -Port 443

# Kontrola TLS nastavenia
[Net.ServicePointManager]::SecurityProtocol

# Vynútenie TLS 1.2 (ak nie je predvolené)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

2. Exchange Online — Diagnostika nedoručenej pošty

Sledovanie toku správ (Message Trace)

Klasika. Zavolá vám používateľ, že jeho e-mail nebol doručený. Čo urobíte ako prvé? Siahate po Message Trace. Táto funkcia vám umožní sledovať cestu každej správy cez infraštruktúru Exchange Online a väčšinou odhalí, kde sa problém strhol.

# Základné sledovanie správ za posledných 48 hodín
Get-MessageTrace -SenderAddress [email protected] -StartDate (Get-Date).AddHours(-48) -EndDate (Get-Date) | Format-Table Received, SenderAddress, RecipientAddress, Subject, Status -AutoSize

# Filtrovanie len nedoručených správ
Get-MessageTrace -SenderAddress [email protected] -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) | Where-Object {$_.Status -eq "Failed"} | Format-Table Received, RecipientAddress, Subject, Status

# Podrobné informácie o konkrétnej správe
$trace = Get-MessageTrace -MessageId "<[email protected]>" -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date)
$trace | Get-MessageTraceDetail | Format-Table Date, Event, Action, Detail -Wrap

Pár obmedzení, na ktoré si dajte pozor:

  • Get-MessageTrace funguje len pre posledných 10 dní. Pre staršie správy musíte ísť inou cestou.
  • Get-MessageTraceV2 — novší cmdlet, ktorý podporuje vyhľadávanie až 90 dní dozadu (čo je obrovský posun vpred).
  • Pre vyhľadávanie staršie ako 10 dní použite Start-HistoricalSearch.
# Historické vyhľadávanie pre správy staršie ako 10 dní
Start-HistoricalSearch -ReportTitle "Nedorucene spravy januar" -StartDate "2026-01-01" -EndDate "2026-01-31" -ReportType MessageTrace -SenderAddress [email protected] -NotifyAddress [email protected]

# Kontrola stavu historického vyhľadávania
Get-HistoricalSearch | Format-Table SubmitDate, ReportTitle, Status, Rows -AutoSize

Najčastejšie príčiny nedoručenia e-mailov

Za tie roky na helpdesku som si všimol, že sa problémy opakujú. Toto sú najčastejšie dôvody, prečo e-mail nedorazí k príjemcovi:

1. Správa zachytená antispamovým filtrom

Toto je prekvapivo časté. Niekedy antispam zachytí aj legitímnu poštu, hlavne ak odosielateľ nemá čisté DNS záznamy.

# Kontrola karantény — správy zadržané antispamom
Get-QuarantineMessage -StartReceivedDate (Get-Date).AddDays(-7) -EndReceivedDate (Get-Date) | Where-Object {$_.SenderAddress -eq "[email protected]"} | Format-Table ReceivedTime, SenderAddress, RecipientAddress, Subject, QuarantineTypes

# Uvoľnenie správy z karantény
Release-QuarantineMessage -Identity "<QuarantineMessageId>" -ReleaseToAll

2. Transport rules blokujú doručenie

Transport rules sú mocný nástroj, ale nesprávne nakonfigurované pravidlo dokáže zablokovať celý tok pošty. Koľkokrát som videl, že niekto vytvoril pravidlo „na rýchlo" a potom sa divil, prečo polovica firmy nedostáva maily. V roku 2026 Microsoft pridal cmdlet Test-Message, ktorý umožňuje simulovať spracovanie správy pravidlami bez skutočného odoslania — to je vec, na ktorú sme čakali roky.

# Výpis všetkých transport rules
Get-TransportRule | Format-Table Name, State, Priority, Mode -AutoSize

# Test konkrétnej správy oproti transport rules
Test-Message -Sender [email protected] -Recipients [email protected] -TransportRules -SendReportTo [email protected]

# Kontrola, ktoré pravidlo zasiahlo
Get-TransportRule | Where-Object {$_.State -eq "Enabled"} | ForEach-Object {
    Write-Host "Pravidlo: $($_.Name)" -ForegroundColor Cyan
    Write-Host "  Podmienka: $($_.Conditions)"
    Write-Host "  Akcia: $($_.Actions)"
    Write-Host ""
}

3. Problémy s DNS a SPF/DKIM/DMARC záznamami

Ak vaša organizácia posiela maily, ktoré sú odmietané externými servermi, pravdepodobne máte nesprávne nakonfigurované autentifikačné DNS záznamy. Toto je niečo, čo by ste mali skontrolovať ako jedno z prvých vecí — a pritom na to veľa technikov zabudne.

# Kontrola SPF záznamu vašej domény
Resolve-DnsName -Name vasadomena.sk -Type TXT | Where-Object {$_.Strings -match "spf"}

# Kontrola DKIM záznamu
Resolve-DnsName -Name "selector1._domainkey.vasadomena.sk" -Type CNAME
Resolve-DnsName -Name "selector2._domainkey.vasadomena.sk" -Type CNAME

# Kontrola DMARC záznamu
Resolve-DnsName -Name "_dmarc.vasadomena.sk" -Type TXT

# Kontrola DKIM konfigurácie v Exchange Online
Get-DkimSigningConfig -Identity vasadomena.sk | Format-List Domain, Enabled, Status

3. Microsoft Teams — Riešenie problémov s hovormi a schôdzkami

Diagnostika sieťových problémov

Toto vás asi neprekvapí — až 75 % problémov s Microsoft Teams je spôsobených sieťou. Nekvalitný zvuk, zamrznuté video, odpojenia uprostred schôdzky... Skoro vždy je za tým sieť. Preto diagnostika siete musí byť váš prvý krok. Nie druhý, nie tretí. Prvý.

# Test konektivity na Teams služby
Test-NetConnection 13.107.64.2 -Port 443
Test-NetConnection teams.microsoft.com -Port 443

# Kontrola DNS rozlíšenia pre Teams
Resolve-DnsName teams.microsoft.com
Resolve-DnsName world.tr.teams.microsoft.com

# Test latency na najbližší Microsoft relay server
# Teams vyžaduje latency pod 50ms pre kvalitný hovor
Test-NetConnection 52.112.0.0 -Port 3478

Požiadavky na sieť pre kvalitné hovory

Pre kvalitné audio a video hovory v Teams musí vaša sieť spĺňať tieto minimálne parametre (a podčiarkujem slovo minimálne):

  • Šírka pásma: Minimálne 1,2 Mbps pre video hovor 1:1, 2,5 Mbps pre skupinové hovory s videom
  • Latencia (RTT): Menej ako 50 ms
  • Jitter: Menej ako 30 ms
  • Strata paketov: Menej ako 1 %

Pre diagnostiku kvality hovorov priamo v Teams prostredí využijete Teams Admin Center:

  1. Prihláste sa do Teams Admin Center na admin.teams.microsoft.com.
  2. Prejdite do sekcie Analytics & reports > Usage reports.
  3. Vyberte PSTN and SMS usage alebo Teams usage report.
  4. Pre detailnú analýzu konkrétneho hovoru použite Call analytics v sekcii Users — tam nájdete naozaj všetko, čo potrebujete.

Problémy s novým klientom Teams

Microsoft v roku 2025 dokončil migráciu z klasického Teams na nový klient postavený na Edge WebView2. Znie to dobre na papieri, ale v praxi to prinieslo kopec špecifických problémov, s ktorými sa stretávame dodnes.

Vymazanie cache nového Teams klienta:

# Zatvorenie Teams
Get-Process -Name "ms-teams" -ErrorAction SilentlyContinue | Stop-Process -Force

# Vymazanie cache nového Teams klienta
$teamsCache = "$env:LOCALAPPDATA\Packages\MSTeams_8wekyb3d8bbwe\LocalCache"
if (Test-Path $teamsCache) {
    Remove-Item -Path "$teamsCache\*" -Recurse -Force
    Write-Host "Cache nového Teams klienta bola vymazaná." -ForegroundColor Green
} else {
    Write-Host "Cesta k cache nebola nájdená. Skontrolujte verziu Teams." -ForegroundColor Yellow
}

# Alternatívna cesta pre Teams nainštalované cez MSIX
$teamsCache2 = "$env:LOCALAPPDATA\Packages\MicrosoftTeams_8wekyb3d8bbwe\LocalCache"
if (Test-Path $teamsCache2) {
    Remove-Item -Path "$teamsCache2\*" -Recurse -Force
    Write-Host "Cache MSIX Teams klienta bola vymazaná." -ForegroundColor Green
}

Problém s prihlásením do Teams:

Používateľ sa nemôže prihlásiť do Teams. Pozná to každý helpdeskár. Tu je diagnostický postup, ktorý funguje v drvivej väčšine prípadov:

  1. Najprv skontrolujte, či služba Teams vôbec beží — pozrite na status.cloud.microsoft. (Áno, niekedy je to naozaj tak jednoduché.)
  2. Overte, či má používateľ priradenú platnú licenciu Teams.
  3. Skúste prihlásenie cez webovú verziu na teams.microsoft.com — ak to funguje tam, problém je v klientovi.
  4. Vymažte cache klienta (viď postup vyššie).
  5. Skontrolujte Conditional Access politiky, či neblokujú prístup.
# Kontrola licencie Teams pre konkrétneho používateľa cez Microsoft Graph
Connect-MgGraph -Scopes "User.Read.All"
$user = Get-MgUser -UserId "[email protected]" -Property AssignedLicenses, DisplayName
$user.AssignedLicenses | ForEach-Object {
    $sku = Get-MgSubscribedSku | Where-Object {$_.SkuId -eq $_.SkuId}
    Write-Host "SKU: $($sku.SkuPartNumber)"
}

# Jednoduchšia kontrola — výpis všetkých licencií používateľa
Get-MgUserLicenseDetail -UserId "[email protected]" | Select-Object SkuPartNumber, SkuId

4. Správa licencií — Najčastejšie problémy a ich riešenie

Prehľad licenčného stavu tenanta

Správa licencií. Nudná, ale nevyhnutná súčasť práce. Používateľ nemôže pristúpiť k službe? Prvá vec — skontrolujte licenciu. Je to banálne, ale koľkokrát som videl, že sa niekto trápil hodinu s diagnostikou a pritom používateľ jednoducho nemal priradenú licenciu. Tu je súbor príkazov pre rýchlu diagnostiku:

# Pripojenie k Microsoft Graph
Connect-MgGraph -Scopes "Organization.Read.All", "User.Read.All"

# Prehľad všetkých licencií v tenante s počtom dostupných a priradených
Get-MgSubscribedSku | Select-Object SkuPartNumber, ConsumedUnits, @{N="TotalUnits";E={$_.PrepaidUnits.Enabled}}, @{N="Available";E={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}} | Format-Table -AutoSize

# Vyhľadanie používateľov bez licencie
Get-MgUser -Filter "assignedLicenses/`$count eq 0" -ConsistencyLevel eventual -CountVariable unlicensedCount -All | Select-Object DisplayName, UserPrincipalName | Format-Table -AutoSize
Write-Host "Celkový počet používateľov bez licencie: $unlicensedCount"

# Kontrola konkrétnej licencie používateľa
Get-MgUserLicenseDetail -UserId "[email protected]" | ForEach-Object {
    Write-Host "`nLicencia: $($_.SkuPartNumber)" -ForegroundColor Cyan
    $_.ServicePlans | Where-Object {$_.ProvisioningStatus -ne "Success"} | ForEach-Object {
        Write-Host "  PROBLÉM - $($_.ServicePlanName): $($_.ProvisioningStatus)" -ForegroundColor Red
    }
}

Priradenie a odobratie licencií hromadne

Keď potrebujete priradiť licencie väčšiemu počtu ľudí — trebárs pri onboardingu celého nového oddelenia — manuálne klikanie v admin centre je cestou do pekla. PowerShell to zvládne za vás oveľa rýchlejšie a spoľahlivejšie:

# Získanie SKU ID licencie, ktorú chcete priradiť
$skuId = (Get-MgSubscribedSku | Where-Object {$_.SkuPartNumber -eq "ENTERPRISEPACK"}).SkuId

# Priradenie licencie jednému používateľovi
Set-MgUserLicense -UserId "[email protected]" -AddLicenses @(@{SkuId = $skuId}) -RemoveLicenses @()

# Hromadné priradenie licencií zo CSV súboru
$users = Import-Csv "C:\temp\noví_uzivatelia.csv"
foreach ($user in $users) {
    try {
        Set-MgUserLicense -UserId $user.UserPrincipalName -AddLicenses @(@{SkuId = $skuId}) -RemoveLicenses @()
        Write-Host "Licencia priradená: $($user.UserPrincipalName)" -ForegroundColor Green
    } catch {
        Write-Host "Chyba pri priraďovaní licencie pre $($user.UserPrincipalName): $($_.Exception.Message)" -ForegroundColor Red
    }
}

# Odobratie licencie
Set-MgUserLicense -UserId "[email protected]" -AddLicenses @() -RemoveLicenses @($skuId)

Licenčné konflikty a ich riešenie

Licenčné konflikty. Toto je niečo, čo vie potrápiť aj skúsenejšieho technika. Vznikajú vtedy, keď sa používateľovi pokúsite priradiť licenciu obsahujúcu službu, ktorá je už zahrnutá v inej licencii. Typický príklad — používateľ má E3 a vy mu priradíte ešte samostatnú licenciu Teams. Výsledok? Konflikt a problémy.

# Identifikácia používateľov s licenčnými chybami
Get-MgUser -All -Property DisplayName, UserPrincipalName, AssignedLicenses, LicenseAssignmentStates | Where-Object {
    $_.LicenseAssignmentStates | Where-Object {$_.Error -ne $null -and $_.Error -ne "None"}
} | ForEach-Object {
    Write-Host "`nPoužívateľ: $($_.DisplayName) ($($_.UserPrincipalName))" -ForegroundColor Yellow
    $_.LicenseAssignmentStates | Where-Object {$_.Error -ne $null -and $_.Error -ne "None"} | ForEach-Object {
        Write-Host "  Chyba: $($_.Error)" -ForegroundColor Red
        Write-Host "  SKU: $($_.SkuId)"
    }
}

5. Správa poštových schránok — Delegácia, zdieľané schránky a oprávnenia

Typy oprávnení k poštovým schránkam

Na helpdesku sa denne stretávate s požiadavkami typu „Potrebujem prístup do schránky kolegu" alebo „Chcem posielať e-maily za oddelenie". Znie to jednoducho, ale Exchange Online má tri rôzne typy delegácie a je dôležité vedieť, ktorý kedy použiť:

  • Full Access: Úplný prístup k obsahu schránky — čítanie, mazanie, správa priečinkov. Ale pozor, neumožňuje odosielanie e-mailov. Na to si ľudia často nespomenú.
  • Send As: Odosielanie e-mailov tak, akoby ich odoslal vlastník schránky. Príjemca vidí odosielateľa ako vlastníka schránky — nevidí, kto mail reálne napísal.
  • Send on Behalf: Odosielanie v mene vlastníka. Príjemca vidí „Jan Novák v mene Oddelenie podpory". Transparentnejšie riešenie.
# Pridelenie Full Access oprávnenia
Add-MailboxPermission -Identity "[email protected]" -User "[email protected]" -AccessRights FullAccess -InheritanceType All

# Pridelenie Send As oprávnenia
Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

# Pridelenie Send on Behalf oprávnenia
Set-Mailbox -Identity "[email protected]" -GrantSendOnBehalfTo @{Add="[email protected]"}

# Kontrola všetkých oprávnení k poštovej schránke
Get-MailboxPermission -Identity "[email protected]" | Where-Object {$_.User -notlike "NT AUTHORITY\*" -and $_.User -notlike "S-1-5-*"} | Format-Table User, AccessRights -AutoSize

# Kontrola Send As oprávnení
Get-RecipientPermission -Identity "[email protected]" | Where-Object {$_.Trustee -notlike "NT AUTHORITY\*"} | Format-Table Trustee, AccessRights -AutoSize

Vytvorenie a správa zdieľanej poštovej schránky

Zdieľané poštové schránky sú ideálne pre tímové e-mailové adresy — podpora@, fakturacia@, info@ a podobne. A čo je príjemné, nevyžadujú samostatnú licenciu. Teda pokiaľ nepresahujú 50 GB alebo nemajú zapnutý archív — to už licenciu potrebujete.

# Vytvorenie zdieľanej poštovej schránky
New-Mailbox -Name "IT Podpora" -Alias "itpodpora" -Shared -PrimarySmtpAddress "[email protected]"

# Pridanie členov, ktorí budú mať prístup
Add-MailboxPermission -Identity "[email protected]" -User "[email protected]" -AccessRights FullAccess -AutoMapping $true
Add-MailboxPermission -Identity "[email protected]" -User "[email protected]" -AccessRights FullAccess -AutoMapping $true

# Povolenie odosielania ako zdieľaná schránka
Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false
Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

# Nastavenie automatickej odpovede na zdieľanej schránke
Set-MailboxAutoReplyConfiguration -Identity "[email protected]" -AutoReplyState Enabled -InternalMessage "Ďakujeme za váš e-mail. Vašu požiadavku spracujeme do 24 hodín." -ExternalMessage "Ďakujeme za kontaktovanie IT podpory. Odpovieme vám čo najskôr."

Bežné problémy so zdieľanými schránkami

Tu sú veci, ktoré riešite stále dookola:

  • Schránka sa nezobrazuje v Outlooku: Klasický problém. Skontrolujte parameter -AutoMapping. Ak bol nastavený na $false, používateľ musí schránku pridať manuálne. A ešte jedna vec — zmena AutoMapping sa neprejaví okamžite, počkajte 15 až 30 minút alebo reštartnite Outlook.
  • Limit veľkosti 50 GB: Zdieľané schránky bez licencie majú limit 50 GB. Ak potrebujete viac, musíte priradiť licenciu Exchange Online Plan 2 alebo zapnúť archivačnú schránku.
  • Prihlásenie do zdieľanej schránky: Občas sa ma ľudia pýtajú na heslo k zdieľanej schránke. Neexistuje. Do zdieľanej schránky sa nedá prihlásiť priamo — pristupujete k nej cez svoj vlastný účet s pridelenými oprávneniami.
# Kontrola veľkosti zdieľanej schránky
Get-MailboxStatistics -Identity "[email protected]" | Select-Object DisplayName, TotalItemSize, ItemCount, LastLogonTime

# Kontrola AutoMapping nastavenia
Get-MailboxPermission -Identity "[email protected]" | Where-Object {$_.AccessRights -contains "FullAccess" -and $_.User -notlike "NT AUTHORITY\*"} | Select-Object User, AccessRights

# Zapnutie archívnej schránky (vyžaduje licenciu)
Enable-Mailbox -Identity "[email protected]" -Archive

6. Monitorovanie stavu služieb Microsoft 365

Januárový výpadok 2026 — poučenie pre helpdesk

O januárovom výpadku Microsoft 365 z 22. januára 2026 sa toho popísalo veľa. Exchange Online, Teams, Outlook, Microsoft Defender a ďalšie služby — všetko dole. Takmer 24 hodín. Milióny používateľov. Chybová hláška 451 4.3.2 temporary server issue pri pokuse o odoslanie e-mailov. Kto to zažil, nezabudne.

Z vlastnej skúsenosti viem, že keď niečo takéto nastane, helpdesk je doslova zavalený. Čo sa z toho dá naučiť?

  1. Majte pripravený komunikačný plán. Keď padne Microsoft 365, nemáte čas vymýšľať, čo napísať používateľom. Pripravte si šablónu správy vopred, nech ju stačí upraviť a rozoslať.
  2. Sledujte stav služieb proaktívne. Nenechávajte sa informovať používateľmi — to je tá najhoršia cesta. Nastavte si automatické monitorovanie.
  3. Majte alternatívne komunikačné kanály. Ak padne Teams aj Exchange, ako sa spojíte s používateľmi? Zvážte SMS notifikácie, interný komunikačný systém alebo aspoň starý dobrý telefónny strom.

Automatické monitorovanie stavu služieb cez Microsoft Graph

Namiesto neustáleho manuálneho kontrolovania admin centra (kto by to chcel robiť celý deň?) si môžete nastaviť automatické monitorovanie cez Microsoft Graph API:

# Pripojenie k Microsoft Graph s oprávneniami na čítanie stavu služieb
Connect-MgGraph -Scopes "ServiceHealth.Read.All"

# Získanie aktuálneho stavu všetkých služieb
Get-MgServiceAnnouncementHealthOverview | Select-Object Service, Status | Format-Table -AutoSize

# Filtrovanie len služieb s problémami
Get-MgServiceAnnouncementHealthOverview | Where-Object {$_.Status -ne "ServiceOperational"} | ForEach-Object {
    Write-Host "`nSlužba: $($_.Service)" -ForegroundColor Red
    Write-Host "Stav: $($_.Status)" -ForegroundColor Yellow

    # Získanie detailov problému
    $issues = Get-MgServiceAnnouncementHealthOverviewIssue -ServiceHealthId $_.Id
    foreach ($issue in $issues) {
        Write-Host "  Problém: $($issue.Title)"
        Write-Host "  Začiatok: $($issue.StartDateTime)"
        Write-Host "  Typ: $($issue.Classification)"
    }
}

# Získanie aktívnych incidentov
Get-MgServiceAnnouncementIssue -Filter "isResolved eq false" | Select-Object Title, Service, Classification, StartDateTime | Format-Table -AutoSize

Nastavenie e-mailových notifikácií

Pre automatické notifikácie o výpadkoch si môžete vytvoriť PowerShell skript, ktorý bude periodicky kontrolovať stav služieb a posielať upozornenia. Nie je to nič zložité a ušetrí vám to kopec nervov:

# Jednoduchý monitorovací skript pre helpdesk
# Uložte ako Monitor-M365Health.ps1 a naplánujte cez Task Scheduler

param(
    [string]$NotificationEmail = "[email protected]"
)

# Pripojenie (vyžaduje predkonfigurovanú app registráciu)
Connect-MgGraph -ClientId $env:M365_CLIENT_ID -TenantId $env:M365_TENANT_ID -CertificateThumbprint $env:M365_CERT_THUMBPRINT

$issues = Get-MgServiceAnnouncementHealthOverview | Where-Object {$_.Status -ne "ServiceOperational"}

if ($issues.Count -gt 0) {
    $body = "UPOZORNENIE: Nasledujúce služby Microsoft 365 majú problémy:`n`n"
    foreach ($issue in $issues) {
        $body += "Služba: $($issue.Service)`n"
        $body += "Stav: $($issue.Status)`n`n"
    }

    # Odoslanie notifikácie
    $params = @{
        Message = @{
            Subject = "[M365 ALERT] Detekovaný problém so službami Microsoft 365"
            Body = @{
                ContentType = "Text"
                Content = $body
            }
            ToRecipients = @(@{EmailAddress = @{Address = $NotificationEmail}})
        }
    }
    Send-MgUserMail -UserId "[email protected]" -BodyParameter $params
}

Disconnect-MgGraph

7. Nový Outlook vs. klasický Outlook — Čo potrebuje helpdesk vedieť

Aktuálny stav migrácie v roku 2026

Ach, nový Outlook. Microsoft pokračuje v presadzovaní nového Outlooku (One Outlook) ako náhrady za klasický. V praxi to znamená, že v roku 2026 máte v organizácii mix — niektorí používatelia už bežia na novom Outlooku, iní sa ho odmietajú pustiť a zostávajú na klasickom. Pre helpdesk to vytvára... zaujímavé situácie.

Kľúčové rozdiely, ktoré musíte mať v hlave:

  • Architektúra: Nový Outlook je v podstate webová aplikácia bežiaca v kontajneri Edge WebView2. Klasický Outlook je natívna Win32 aplikácia. Úplne iný svet.
  • Dáta: Nový Outlook neukladá e-maily lokálne. Všetko je v cloude. Klasický Outlook podporuje lokálne PST a OST súbory.
  • Doplnky: COM doplnky v novom Outlooku nefungujú. Bodka. Fungujú len webové doplnky (Office Add-ins). Toto je vec, ktorá vie poriadne potrápiť organizácie závislé na starších doplnkoch.
  • Profily: Nový Outlook nepoužíva MAPI profily. Konfigurácia je viazaná na účet Microsoft 365.

Riešenie problémov po januárových aktualizáciách 2026

Po januárových aktualizáciách Windows 2026 sa objavili nepríjemné problémy s klasickým Outlookom — zamrzávanie, neodpovedanie a problémy s POP účtami. Ak sa s tým stretávate (a je celkom pravdepodobné, že áno), skúste nasledovné:

# Spustenie Outlooku v bezpečnom režime
Start-Process outlook.exe -ArgumentList "/safe"

# Oprava Office inštalácie cez príkazový riadok
# Rýchla oprava
Start-Process "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" -ArgumentList "scenario=Repair platform=x64 culture=sk-sk RepairType=QuickRepair DisplayLevel=True"

# Online oprava (dôkladnejšia, vyžaduje internet)
Start-Process "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" -ArgumentList "scenario=Repair platform=x64 culture=sk-sk RepairType=FullRepair DisplayLevel=True"

# Vymazanie Outlook cache
$outlookCache = "$env:LOCALAPPDATA\Microsoft\Outlook\RoamCache"
if (Test-Path $outlookCache) {
    Get-Process outlook -ErrorAction SilentlyContinue | Stop-Process -Force
    Start-Sleep -Seconds 3
    Remove-Item "$outlookCache\*" -Force
    Write-Host "Outlook RoamCache vymazaný." -ForegroundColor Green
}

Kontrola a správa verzií Office

# Zistenie aktuálnej verzie Office na zariadení
$clickToRun = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue
if ($clickToRun) {
    Write-Host "Verzia Office: $($clickToRun.VersionToReport)"
    Write-Host "Kanál aktualizácií: $($clickToRun.CDNBaseUrl)"
    Write-Host "Platforma: $($clickToRun.Platform)"
} else {
    Write-Host "Click-to-Run Office nie je nainštalovaný."
}

# Vynútenie aktualizácie Office
$c2rPath = "C:\Program Files\Common Files\Microsoft Shared\ClickToRun\OfficeC2RClient.exe"
if (Test-Path $c2rPath) {
    Start-Process $c2rPath -ArgumentList "/update user"
    Write-Host "Aktualizácia Office spustená."
}

8. Praktické skripty pre každodenný helpdesk

Rýchla diagnostika používateľského účtu

Toto je asi môj obľúbený skript z celého článku. Kombinuje viacero kontrol do jedného nástroja a za pár sekúnd vám dá kompletný prehľad o stave účtu. Namiesto toho, aby ste spúšťali päť rôznych príkazov, spustíte jeden:

# Diagnostický skript pre helpdesk — stav používateľského účtu M365
function Get-M365UserDiagnostics {
    param(
        [Parameter(Mandatory=$true)]
        [string]$UserPrincipalName
    )

    Write-Host "=== Diagnostika účtu: $UserPrincipalName ===" -ForegroundColor Cyan
    Write-Host ""

    # 1. Základné informácie o používateľovi
    Write-Host "--- Základné informácie ---" -ForegroundColor Yellow
    $user = Get-MgUser -UserId $UserPrincipalName -Property DisplayName, AccountEnabled, LastPasswordChangeDateTime, CreatedDateTime, SignInActivity
    Write-Host "Meno: $($user.DisplayName)"
    Write-Host "Účet aktívny: $($user.AccountEnabled)"
    Write-Host "Posledná zmena hesla: $($user.LastPasswordChangeDateTime)"
    Write-Host "Posledné prihlásenie: $($user.SignInActivity.LastSignInDateTime)"
    Write-Host ""

    # 2. Licencie
    Write-Host "--- Licencie ---" -ForegroundColor Yellow
    $licenses = Get-MgUserLicenseDetail -UserId $UserPrincipalName
    if ($licenses) {
        foreach ($lic in $licenses) {
            Write-Host "  $($lic.SkuPartNumber)"
            $failedPlans = $lic.ServicePlans | Where-Object {$_.ProvisioningStatus -ne "Success" -and $_.ProvisioningStatus -ne "Disabled"}
            foreach ($plan in $failedPlans) {
                Write-Host "    PROBLÉM: $($plan.ServicePlanName) — $($plan.ProvisioningStatus)" -ForegroundColor Red
            }
        }
    } else {
        Write-Host "  ŽIADNE LICENCIE!" -ForegroundColor Red
    }
    Write-Host ""

    # 3. Stav poštovej schránky
    Write-Host "--- Poštová schránka ---" -ForegroundColor Yellow
    try {
        $mailbox = Get-Mailbox -Identity $UserPrincipalName -ErrorAction Stop
        $mailboxStats = Get-MailboxStatistics -Identity $UserPrincipalName
        Write-Host "  Typ: $($mailbox.RecipientTypeDetails)"
        Write-Host "  Veľkosť: $($mailboxStats.TotalItemSize)"
        Write-Host "  Počet položiek: $($mailboxStats.ItemCount)"
        Write-Host "  Posledné prihlásenie: $($mailboxStats.LastLogonTime)"
    } catch {
        Write-Host "  Poštová schránka nenájdená alebo nedostupná." -ForegroundColor Red
    }
    Write-Host ""

    # 4. Pravidlá doručenej pošty (Inbox Rules)
    Write-Host "--- Pravidlá schránky ---" -ForegroundColor Yellow
    try {
        $rules = Get-InboxRule -Mailbox $UserPrincipalName -ErrorAction Stop
        if ($rules) {
            foreach ($rule in $rules) {
                $color = if ($rule.Enabled) { "White" } else { "Gray" }
                Write-Host "  [$($rule.Enabled)] $($rule.Name)" -ForegroundColor $color
                if ($rule.ForwardTo -or $rule.RedirectTo -or $rule.ForwardAsAttachmentTo) {
                    Write-Host "    VAROVANIE: Presmerovanie aktívne!" -ForegroundColor Red
                    Write-Host "    ForwardTo: $($rule.ForwardTo)"
                    Write-Host "    RedirectTo: $($rule.RedirectTo)"
                }
            }
        } else {
            Write-Host "  Žiadne pravidlá."
        }
    } catch {
        Write-Host "  Chyba pri čítaní pravidiel." -ForegroundColor Red
    }
}

# Použitie:
# Get-M365UserDiagnostics -UserPrincipalName "[email protected]"

Hromadný export informácií o používateľoch

Keď vám vedenie povie „Potrebujeme report o stave licencií do zajtra" — a to sa stáva častejšie, než by ste chceli — hodí sa mať po ruke niečo takéto:

# Export všetkých používateľov s ich licenciami do CSV
$allUsers = Get-MgUser -All -Property DisplayName, UserPrincipalName, AccountEnabled, AssignedLicenses
$report = foreach ($user in $allUsers) {
    $licenses = (Get-MgUserLicenseDetail -UserId $user.Id -ErrorAction SilentlyContinue).SkuPartNumber -join "; "
    [PSCustomObject]@{
        Meno = $user.DisplayName
        UPN = $user.UserPrincipalName
        Aktivny = $user.AccountEnabled
        Licencie = $licenses
    }
}
$report | Export-Csv "C:\temp\M365_uzivatelia_report.csv" -NoTypeInformation -Encoding UTF8
Write-Host "Report exportovaný do C:\temp\M365_uzivatelia_report.csv"

9. Bezpečnostné incidenty — Čo robiť, keď je účet kompromitovaný

Indikátory kompromitácie účtu

Toto je sekcia, kde sa veci stávajú vážnymi. Ak používateľ hlási podozrivú aktivitu alebo bezpečnostný systém zachytí anomáliu, helpdesk musí reagovať rýchlo. Nie o hodinu, nie zajtra. Hneď. Typické znaky, že niečo nie je v poriadku:

  • Neznáme pravidlá presmerovania e-mailov v schránke (toto je veľmi častý indikátor)
  • Odosielanie e-mailov, ktoré používateľ neodoslal
  • Prihlásenia z neobvyklých lokácií alebo zariadení
  • Zmena hesla alebo MFA nastavení, o ktorých používateľ nevie
  • Nové aplikácie s prístupom k dátam používateľa

Postup reakcie na kompromitáciu

Tu je postup, ktorý by mal byť u každého na helpdesku vytlačený a prilepený na monitore. Nie som sarkastický — naozaj to odporúčam mať po ruke, lebo keď sa to stane, nemáte čas googliť:

# OKAMŽITÉ KROKY pri podozrení na kompromitáciu účtu

# 1. Resetovanie hesla a zablokovanie prihlásenia
$newPassword = @{
    PasswordProfile = @{
        ForceChangePasswordNextSignIn = $true
        Password = (New-Guid).ToString().Substring(0,16) + "!A1"
    }
}
Update-MgUser -UserId "[email protected]" -BodyParameter $newPassword

# 2. Zrušenie všetkých aktívnych relácií
Revoke-MgUserSignInSession -UserId "[email protected]"
Write-Host "Všetky relácie zrušené." -ForegroundColor Green

# 3. Kontrola a odstránenie podozrivých pravidiel presmerovania
$rules = Get-InboxRule -Mailbox "[email protected]"
$suspiciousRules = $rules | Where-Object {$_.ForwardTo -or $_.RedirectTo -or $_.ForwardAsAttachmentTo -or $_.DeleteMessage}
foreach ($rule in $suspiciousRules) {
    Write-Host "Podozrivé pravidlo: $($rule.Name)" -ForegroundColor Red
    Write-Host "  Forward: $($rule.ForwardTo) | Redirect: $($rule.RedirectTo) | Delete: $($rule.DeleteMessage)"
    # Odstránenie podozrivého pravidla
    Remove-InboxRule -Mailbox "[email protected]" -Identity $rule.Identity -Confirm:$false
    Write-Host "  Pravidlo odstránené." -ForegroundColor Green
}

# 4. Kontrola oprávnených aplikácií tretích strán
$appConsents = Get-MgUserOauth2PermissionGrant -UserId "[email protected]"
foreach ($consent in $appConsents) {
    $app = Get-MgServicePrincipal -ServicePrincipalId $consent.ClientId -ErrorAction SilentlyContinue
    Write-Host "Aplikácia: $($app.DisplayName) | Oprávnenia: $($consent.Scope)"
}

# 5. Kontrola prihlasovacích logov za posledných 7 dní
Get-MgAuditLogSignIn -Filter "userPrincipalName eq '[email protected]' and createdDateTime ge $(((Get-Date).AddDays(-7)).ToString('yyyy-MM-ddTHH:mm:ssZ'))" | Select-Object CreatedDateTime, IpAddress, Location, ClientAppUsed, Status | Format-Table -AutoSize

10. Tipy a najlepšie postupy pre helpdesk tím

Šablóny pre bežné požiadavky

Na záver niečo praktické. Vytvorte si knižnicu PowerShell skriptov pre najčastejšie helpdesk operácie. Ušetrí vám to obrovské množstvo času. Tu je pár základných, ktoré by nemal chýbať v arzenáli žiadneho technika:

# Rýchle pridanie používateľa do distribučnej skupiny
Add-DistributionGroupMember -Identity "[email protected]" -Member "[email protected]"

# Konverzia poštovej schránky na zdieľanú (napr. pri odchode zamestnanca)
Set-Mailbox -Identity "[email protected]" -Type Shared

# Nastavenie automatickej odpovede (Out of Office)
Set-MailboxAutoReplyConfiguration -Identity "[email protected]" -AutoReplyState Scheduled -StartTime "2026-02-15 08:00" -EndTime "2026-02-22 17:00" -InternalMessage "Som na dovolenke. V naliehavých prípadoch kontaktujte [email protected]." -ExternalMessage "Som mimo kancelárie do 22. februára 2026."

# Overenie, či je e-mailová adresa už použitá v tenante
Get-Recipient -Filter "EmailAddresses -eq 'smtp:[email protected]'" | Select-Object DisplayName, RecipientType, PrimarySmtpAddress

Dokumentácia a zdieľanie znalostí

A nakoniec pár odporúčaní, ktoré som si za tie roky overil v praxi:

  • Vytvorte si internú knowledge base. Vážne. Každý vyriešený problém zdokumentujte. Keď sa rovnaký problém objaví o tri mesiace, riešenie nájdete za pár sekúnd namiesto hodiny. Budúce „ja" vám poďakuje.
  • Automatizujte opakujúce sa úlohy. Ak rovnaký PowerShell príkaz spúšťate viackrát denne, je čas vytvoriť z neho funkciu alebo skript. Nie je to lenivosť — je to efektivita.
  • Sledujte Microsoft 365 Message Center. Microsoft tu oznamuje plánované zmeny 30 až 90 dní vopred. Buďte pripravení skôr, než sa zmena prejaví a telefón začne zvoniť.
  • Testujte v preview prostredí. Ak máte k dispozícii testovacieho tenanta, vždy testujte nové skripty a konfigurácie najprv tam. Prečo riskovať v produkcii?
  • Udržujte moduly aktuálne. Pravidelne aktualizujte PowerShell moduly. Zastarané moduly môžu obsahovať chyby alebo nekompatibilné cmdlety, a potom sa čudujete, prečo vám niečo nefunguje.
# Aktualizácia všetkých Microsoft 365 PowerShell modulov
$modules = @("ExchangeOnlineManagement", "Microsoft.Graph", "MicrosoftTeams")
foreach ($module in $modules) {
    try {
        Update-Module -Name $module -Force -ErrorAction Stop
        Write-Host "Aktualizovaný: $module" -ForegroundColor Green
    } catch {
        Write-Host "Chyba pri aktualizácii $module : $($_.Exception.Message)" -ForegroundColor Yellow
    }
}

Záver

Správa Microsoft 365 je rozsiahla a neustále sa meniaca oblasť. To nie je klišé — naozaj sa tu veci menia rýchlosťou, ktorá vie byť frustrujúca. V tomto článku sme prešli najdôležitejšie veci, s ktorými sa na helpdesku stretávate denne — od diagnostiky nedoručených e-mailov, cez správu licencií a oprávnení, až po reakciu na bezpečnostné incidenty.

Kľúč k úspechu? Kombinácia troch vecí: znalosť PowerShell príkazov pre rýchlu diagnostiku, proaktívne monitorovanie stavu služieb a dobre zdokumentované postupy. Investícia do automatizácie a znalostnej bázy sa vám vráti mnohonásobne — v ušetrenom čase, kvalitnejšej podpore a spokojnejších používateľoch (a tým pádom aj menej stresujúcich dňoch pre vás).

Sledujte Microsoft 365 Message Center a Microsoft 365 Roadmap pre nadchádzajúce zmeny. Byť o krok vpred pred používateľmi je najlepšia stratégia, akú helpdesk tím môže mať. A aj keď sa to nie vždy podarí — s dobrými nástrojmi a postupmi zvládnete aj ten najhorší pondelok.

O Autorovi Editorial Team

Our team of expert writers and editors.