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 )
>>
>>
>>
>
>

Reply via email to