Ogranicza dostęp mobilny do Exchange Online — zezwala tylko Outlook Mobile.

✉️ Exchange Online POWERSHELL ChrisTitusTech

Ogranicza dostęp mobilny do Exchange Online — zezwala tylko Outlook Mobile.

Pobierz .ps1

Opis

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)

📄 Restrict-EXOMobileAccess-Modern.ps1 🕒 2026-04-13 📦 Źródło: christitustech
Restrict-EXOMobileAccess-Modern.ps1
#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."
}