второй вариант с проверкой у кого уже есть событие не добавляет и так же у новых отключает уведомление.
Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
# Учетные данные администратора
$AdminEmail = "moskv@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")
# ===== СПИСОК ПОЛЬЗОВАТЕЛЕЙ =====
# Вариант 1: вручную заданные адреса (активен по умолчанию)
$Users = @("user@adminbd.ru")
# Вариант 2: все почтовые ящики организации (раскомментируйте, закомментировав вариант 1)
# $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) # ближайшая среда
$startTime = $startDate.Date.AddHours(0) # 00:00 (для целодневного не критично)
$Body = "Среда - день тишины"
$Location = "Офис"
# ===== ОСНОВНОЙ ЦИКЛ =====
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)
# --- Проверка наличия события "Занято весь день" на ближайшую среду ---
$startRange = $startDate.Date
$endRange = $startDate.Date.AddDays(1) # проверяем только первый день (среду)
$calendarView = New-Object Microsoft.Exchange.WebServices.Data.CalendarView($startRange, $endRange, 100)
$appointments = $Service.FindAppointments([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar, $calendarView)
$alreadyExists = $false
foreach ($appt in $appointments.Items) {
if ($appt.Subject -eq $Subject) {
$alreadyExists = $true
break
}
}
if ($alreadyExists) {
Write-Host " У пользователя $User уже есть событие '$Subject' на $($startDate.ToShortDateString()). Пропускаем." -ForegroundColor Yellow
continue
}
# --- Создание нового события ---
$Appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment($Service)
$Appointment.Subject = $Subject
$Appointment.IsAllDayEvent = $true
$Appointment.Location = $Location
$Appointment.Body = $Body
$Appointment.IsReminderSet = $false # отключаем напоминание
# Настройка повторения: каждая среда в течение 12 месяцев
$Appointment.Recurrence = New-Object Microsoft.Exchange.WebServices.Data.Recurrence+WeeklyPattern(($startTime), 1, [Microsoft.Exchange.WebServices.Data.DayOfTheWeek]::Wednesday)
$Appointment.Recurrence.EndDate = $startTime.AddMonths(12)
# Сохранение без отправки приглашений
$Appointment.Save([Microsoft.Exchange.WebServices.Data.SendInvitationsMode]::SendToNone)
Write-Host " Создано повторяющееся событие '$Subject' для $User" -ForegroundColor Green
}
Write-Host "Готово." -ForegroundColor White
Similar Posts:
- Как добавить всем пользователем событие на целый день в календаре exchange 2016 через EWS.
- Как сделать автоматическую смену пароля у пользователя exchange и отправка нового пароля на email.
- Как отправлять через powershell пользователям письмо с просьбой о смене пароля т.к. срок пароля истекает.
- Как сделать скрипт для архивировании почты exchange перед удаление учетной записи.
- Как сделать скрипт для отключения учетных записей пользователей с просроченными паролями.