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