Задача всем пользователям сделать событие в календаре занят на целый день каждую среду в течении года. Сделал скрипт на PowerShell через ews. exchange 2016.
По умолчанию в exchange 2016 есть ews его ставить нет необходимости если скрипт запустить с самого сервера exchange. Путь «C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll
Если запускать с другого места надо установить ews
Install-Package Exchange.WebServices.Managed.Api
Путь C:\Program Files\PackageManagement\NuGet\Packages\Exchange.WebServices.Managed.Api.2.2.1.2\lib\net35
Добавить прав на exchange от кого будете запускать скрипт
Get-ManagementRoleAssignment -Role ApplicationImpersonation New-ManagementRoleAssignment –Name:ImpersonationAssignment –Role:ApplicationImpersonation –User:moskvichev@adminbd.ru
Сам скрипт
Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
# Учетные данные администратора
$AdminEmail = "moskvichev@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://mxs.adminbd.ru/EWS/Exchange.asmx")
# Список пользователей
#$Users = @("moskvichev@adminbd.ru")
$Users = Get-Mailbox -ResultSize Unlimited | Select-Object -ExpandProperty PrimarySmtpAddress
# $Users | measure | % { $_.Count }
# Параметры события
$Subject = "Занято весь день"
$startDate = (Get-Date).AddDays((3 - (Get-Date).DayOfWeek + 7) % 7) # Находим ближайшую среду
$startTime = $startDate.Date.AddHours(0) # 9:00 утра
$endTime = $startDate.Date.AddHours(6) # 18:00 вечера
$Body = "день тишины"
$Location = "Офис"
# Создание события для каждого пользователя
foreach ($User in $Users) {
# Установить impersonation для текущего пользователя
$Service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $User)
# Создание нового события
$Appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment($Service)
$Appointment.Subject = $Subject
#$Appointment.Start = $startTime
#$Appointment.End = $endTime
$Appointment.IsAllDayEvent = $true # Убираем флаг "весь день", так как время конкретно указано
$Appointment.Location = $Location
$Appointment.Body = $Body
# Настройка повторений
# Применение повторений к событию
$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)
}
При проблемах
# Учетные данные администратора
$AdminEmail = "moskvichev@adminbd.ru"
$Password = "pass"
$Creds = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials($AdminEmail, $Password)
$Service.TraceEnabled = $true
$Service.TraceFlags = [Microsoft.Exchange.WebServices.Data.TraceFlags]::All
$folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($Service, [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar)
Проверить типы
# Проверка доступности типов
[System.Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll")
# Получить типы из библиотеки
[AppDomain]::CurrentDomain.GetAssemblies() | ForEach-Object {
$_.GetTypes() | Where-Object { $_.FullName -like "*Recurrence*" } | Select-Object FullName
}
Similar Posts:
- Как исправить ошибку. 3адача сообщила об ошибке (0x80190194): Произошла неожиданная ошибка. Не обновляется адресная книга
- Как сделать автоматическую смену пароля у пользователя exchange и отправка нового пароля на email.
- Как отправлять через powershell пользователям письмо с просьбой о смене пароля т.к. срок пароля истекает.
- Как перевести сервер echange 2016 в состояния облуживания (Maintenance).
- Как исправить ошибку Database is mandatory on UserMailbox exchange.

