It works!
Thanks again!

On Thu, Oct 23, 2014 at 12:24 PM, Candee <[email protected]> wrote:

> 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