Перейти к содержимому

Как удалить встречу целый день у всех в календаре exchange

задача у всех удалить встречу созданную  ранее  

Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"

# ===== УЧЕТНЫЕ ДАННЫЕ =====
$AdminEmail = "mosk@adminbd.ru"
$Password = "pass"
$Creds = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($AdminEmail, $Password)

# ===== ПОДКЛЮЧЕНИЕ К EWS =====
$TimeZoneInfo = [System.TimeZoneInfo]::Utc
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2016, $TimeZoneInfo)
$Service.Credentials = $Creds
$Service.Url = New-Object Uri("https://mx.adminbd.ru/EWS/Exchange.asmx")

# ===== СПИСОК ПОЛЬЗОВАТЕЛЕЙ =====
#$Users = @("user")
# Для всех ящиков раскомментируйте:
 $Users = Get-Mailbox -ResultSize Unlimited -Filter {RecipientTypeDetails -ne "RoomMailbox"} | Where-Object { $_.Database -ne "Service" } | Select-Object -ExpandProperty PrimarySmtpAddress

# ===== ПАРАМЕТРЫ ПОИСКА =====
$Subject = "Занято весь день"
$startDate = (Get-Date).AddDays((3 - (Get-Date).DayOfWeek + 7) % 7)  # ближайшая среда
$searchStart = $startDate.Date.AddMonths(-1)
$searchEnd   = $startDate.Date.AddMonths(13)

# ===== ОСНОВНОЙ ЦИКЛ УДАЛЕНИЯ СЕРИЙ =====
foreach ($User in $Users) {
    Write-Host "Обработка: $User" -ForegroundColor Cyan
    $Service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $User)

    # Поиск вхождений в календаре (CalendarView возвращает вхождения)
    $calendarView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView($searchStart, $searchEnd, 100)
    $appointments = $Service.FindAppointments([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar, $calendarView)

    # Хэш для уникальных ID мастер-серий
    $seriesIds = @{}

    foreach ($appt in $appointments.Items) {
        if ($appt.Subject -eq $Subject) {
            try {
                # Получаем мастер-серию (родительское повторяющееся событие)
                $master = [Microsoft.Exchange.WebServices.Data.Appointment]::BindToRecurringMaster($Service, $appt.Id)
                if ($master -ne $null) {
                    $seriesId = $master.Id.UniqueId
                    if (-not $seriesIds.ContainsKey($seriesId)) {
                        $seriesIds[$seriesId] = $true
                    }
                }
                else {
                    # Если встретилось обычное (не повторяющееся) событие — удаляем его как есть
                    Write-Host "  Удаляем обычную встречу: $($appt.Subject) от $($appt.Start.ToShortDateString())" -ForegroundColor Magenta
                    $appt.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete)
                }
            }
            catch {
                Write-Host "  Ошибка при получении мастер-серии: $($_.Exception.Message)" -ForegroundColor Red
            }
        }
    }

    # Удаляем каждую найденную серию (один раз)
    foreach ($seriesId in $seriesIds.Keys) {
        try {
            Write-Host "  Удаляем всю серию события '$Subject'..." -ForegroundColor Magenta
            # Привязываемся к мастер-серии и удаляем её (все вхождения разом)
            $masterAppt = [Microsoft.Exchange.WebServices.Data.Appointment]::Bind($Service, $seriesId)
            $masterAppt.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete)
            Write-Host "  Серия успешно удалена." -ForegroundColor Green
        }
        catch {
            Write-Host "  Ошибка удаления серии: $($_.Exception.Message)" -ForegroundColor Red
        }
    }

    if ($seriesIds.Count -eq 0) {
        Write-Host "  Событий с темой '$Subject' не найдено." -ForegroundColor Yellow
    }
    else {
        Write-Host "  Всего удалено серий: $($seriesIds.Count)" -ForegroundColor Green
    }
}

Write-Host "Готово." -ForegroundColor White

 

Similar Posts:

Метки:

Добавить комментарий

Яндекс.Метрика