#Requires -Modules ExchangeOnlineManagement #Requires -Version 7.0 <# .SYNOPSIS Ogranicza dostęp mobilny do Exchange Online — zezwala tylko Outlook Mobile. .DESCRIPTION Nowoczesna wersja Restrict-ExchangeOnlineMobileAccess.ps1 (2015). MIGRACJA — co zostało zmienione: STARE (deprecated): New-PSSession -ConnectionUri outlook.office365.com/powershell-liveid → Basic Auth, EOL 2021 Import-PSSession → Implicit Remoting, deprecated Set-CasMailbox -OWAforDevicesEnabled $False → właściwość usunięta z EXO v3 NOWE (2026): Connect-ExchangeOnline → Nowoczesne połączenie (OAuth2, MFA-ready) Set-MobileDeviceMailboxPolicy → Polityka urządzeń mobilnych (tenant-wide) New-MobileDeviceAccessRule → Reguła dostępu per model urządzenia Set-MobileDeviceAccessRule → Edycja istniejącej reguły Strategia: 1. Tworzy/aktualizuje politykę mobilną blokującą wszystkie urządzenia (DefaultAccessLevel = Block) 2. Dodaje regułę Allow dla "Outlook for iOS and Android" 3. Przypisuje politykę do wszystkich skrzynek (lub wybranych) .PARAMETER TenantDomain Domena tenanta M365 (np. firma.onmicrosoft.com). Używana do Connect-ExchangeOnline. .PARAMETER PolicyName Nazwa polityki urządzeń mobilnych (domyślnie: "BlockAllExceptOutlook"). .PARAMETER TargetMailbox UPN konkretnej skrzynki — jeśli podane, stosuje tylko do tej skrzynki. Bez parametru — stosuje do wszystkich skrzynek (ConfirmImpact=High). .EXAMPLE .\Restrict-EXOMobileAccess-Modern.ps1 -TenantDomain "firma.onmicrosoft.com" .EXAMPLE .\Restrict-EXOMobileAccess-Modern.ps1 -TenantDomain "firma.onmicrosoft.com" -TargetMailbox "jan@firma.pl" -WhatIf .NOTES Wersja: 2.0.0 (2026) Wymaga: ExchangeOnlineManagement v3+ — Install-Module ExchangeOnlineManagement -Scope CurrentUser Uprawnienia: Exchange Administrator lub Recipient Management #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( [Parameter(Mandatory)] [string]$TenantDomain, [string]$PolicyName = "BlockAllExceptOutlook", [string]$TargetMailbox = "" ) # ============================================================ # POŁĄCZENIE — EXO v3 (zastępuje New-PSSession + Import-PSSession) # ============================================================ Write-Host "Łączenie z Exchange Online..." -ForegroundColor Cyan Connect-ExchangeOnline -Organization $TenantDomain -ShowBanner:$false -ErrorAction Stop Write-Verbose "Połączono z Exchange Online ($TenantDomain)" try { # ============================================================ # KROK 1: Polityka urządzeń mobilnych (tenant-wide block) # Zastępuje: Set-ActiveSyncOrganizationSettings -DefaultAccessLevel Block # ============================================================ Write-Host "`n[1/3] Konfiguracja polityki mobilnej '$PolicyName'..." -ForegroundColor Cyan $existingPolicy = Get-MobileDeviceMailboxPolicy -Identity $PolicyName -ErrorAction SilentlyContinue if ($existingPolicy) { Write-Host " Polityka istnieje — aktualizuję..." if ($PSCmdlet.ShouldProcess($PolicyName, "Aktualizacja polityki mobilnej (AllowNonProvisionableDevices=False)")) { Set-MobileDeviceMailboxPolicy -Identity $PolicyName ` -AllowNonProvisionableDevices $false ` -DeviceEncryptionEnabled $true ` -RequireDeviceEncryption $true ` -ErrorAction Stop Write-Host " ✓ Polityka zaktualizowana" -ForegroundColor Green } } else { Write-Host " Tworzę nową politykę..." if ($PSCmdlet.ShouldProcess($PolicyName, "Tworzenie polityki mobilnej")) { New-MobileDeviceMailboxPolicy -Name $PolicyName ` -AllowNonProvisionableDevices $false ` -DeviceEncryptionEnabled $true ` -RequireDeviceEncryption $true ` -IsDefault $false ` -ErrorAction Stop Write-Host " ✓ Polityka utworzona" -ForegroundColor Green } } # ============================================================ # KROK 2: Reguła dostępu — Allow dla Outlook Mobile # Zastępuje: New-ActiveSyncDeviceAccessRule (ActiveSync = stara nazwa API) # ============================================================ Write-Host "`n[2/3] Konfiguracja reguły dostępu dla Outlook Mobile..." -ForegroundColor Cyan $ruleName = "Allow-OutlookMobile" $existingRule = Get-MobileDeviceAccessRule -Identity $ruleName -ErrorAction SilentlyContinue if ($existingRule) { Write-Host " Reguła '$ruleName' już istnieje (AccessLevel: $($existingRule.AccessLevel))" if ($existingRule.AccessLevel -ne "Allow") { if ($PSCmdlet.ShouldProcess($ruleName, "Zmiana AccessLevel na Allow")) { Set-MobileDeviceAccessRule -Identity $ruleName -AccessLevel Allow -ErrorAction Stop Write-Host " ✓ Reguła zaktualizowana do Allow" -ForegroundColor Green } } else { Write-Host " ✓ Reguła już poprawnie skonfigurowana" -ForegroundColor Green } } else { if ($PSCmdlet.ShouldProcess($ruleName, "Tworzenie reguły Allow dla Outlook Mobile")) { New-MobileDeviceAccessRule ` -Characteristic DeviceModel ` -QueryString "Outlook for iOS and Android" ` -AccessLevel Allow ` -Name $ruleName ` -ErrorAction Stop Write-Host " ✓ Reguła Allow dla 'Outlook for iOS and Android' utworzona" -ForegroundColor Green } } # ============================================================ # KROK 3: Ustawienie globalnego bloku dostępu mobilnego # (tenant-wide — blokuje wszystkie urządzenia niespełniające reguł) # ============================================================ Write-Host "`n[3/3] Ustawienie globalnej polityki blokady ActiveSync..." -ForegroundColor Cyan $orgSettings = Get-MobileDeviceAccessRule -ErrorAction SilentlyContinue $currentOrgBlock = Get-OrganizationConfig | Select-Object -ExpandProperty DefaultMobileDeviceAccessLevel -ErrorAction SilentlyContinue # Sprawdź aktualny stan ustawień organizacji ActiveSync $asOrgSettings = Get-ActiveSyncOrganizationSettings -ErrorAction SilentlyContinue if ($asOrgSettings -and $asOrgSettings.DefaultAccessLevel -ne "Block") { if ($PSCmdlet.ShouldProcess("ActiveSyncOrganizationSettings", "Ustawienie DefaultAccessLevel = Block")) { Set-ActiveSyncOrganizationSettings -DefaultAccessLevel Block -WarningAction SilentlyContinue Write-Host " ✓ Globalny blok ActiveSync ustawiony" -ForegroundColor Green } } else { Write-Host " ✓ Globalny blok ActiveSync już aktywny" -ForegroundColor Green } # ============================================================ # PRZYPISANIE POLITYKI (opcjonalne — do konkretnej skrzynki lub wszystkich) # ============================================================ if ($TargetMailbox) { Write-Host "`nPrzypisywanie polityki do: $TargetMailbox" -ForegroundColor Cyan if ($PSCmdlet.ShouldProcess($TargetMailbox, "Przypisz MobileDeviceMailboxPolicy: $PolicyName")) { Set-CASMailbox -Identity $TargetMailbox ` -ActiveSyncMailboxPolicy $PolicyName ` -ErrorAction Stop Write-Host " ✓ Polityka przypisana do $TargetMailbox" -ForegroundColor Green } } else { Write-Host "`n[Opcjonalnie] Przypisanie polityki do WSZYSTKICH skrzynek..." -ForegroundColor Yellow Write-Host " Uruchom ręcznie (duże środowiska — może trwać długo):" Write-Host " Get-EXOMailbox -ResultSize Unlimited | Set-CASMailbox -ActiveSyncMailboxPolicy '$PolicyName'" -ForegroundColor Gray } # ============================================================ # PODSUMOWANIE # ============================================================ Write-Host "`n=== PODSUMOWANIE ===" -ForegroundColor Cyan Write-Host "✓ Polityka mobilna: $PolicyName" -ForegroundColor Green Write-Host "✓ Reguła Allow: Outlook for iOS and Android" -ForegroundColor Green Write-Host "✓ Globalny blok: ActiveSync DefaultAccessLevel = Block" -ForegroundColor Green Write-Host "" Write-Host "Weryfikacja:" -ForegroundColor Yellow Write-Host " Get-MobileDeviceMailboxPolicy | Format-Table Name,AllowNonProvisionableDevices" Write-Host " Get-MobileDeviceAccessRule | Format-Table Name,Characteristic,QueryString,AccessLevel" } finally { Disconnect-ExchangeOnline -Confirm:$false Write-Verbose "Rozłączono z Exchange Online." }