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