As time goes by scripts get updated. Here is an updated version of my old () which was originally written for Exchange 2010 under Server 2008.
$inputfile = "C:\Input\<mycalendarfile.csv" $Webservices = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll" $baseOU = "OU=Domain Users,DC=liquidobject,DC=com" #Need to update each year, in the event we need to pull entries we can search of it potentially $myyears = "2017-2018" #If we need to run the once per year everyone run, set this to true $YearlyRun = $false #Testing mode options $testmode = $false $testuser = "mytestaccount" ####################### End Options ######################## if(!(Get-Module | where {$_.Name -eq "ActiveDirectory"})){Import-Module ActiveDirectory} if(!(Get-PSSnapin -Name "Microsoft.Exchange.Management.PowerShell.E2010" -ErrorAction SilentlyContinue)){Add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010} if(!(Get-PSSnapin -Name "Microsoft.Exchange.Management.PowerShell.support" -ErrorAction SilentlyContinue)){Add-pssnapin Microsoft.Exchange.Management.PowerShell.support} if(!(Test-Path $Webservices)) { Write-Host "`n`nExchange Web Services API is required and is not installed`nhttp://www.microsoft.com/en-us/download/details.aspx?id=28952`n" Exit } if(!(Test-Path $inputfile)) { Write-Host "`n`nInput file of: $inputfile is missing, cannot proceed without this file.`n`n" Exit } Write-Host "`nEWS Web Services - Loading" Add-Type -Path $Webservices Write-Host "EWS Web Services API - Loaded`n" function New-CalendarItem { [CmdletBinding()] param( [Parameter(Position=1, Mandatory=$true)]$CalendarUser, [Parameter(Position=2, Mandatory=$true)]$Subject, [Parameter(Position=3, Mandatory=$true)]$Date ) $sid = (Get-ADUser -Identity $CalendarUser).SID $user = [ADSI]"LDAP://<SID=$sid>" $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService -ArgumentList ([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1) $service.AutodiscoverUrl($user.Properties.mail) $Impersonate = (Get-Mailbox -Identity $calendaruser).PrimarySMTPAddress $ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId -ArgumentList ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress),$Impersonate $service.ImpersonatedUserId = $ImpersonatedUserId $appointment = New-Object Microsoft.Exchange.WebServices.Data.Appointment -ArgumentList $service $appointment.Subject = $Subject $startdate = Get-Date($Date) $appointment.Start = $startdate $enddate = (Get-Date($Date)).adddays(1) $appointment.End = $enddate $appointment.body = "Calendar Automation " + $myyears $appointment.LegacyFreeBusyStatus = "Free" $appointment.IsAllDayEvent = $true $appointment.IsReminderSet = $False $appointment.Save([Microsoft.Exchange.WebServices.Data.SendInvitationsMode]::SendToNone) $appointment = $null sleep 0.2 } $mydata = Import-Csv $inputfile Write-Host "Preparing to process" $mydata.count "calendar entries`n" if($YearlyRun) { $myusers = Get-ADuser -Filter {(mail -like "*") -and (ObjectClass -eq "user") -and (Enabled -eq $true)} -SearchBase $baseOU -Properties created | Select-Object samaccountname, created } else { $mydays = (Get-Date).Adddays(-7) $myusers = Get-ADuser -Filter {(mail -like "*") -and (ObjectClass -eq "user") -and (Created -gt $mydays) -and (Enabled -eq $true)} -SearchBase $baseOU -Properties created | Select-Object samaccountname, created } $myusers = $myusers | Sort-Object samaccountname if($testmode) { $myusers = @{"samAccountName"=$testuser} } $today = Get-Date $mycount = $myusers.count $currentpos = 1 foreach($i in $myusers) { Write-Host "Loading $currentpos of $mycount for:" $i.samaccountname foreach($entry in $mydata) { if($today -lt $entry.date) { #Write-Host $entry.date " - " $entry.Subject New-CalendarItem -CalendarUser $i.samaccountname -Subject $entry.Subject -date $entry.date sleep 0.2 } else { if($YearlyRun) #only load past dates on the yearly run { New-CalendarItem -CalendarUser $i.samaccountname -Subject $entry.Subject -date $entry.date sleep 0.2 } } sleep 0.1 } $currentpos++ sleep 1.2 }