Wróć do bloga Microsoft 365

Zmiana organizatora spotkania w Microsoft 365 – PowerShell krok po kroku

12 min czytania
Zmiana organizatora spotkania

Zmiana organizatora spotkania w Microsoft 365 jest możliwa bez anulowania każdego wydarzenia ręcznie. Administrator Exchange Online może użyć polecenia Invoke-ChangeMeetingOrganizer, a przy większej liczbie spotkań połączyć je z Microsoft Graph i PowerShell. W tym poradniku pokazujemy pełny proces: od przygotowania aplikacji w Microsoft Entra ID, przez bezpieczny podgląd zmian, po masowe przeniesienie przyszłych spotkań do nowego organizatora.

Typowy scenariusz to odejście pracownika, zmiana właściciela cyklicznych spotkań projektowych albo przekazanie odpowiedzialności za kalendarz. Mechanizm dotyczy Exchange Online i powinien być wykonany przez administratora po wcześniejszym przeglądzie listy wydarzeń.

Najważniejsze informacje przed rozpoczęciem

  • Invoke-ChangeMeetingOrganizer działa wyłącznie w Exchange Online.
  • Można przenosić spotkania z domyślnego kalendarza użytkownika.
  • Nowy organizator musi być użytkownikiem w tej samej organizacji Exchange Online.
  • Nie można przenosić spotkań ze skrzynek współdzielonych ani skrzynek grup Microsoft 365.
  • W przypadku serii cyklicznej zmiana obejmuje przyszłe wystąpienia: od najbliższego terminu albo od podanej przyszłej daty.
  • Poprzedni organizator nie jest automatycznie dodawany jako uczestnik. Jeśli nadal ma brać udział w spotkaniu, nowy organizator musi go zaprosić.
  • Spotkanie kalendarzowe i spotkanie online Teams to dwa powiązane, ale odrębne elementy. Polecenie nie zmienia organizatora części online w Microsoft Teams.

Pełną listę zachowań i ograniczeń Microsoft publikuje w dokumentacji polecenia Invoke-ChangeMeetingOrganizer.

Ważne: po przeniesieniu spotkania Teams nowy właściciel wydarzenia nie staje się automatycznie organizatorem spotkania online. Trzeba otworzyć przeniesioną serię i utworzyć nowe informacje spotkania Teams. W przeciwnym razie nowy organizator może nie mieć kontroli nad nagraniami, transkrypcją, opcjami spotkania i innymi artefaktami.

Co dzieje się po zmianie organizatora?

ElementZachowanie po transferze
Uczestnicy wewnętrzniWydarzenie jest aktualizowane po cichu. Uczestnicy z tej samej organizacji Exchange Online nie muszą ponownie odpowiadać na zaproszenie.
Uczestnicy zewnętrzni i hybrydowiOtrzymują zakończenie starej serii oraz nowe zaproszenie. Muszą ponownie potwierdzić udział.
Ustawienia lokalne uczestnikówDla uczestników wewnętrznych pozostają m.in. przypomnienie, kategoria, status dostępności i oznaczenie prywatności.
Spotkanie TeamsOrganizator części online nie zmienia się. Nowy organizator powinien wygenerować nowe informacje spotkania Teams.
Załączniki i łącza OneDriveUprawnienia nie są automatycznie przenoszone. Załączniki lub łącza mogą wymagać ponownego dodania.
Poprzedni organizatorNie zostaje automatycznie uczestnikiem przeniesionego spotkania.

Kiedy wystarczy pojedyncze polecenie?

Jeżeli znasz temat wydarzenia i w kalendarzu występuje tylko jedno spotkanie o takiej nazwie, możesz użyć parametru -Subject. Najpierw wykonaj symulację:

Invoke-ChangeMeetingOrganizer `
    -Identity "stary.organizator@contoso.com" `
    -Subject "Cotygodniowy status projektu" `
    -NewOrganizer "nowy.organizator@contoso.com" `
    -WhatIf

Po sprawdzeniu wyniku usuń -WhatIf i uruchom polecenie ponownie. Jeżeli kilka wydarzeń ma identyczny temat, Exchange Online zwróci listę dopasowań. Wtedy użyj identyfikatora właściwego wydarzenia:

Invoke-ChangeMeetingOrganizer `
    -Identity "stary.organizator@contoso.com" `
    -EventId "AAMkAG..." `
    -NewOrganizer "nowy.organizator@contoso.com" `
    -WhatIf

Dla pojedynczego spotkania temat może być wygodny, ale nie jest dobrym kluczem dla operacji masowej. Tematy mogą się powtarzać, dlatego w dalszej części pobieramy identyfikatory wydarzeń z Microsoft Graph.

Masowa zmiana organizatora spotkań: architektura rozwiązania

Proces wykorzystuje dwa interfejsy administracyjne:

  1. Microsoft Graph odczytuje przyszłe wystąpienia, wyjątki i pojedyncze wydarzenia z domyślnego kalendarza użytkownika.
  2. Exchange Online PowerShell wykonuje zmianę organizatora dla każdego unikalnego spotkania lub wzorca serii.

Do odczytu użyjemy Get-MgUserCalendarView. Widok kalendarza zwraca pojedyncze wydarzenia, wystąpienia serii i wyjątki w określonym przedziale czasu. Jest to istotne, ponieważ seria mogła rozpocząć się w przeszłości, ale nadal mieć przyszłe wystąpienia. Zwykłe filtrowanie listy wydarzeń wyłącznie po dacie rozpoczęcia mogłoby taką serię pominąć. Microsoft opisuje semantykę zakresu czasu w dokumentacji calendarView.

Krok 1. Przygotuj PowerShell i moduły

Zalecamy PowerShell 7. Zainstaluj moduł Exchange Online Management oraz tylko potrzebne moduły Microsoft Graph:

Install-Module ExchangeOnlineManagement -Scope CurrentUser
Install-Module Microsoft.Graph.Authentication -Scope CurrentUser
Install-Module Microsoft.Graph.Calendar -Scope CurrentUser

Jeżeli moduły są już zainstalowane, zaktualizuj je i sprawdź wersje:

Update-Module ExchangeOnlineManagement
Update-Module Microsoft.Graph.Authentication
Update-Module Microsoft.Graph.Calendar

Get-InstalledModule ExchangeOnlineManagement, Microsoft.Graph.Authentication, Microsoft.Graph.Calendar

Na dzień publikacji warto używać Exchange Online Management 3.10.1 lub nowszego. Microsoft opisuje wymagania połączeń bezobsługowych w instrukcji uwierzytelniania app-only w Exchange Online PowerShell. Instrukcję instalacji Graph znajdziesz w dokumentacji Microsoft Graph PowerShell SDK.

Krok 2. Zarejestruj aplikację w Microsoft Entra ID

  1. Otwórz centrum administracyjne Microsoft Entra.
  2. Przejdź do Identity > Applications > App registrations.
  3. Wybierz New registration.
  4. Ustaw nazwę, np. Meeting Organizer Transfer.
  5. Wybierz konta tylko z bieżącej organizacji, czyli aplikację single-tenant.
  6. Nie konfiguruj Redirect URI.
  7. Zapisz Application (client) ID i Directory (tenant) ID.

Ten sam obiekt aplikacji może posłużyć do połączenia z Microsoft Graph i Exchange Online.

Krok 3. Nadaj wymagane uprawnienia aplikacji

W sekcji API permissions dodaj uprawnienia typu Application:

Interfejs APIUprawnienieZastosowanie
Microsoft GraphCalendars.ReadOdczyt przyszłych wydarzeń i identyfikatorów z kalendarza źródłowego.
Office 365 Exchange OnlineExchange.ManageAsAppBezobsługowe połączenie z Exchange Online PowerShell.

Następnie wybierz Grant admin consent. Skrypt nie potrzebuje Calendars.ReadWrite, ponieważ Microsoft Graph służy w nim wyłącznie do odczytu. Sam transfer wykonuje Exchange Online.

Uwaga bezpieczeństwa: aplikacyjne Calendars.Read daje dostęp do kalendarzy w całej organizacji. W środowisku produkcyjnym ogranicz zakres aplikacji do wymaganych skrzynek przy użyciu RBAC for Applications w Exchange Online. Uprawnienia nieskopowane i przypisania RBAC są oceniane niezależnie. Jeżeli przechodzisz na skopowaną rolę aplikacyjną, nie pozostawiaj równolegle tenantowego uprawnienia Calendars.Read, bo nadal zapewniałoby ono dostęp nieskopowany.

Krok 4. Utwórz i przypisz certyfikat

Do automatyzacji nie zapisuj loginu i hasła administratora. Użyj certyfikatu. Na komputerze z Windows uruchom PowerShell jako administrator:

$cert = New-SelfSignedCertificate `
    -DnsName "meeting-transfer.nodeit.local" `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -NotAfter (Get-Date).AddYears(1) `
    -KeySpec KeyExchange

Export-Certificate `
    -Cert $cert `
    -FilePath ".\meeting-transfer.cer"

$cert.Thumbprint
  1. W rejestracji aplikacji otwórz Certificates & secrets.
  2. Wybierz Certificates > Upload certificate.
  3. Prześlij plik meeting-transfer.cer.
  4. Zapisz odcisk certyfikatu. Prywatny klucz pozostaje na komputerze, z którego będzie uruchamiany skrypt.

Microsoft publikuje szczegółową instrukcję tworzenia certyfikatu do uwierzytelniania aplikacji. W automatyzacji produkcyjnej zabezpiecz klucz prywatny, zaplanuj rotację certyfikatu i monitoruj datę jego wygaśnięcia.

Krok 5. Nadaj aplikacji rolę w Exchange Online

Samo Exchange.ManageAsApp umożliwia uzyskanie tokenu, ale aplikacja potrzebuje również roli pozwalającej uruchomić właściwe polecenie Exchange. Najprostsza konfiguracja testowa to przypisanie jednostce usługi roli Exchange Administrator. Nie używaj roli Global Administrator do tego zadania.

W produkcji zastosuj zasadę najmniejszych uprawnień: podczas konfiguracji połącz się interaktywnie kontem administratora Exchange, sprawdź, która rola zawiera polecenie Invoke-ChangeMeetingOrganizer, a następnie przygotuj ograniczone przypisanie. Microsoft pokazuje sposób identyfikowania ról w poradniku Find the permissions required to run any Exchange cmdlet.

Get-ManagementRole -Cmdlet Invoke-ChangeMeetingOrganizer

Krok 6. Sprawdź połączenia i dostępność polecenia

Uzupełnij identyfikatory własnej organizacji:

$TenantId = "00000000-0000-0000-0000-000000000000"
$AppId = "11111111-1111-1111-1111-111111111111"
$CertificateThumbprint = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
$Organization = "contoso.onmicrosoft.com"

Connect-MgGraph `
    -TenantId $TenantId `
    -ClientId $AppId `
    -CertificateThumbprint $CertificateThumbprint `
    -NoWelcome

Connect-ExchangeOnline `
    -Organization $Organization `
    -AppId $AppId `
    -CertificateThumbprint $CertificateThumbprint `
    -ShowBanner:$false

Get-MgContext
Get-Command Invoke-ChangeMeetingOrganizer

Składnię połączenia certyfikatem dla Microsoft Graph opisuje dokumentacja Connect-MgGraph. Dla parametru -Organization użyj podstawowej domeny tenantowej zakończonej na .onmicrosoft.com.

Jeżeli polecenie zwróci później błąd Transfer meeting action is disabled, funkcja nie jest jeszcze aktywna w danej organizacji. Nie próbuj zastępować jej ręcznym kopiowaniem elementów kalendarza, ponieważ kopia nie zachowuje pełnej semantyki organizatora i odpowiedzi uczestników.

Krok 7. Uruchom skrypt inwentaryzacyjny bez zmian

Poniższy skrypt domyślnie działa w trybie podglądu. Pobiera wydarzenia z określonego okna czasu, pozostawia tylko spotkania organizowane przez skrzynkę źródłową, pomija anulowane zdarzenia i terminy bez uczestników, a wystąpienia cykliczne grupuje według identyfikatora wzorca serii.

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$SourceMailbox,

    [Parameter(Mandatory)]
    [string]$TargetMailbox,

    [Parameter(Mandatory)]
    [datetime]$TransferFrom,

    [datetime]$ScanUntil = (Get-Date).AddYears(2),

    [Parameter(Mandatory)]
    [string]$TenantId,

    [Parameter(Mandatory)]
    [string]$AppId,

    [Parameter(Mandatory)]
    [string]$CertificateThumbprint,

    [Parameter(Mandatory)]
    [string]$Organization,

    [switch]$Execute,

    [string]$ReportPath = ".\MeetingOrganizerTransfer-$(Get-Date -Format 'yyyyMMdd-HHmmss').csv"
)

$ErrorActionPreference = 'Stop'

if ($TransferFrom -le (Get-Date)) {
    throw 'TransferFrom musi wskazywać datę w przyszłości.'
}

if ($ScanUntil -le $TransferFrom) {
    throw 'ScanUntil musi być późniejsze niż TransferFrom.'
}

Import-Module ExchangeOnlineManagement
Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Calendar

Connect-MgGraph `
    -TenantId $TenantId `
    -ClientId $AppId `
    -CertificateThumbprint $CertificateThumbprint `
    -NoWelcome

Connect-ExchangeOnline `
    -Organization $Organization `
    -AppId $AppId `
    -CertificateThumbprint $CertificateThumbprint `
    -ShowBanner:$false

try {
    $source = Get-EXOMailbox -Identity $SourceMailbox `
        -Properties RecipientTypeDetails, ExternalDirectoryObjectId, PrimarySmtpAddress

    $target = Get-EXOMailbox -Identity $TargetMailbox `
        -Properties RecipientTypeDetails, ExternalDirectoryObjectId, PrimarySmtpAddress

    if ($source.RecipientTypeDetails -ne 'UserMailbox') {
        throw "Skrzynka źródłowa nie jest typu UserMailbox: $SourceMailbox"
    }

    if ($target.RecipientTypeDetails -ne 'UserMailbox') {
        throw "Skrzynka docelowa nie jest typu UserMailbox: $TargetMailbox"
    }

    $startIso = $TransferFrom.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
    $endIso = $ScanUntil.ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')

    $properties = @(
        'id', 'subject', 'type', 'seriesMasterId', 'isOrganizer',
        'isCancelled', 'isOnlineMeeting', 'onlineMeetingProvider',
        'start', 'end', 'attendees'
    )

    [array]$calendarView = Get-MgUserCalendarView `
        -UserId $source.ExternalDirectoryObjectId `
        -StartDateTime $startIso `
        -EndDateTime $endIso `
        -Property $properties `
        -All

    $transferMap = @{}

    foreach ($event in $calendarView) {
        if ($event.IsCancelled -or -not $event.IsOrganizer) {
            continue
        }

        if (-not $event.Attendees -or $event.Attendees.Count -eq 0) {
            continue
        }

        $eventType = $event.Type.ToString()
        $isSeries = $eventType -in @('Occurrence', 'Exception')

        if ($isSeries) {
            $transferEventId = $event.SeriesMasterId
        }
        else {
            $transferEventId = $event.Id
        }

        if ([string]::IsNullOrWhiteSpace($transferEventId)) {
            continue
        }

        if (-not $transferMap.ContainsKey($transferEventId)) {
            $transferMap[$transferEventId] = [pscustomobject]@{
                EventId          = $transferEventId
                Subject          = $event.Subject
                EventType        = $(if ($isSeries) { 'Series' } else { 'Single' })
                FirstSeenStart   = $event.Start.DateTime
                IsTeamsMeeting   = $event.IsOnlineMeeting
                OnlineProvider   = $event.OnlineMeetingProvider
                Status           = $(if ($Execute) { 'Pending' } else { 'Preview' })
                Error            = $null
            }
        }
    }

    [array]$items = $transferMap.Values | Sort-Object FirstSeenStart, Subject

    if ($items.Count -eq 0) {
        Write-Warning 'Nie znaleziono spotkań spełniających warunki.'
    }

    foreach ($item in $items) {
        if (-not $Execute) {
            continue
        }

        try {
            $parameters = @{
                Identity     = $source.PrimarySmtpAddress.ToString()
                EventId      = $item.EventId
                NewOrganizer = $target.PrimarySmtpAddress.ToString()
                Confirm      = $false
                ErrorAction  = 'Stop'
            }

            if ($item.EventType -eq 'Series') {
                $parameters.TransferSeriesStartDate = $TransferFrom
            }

            Invoke-ChangeMeetingOrganizer @parameters
            $item.Status = 'Transferred'
        }
        catch {
            $item.Status = 'Failed'
            $item.Error = $_.Exception.Message
        }

        Start-Sleep -Seconds 1
    }

    $items | Export-Csv -Path $ReportPath -NoTypeInformation -Encoding utf8
    $items | Format-Table Subject, EventType, FirstSeenStart, IsTeamsMeeting, Status -AutoSize

    Write-Host "Raport zapisano w: $ReportPath"
    if (-not $Execute) {
        Write-Host 'To był podgląd. Po weryfikacji uruchom skrypt ponownie z parametrem -Execute.'
    }
}
finally {
    Disconnect-ExchangeOnline -Confirm:$false -ErrorAction SilentlyContinue
    Disconnect-MgGraph -ErrorAction SilentlyContinue
}

Zapisz kod jako Move-M365MeetingOrganizer.ps1 i uruchom bez przełącznika -Execute:

.\Move-M365MeetingOrganizer.ps1 `
    -SourceMailbox "anna@contoso.com" `
    -TargetMailbox "piotr@contoso.com" `
    -TransferFrom "2026-08-17 00:00:00" `
    -ScanUntil "2028-08-17 00:00:00" `
    -TenantId "00000000-0000-0000-0000-000000000000" `
    -AppId "11111111-1111-1111-1111-111111111111" `
    -CertificateThumbprint "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" `
    -Organization "contoso.onmicrosoft.com"

ScanUntil wyznacza horyzont wyszukiwania. Spotkanie pojedyncze poza tym zakresem nie trafi do raportu. Dla serii cyklicznej wystarczy, że co najmniej jedno przyszłe wystąpienie znajdzie się w oknie; skrypt rozpozna wzorzec serii, a Exchange przeniesie przyszłą część serii od TransferFrom.

Krok 8. Zweryfikuj raport przed transferem

Otwórz plik CSV i sprawdź co najmniej:

  • czy skrzynka źródłowa i docelowa są właściwe;
  • czy data rozpoczęcia transferu jest zgodna z procesem odejścia lub przekazania obowiązków;
  • czy horyzont wyszukiwania obejmuje wszystkie spotkania jednorazowe;
  • czy lista nie zawiera spotkań, które powinny pozostać u starego organizatora;
  • które pozycje są spotkaniami Teams i będą wymagały dodatkowej obsługi;
  • czy w kalendarzu nie ma poufnych wydarzeń wymagających zgody właściciela procesu lub działu HR.

W większej organizacji warto potraktować CSV jako dokument akceptacyjny i dodać do procesu offboardingu. Jeśli każde spotkanie ma trafić do innej osoby, rozszerz raport o kolumnę TargetMailbox i zatwierdź mapowanie przed uruchomieniem. Przy bardziej złożonych migracjach kalendarzy pomocne jest wsparcie w ramach projektów, wdrożeń i migracji IT.

Krok 9. Wykonaj masową zmianę organizatora

Po zaakceptowaniu raportu uruchom dokładnie to samo polecenie z parametrem -Execute:

.\Move-M365MeetingOrganizer.ps1 `
    -SourceMailbox "anna@contoso.com" `
    -TargetMailbox "piotr@contoso.com" `
    -TransferFrom "2026-08-17 00:00:00" `
    -ScanUntil "2028-08-17 00:00:00" `
    -TenantId "00000000-0000-0000-0000-000000000000" `
    -AppId "11111111-1111-1111-1111-111111111111" `
    -CertificateThumbprint "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" `
    -Organization "contoso.onmicrosoft.com" `
    -Execute

Skrypt zapisze status Transferred albo Failed dla każdej pozycji. Jednosekundowa przerwa pomiędzy zmianami ogranicza tempo operacji, ale nie gwarantuje braku throttlingu. Dla dużych tenantów dodaj ponawianie z rosnącym opóźnieniem i przetwarzaj kontrolowane partie.

Krok 10. Wykonaj kontrolę po migracji

  1. Zaloguj się do kalendarza nowego organizatora i potwierdź obecność przeniesionych spotkań.
  2. Sprawdź kilka spotkań jednorazowych i co najmniej jedną serię cykliczną.
  3. Zweryfikuj listy uczestników, wyjątki serii i terminy.
  4. Dla każdej pozycji oznaczonej w raporcie jako spotkanie online otwórz serię i utwórz nowe informacje spotkania Teams.
  5. Sprawdź dostęp do załączników oraz łączy OneDrive. W razie potrzeby dodaj pliki ponownie z lokalizacji należącej do nowego organizatora.
  6. Jeżeli poprzedni organizator nadal ma uczestniczyć, dodaj go ręcznie.
  7. Sprawdź komunikację dla uczestników zewnętrznych, którzy otrzymają nowe zaproszenie i muszą ponownie odpowiedzieć.
  8. Zachowaj raport CSV w dokumentacji zmiany.

Najczęstsze błędy i ich przyczyny

ObjawPrawdopodobna przyczynaCo sprawdzić
Transfer meeting action is disabledFunkcja nie jest jeszcze aktywna w organizacji.Dostępność polecenia i komunikaty centrum administracyjnego Microsoft 365.
Brak polecenia Invoke-ChangeMeetingOrganizerStary moduł lub brak właściwej sesji Exchange Online.Wersję ExchangeOnlineManagement, ponowne połączenie oraz Get-Command.
Access deniedBrak zgody administratora, roli Exchange albo dostępu aplikacji do skrzynki.Exchange.ManageAsApp, rolę jednostki usługi i zakres RBAC.
Graph zwraca 403Brak aplikacyjnego uprawnienia do kalendarza lub błędny zakres.Calendars.Read, admin consent i konfigurację Application RBAC.
Seria nie została znalezionaOkno ScanUntil nie obejmuje żadnego przyszłego wystąpienia.Poszerz horyzont wyszukiwania.
Nowy organizator nie zarządza spotkaniem TeamsOczekiwane ograniczenie mechanizmu.Wygeneruj nowe informacje spotkania Teams w przeniesionej serii.
Nie działa dla skrzynki współdzielonejTen typ skrzynki nie jest obsługiwany.Dodaj właściwej osobie dostęp do skrzynki zamiast transferować organizatora.

Czy warto automatyzować ten proces?

Tak, jeżeli organizacja regularnie przekazuje obowiązki między pracownikami. Skrypt powinien jednak być częścią kontrolowanego procesu, a nie jednorazowym poleceniem uruchamianym bez raportu. Najbezpieczniejszy model obejmuje inwentaryzację, akceptację właściciela biznesowego, transfer, kontrolę spotkań Teams oraz zachowanie dziennika zmian.

Jeżeli potrzebujesz pomocy w uporządkowaniu kalendarzy, uprawnień i automatyzacji, sprawdź usługi Microsoft 365 w NodeIT oraz administrację systemami IT. W przypadku konkretnej migracji możesz też skontaktować się z NodeIT.

FAQ: zmiana organizatora spotkania w Microsoft 365

Czy można zmienić organizatora istniejącego spotkania Teams?

Można zmienić organizatora wydarzenia w kalendarzu Exchange Online, ale nie organizatora powiązanego spotkania online Teams. Nowy organizator powinien otworzyć przeniesione wydarzenie i utworzyć nowe informacje spotkania Teams.

Czy uczestnicy muszą ponownie zaakceptować zaproszenie?

Uczestnicy z tej samej organizacji Exchange Online nie muszą ponownie odpowiadać. Uczestnicy zewnętrzni oraz użytkownicy ze skrzynkami lokalnymi w środowisku hybrydowym otrzymają zakończenie starego spotkania i nowe zaproszenie, na które muszą odpowiedzieć.

Czy można przenieść cykliczną serię spotkań?

Tak. Parametr -TransferSeriesStartDate pozwala wskazać przyszłą datę rozpoczęcia transferu. Wystąpienia sprzed tej daty pozostają w kalendarzu poprzedniego organizatora.

Czy można zmienić organizatora spotkania w skrzynce współdzielonej?

Nie. Polecenie nie obsługuje skrzynek współdzielonych ani skrzynek grup Microsoft 365. Microsoft zaleca zamiast tego przyznanie nowemu użytkownikowi dostępu do odpowiedniej skrzynki.

Czy poprzedni organizator pozostaje uczestnikiem?

Nie. Po transferze poprzedni organizator nie jest automatycznie dodawany do listy uczestników. Nowy organizator może zaprosić go ręcznie.

Czy da się cofnąć zmianę organizatora?

Nie istnieje prosty mechanizm „undo”. Nie można ponownie przenieść części serii, która pozostała w kalendarzu pierwotnego organizatora. Można natomiast przenieść przyszłe wystąpienia z kalendarza nowego organizatora z powrotem albo do kolejnej osoby.

Dlaczego potrzebny jest Microsoft Graph?

Samo polecenie Exchange Online przenosi wskazane spotkanie, ale nie służy do pełnej inwentaryzacji kalendarza. Microsoft Graph pozwala pobrać przyszłe wydarzenia, rozróżnić pojedyncze spotkania i wystąpienia serii oraz uzyskać ich identyfikatory.

Czy skrypt przenosi wszystkie spotkania bez ograniczenia czasowego?

Nie. Microsoft Graph wymaga określenia końca widoku kalendarza. Parametr ScanUntil wyznacza horyzont wyszukiwania. Należy go ustawić tak, aby objąć wszystkie przyszłe spotkania jednorazowe, które mają zostać przeniesione.

Dokumentacja Microsoft