Almost there! I am running it against my mailbox; and getting the results I want... YAY!! I modified the script a little, and I added $appointment.datetimecreated.
I'm trying to get it in an array to export to Excel next. Thank you again, Michael!! On Thu, Oct 23, 2014 at 10:30 AM, Candee <[email protected]> wrote: > Thank you so much! > I am trying this now! > > > On Thu, Oct 23, 2014 at 10:26 AM, Michael B. Smith <[email protected]> > wrote: > >> Here is some info about paging a calendar view: >> >> >> >> >> http://stackoverflow.com/questions/11999781/how-to-do-paging-with-exchange-web-services-calendarview >> >> >> >> And here is where you d/l the most recent EWS managed API (2.2): >> >> >> >> http://www.microsoft.com/en-us/download/details.aspx?id=42951 >> >> >> >> >> >> *From:* [email protected] [mailto: >> [email protected]] *On Behalf Of *Michael B. Smith >> *Sent:* Thursday, October 23, 2014 9:58 AM >> *To:* [email protected] >> *Subject:* RE: [Exchange] Re: Powershell help >> >> >> >> OK. Dealing with calendars is a little odd. >> >> A single “view” of a calendar cannot exceed 2 years, nor can it contain >> more than 1,000 items. The code below supports only that single view. >> >> If you want to go back further (or forward further), then you start >> “paging”, i.e., go a month at a time or a week at a time. You still have >> that 1,000 item limit to deal with. >> >> To open a user’s calendar requires that you have: [a] full control, [b] >> receive-as, or [c] impersonation privileges. The easiest thing to do is to >> give yourself (or a service account) receive-as on the relevant mailbox >> databases. Run this script under that service account. >> >> I sanitized this rather quickly from a much larger script. It seems to >> work for me, but it isn’t my prettiest work. Note that it outputs “objects” >> so you can search and manipulate the objects as you would expect from any >> PowerShell solution. >> >> >> >> Enjoy. >> >> >> >> param >> >> ( >> >> [DateTime]$StartDate = ( Get-Date -Year 1970 -Month 1 >> -Day 1 -Hour 8 -Minute 0 -Second 0 ), >> >> [DateTime]$EndDate = ( Get-Date ), >> >> [bool]$useDefaultCredentials = $true, >> >> [string]$ewsURL = 'https://server2/ews/exchange.asmx' >> >> ) >> >> >> >> Set-StrictMode -Version 2.0 >> >> >> >> function Connect-EWS >> >> { >> >> ## Load EWS Managed API >> >> Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web >> Services\2.2\Microsoft.Exchange.WebServices.dll" >> >> >> >> ## Set minimum EWS managed API Version >> >> $Version = >> [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2 >> >> >> >> ## Create Exchange Service Object >> >> $script:service = New-Object >> Microsoft.Exchange.WebServices.Data.ExchangeService( $Version ) >> >> >> >> if( $service -eq $null ) >> >> { >> >> throw $error[ 0 ] >> >> } >> >> >> >> if( $useDefaultCredentials ) >> >> { >> >> $script:service.useDefaultCredentials = >> $true >> >> } >> >> else >> >> { >> >> ## FIXME >> >> ## $service.Credentials = ???? >> >> } >> >> >> >> ## define a couple of well-known folders >> >> $script:wkf_Inbox = >> [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox >> >> $script:wkf_Calendar = >> [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar >> >> } >> >> >> >> function Set-myCertificatePolicy >> >> { >> >> ## Choose to ignore any SSL Warning issues caused by Self >> Signed Certificates >> >> >> >> ## Code From http://poshcode.org/624 >> >> ## Create a compilation environment >> >> $Provider = New-Object Microsoft.CSharp.CSharpCodeProvider >> >> $Compiler = $Provider.CreateCompiler() >> >> $Params = New-Object >> System.CodeDom.Compiler.CompilerParameters >> >> >> >> $Params.GenerateExecutable = $false >> >> $Params.GenerateInMemory = $true >> >> $Params.IncludeDebugInformation = $false >> >> >> >> $Params.ReferencedAssemblies.Add( 'System.DLL' ) | >> Out-Null >> >> >> >> $TASource = @' >> >> namespace Local.CertificatePolicy >> >> { >> >> public class TrustAll : >> System.Net.ICertificatePolicy >> >> { >> >> public >> TrustAll() >> >> { >> >> } >> >> public >> bool CheckValidationResult( >> >> >> System.Net.ServicePoint sp, >> >> >> System.Security.Cryptography.X509Certificates.X509Certificate cert, >> >> >> System.Net.WebRequest req, >> >> >> int problem) >> >> { >> >> >> return true; >> >> } >> >> } >> >> } >> >> '@ >> >> $TAResults = $Provider.CompileAssemblyFromSource( >> $Params, $TASource ) >> >> $TAAssembly = $TAResults.CompiledAssembly >> >> >> >> ## We now create an instance of the TrustAll and attach >> it to the ServicePointManager >> >> $script:TrustAll = $TAAssembly.CreateInstance( >> 'Local.CertificatePolicy.TrustAll' ) >> >> [System.Net.ServicePointManager]::CertificatePolicy = >> $script:TrustAll >> >> >> >> ## end code from http://poshcode.org/624 >> >> } >> >> >> >> >> >> ## Main >> >> >> >> Connect-EWS >> >> Set-myCertificatePolicy >> >> >> >> $mailboxes = Get-Mailbox -ResultSize Unlimited >> >> >> >> ## Get the EWS URL. Use either AutoD or a hardcoded EWS >> URL >> >> if( [String]::IsNullOrEmpty( $ewsURL ) ) >> >> { >> >> $mailboxSmtp = $mailboxes[ 0 >> ].PrimarySmtpAddress.ToString() >> >> >> >> $service.AutodiscoverUrl( $mailboxSmtp, >> $true ) >> >> Write-Host "Using AutoD EWS Server :" >> $Service.url >> >> } >> >> else >> >> { >> >> $uri = [System.URI] $ewsURL >> >> $service.Url = $uri >> >> Write-Host "Using parameterized EWS >> server :" $ewsURL >> >> } >> >> >> >> $rptcollection = @() >> >> $start = Get-Date >> >> $i = 0 >> >> >> >> foreach( $mailbox in $mailboxes ) >> >> { >> >> $i += 1 >> >> $Duration = ( New-TimeSpan -Start >> ($start) -End (Get-Date) ).TotalSeconds >> >> $TimeLeft = ( $Duration / $i ) * ( >> $mailboxes.Count - $i ) >> >> Write-Progress -Status >> $mailbox.DisplayName ` >> >> -Activity >> "Mailbox $i of $($mailboxes.Count)" ` >> >> >> -PercentComplete ( $i / $mailboxes.Count * 100 ) ` >> >> >> -SecondsRemaining $timeleft ` >> >> -Id 100 >> >> >> >> ## FIXME - impersonation? or admin perms? >> I don't care, but decide >> >> ## Optional section for Exchange >> Impersonation >> >> ## $service.ImpersonatedUserId = >> new-object >> Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, >> $Mailbox.PrimarySMTPAddress) >> >> >> >> $folderid = $null ## clear value (if any) >> from prior iteration >> >> $calendar = $null ## clear value (if any) >> from prior iteration >> >> >> >> try >> >> { >> >> $folderid = New-Object >> Microsoft.Exchange.WebServices.Data.FolderId( $wkf_Calendar, >> $mailbox.PrimarySMTPAddress.ToString() ) >> >> $calendar = >> [Microsoft.Exchange.WebServices.Data.Folder]::Bind( $service, $folderid ) >> >> } >> >> catch >> >> { >> >> Write-Host "Could not >> bind to Calendar for" $mailbox.PrimarySMTPAddress.ToString() >> >> continue >> >> } >> >> >> >> ##$calendar | fl * -force >> >> ##$global:saveCal = $calendar >> >> ##$global:saveEWS = $service >> >> ##$global:propSet = $calPropSet >> >> >> >> Write-Host "Bound to Calendar for" >> $mailbox.PrimarySMTPAddress.ToString() >> >> Write-Host ".... total items in Calendar >> $($calendar.TotalCount)" >> >> >> >> if( $calendar.TotalCount -eq 0 ) >> >> { >> >> continue >> >> } >> >> >> >> $calPropSet = New-Object >> Microsoft.Exchange.WebServices.Data.PropertySet( >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.BasePropertySet >> ]::IdOnly, ` >> >> >> [Microsoft.Exchange.WebServices.Data.ItemSchema >> ]::Subject, ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::AppointmentState, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::AppointmentType, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::End, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Start, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::IsRecurring, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Location, >> ` >> >> >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Organizer >> ) >> >> ## >> [Microsoft.Exchange.WebServices.Data.AppointmentSchema]:: >> >> >> >> ### a calendar view is limited to two >> years >> >> ### so to look at an entire calendar is a >> bit of a hassle >> >> >> >> ### we just examine $EndDate - 730 days >> worth of data (or up to 1000 calendar items) >> >> >> >> $StartDate = $EndDate.AddDays( -730 ) >> >> >> >> $calView = $null >> >> $calView = New-Object >> Microsoft.Exchange.WebServices.Data.CalendarView( $StartDate, $EndDate, >> 1000 ) >> >> $calView.PropertySet = $calPropSet >> >> >> >> $global:Collection = $null >> >> $global:Collection = >> $calendar.FindAppointments( $calView ) >> >> >> >> $count = 0 >> >> foreach( $appointment in >> $Collection.Items ) >> >> { >> >> if( >> $appointment.IsRecurring -eq $false ) >> >> { >> >> continue >> >> } >> >> >> >> ##$appointment | ft >> Subject, IsRecurring, >> >> >> ## AppointmentType, AppointmentState, >> >> >> ## Location, Organizer >> >> >> >> $count += 1 >> >> Write-Progress -Status >> $mailbox.DisplayName ` >> >> >> -Activity "Mailbox $i of $($mailboxes.Count)" ` >> >> >> -PercentComplete ( $i/ $mailboxes.count * 100 ) ` >> >> >> -SecondsRemaining $timeleft ` >> >> >> -Id 100 ` >> >> >> -CurrentOperation "Processing calendarItem $count of >> $($Collection.Items.Count)" >> >> >> >> $obj = "" | Select >> Subject, ` >> >> >> AppointmentState, AppointmentType, ` >> >> Start, >> End, ` >> >> >> IsRecurring, ` >> >> Location, >> Organizer >> >> >> >> $obj.Subject = >> $appointment.Subject >> >> $obj.AppointmentState = >> $appointment.AppointmentState >> >> $obj.AppointmentType = >> $appointment.AppointmentType >> >> $obj.Start = >> $appointment.Start >> >> $obj.End = >> $appointment.End >> >> $obj.IsRecurring = >> $appointment.IsRecurring >> >> $obj.Location = >> $appointment.Location >> >> $obj.Organizer = >> $appointment.Organizer >> >> >> >> Write-Output $obj >> >> } >> >> } ## foreach( $mailbox in $mailboxes ) >> >> >> > >
