My powershell skills are not good, but I'm always up for a little
fiddling - it's another chance to learn.

This is much appreciated.

Kurt

On Tue, Dec 9, 2014 at 1:57 PM, Michael B. Smith <[email protected]> wrote:
> I don't know how good your PowerShell has gotten, but the script below, with 
> a little fiddling with $StartDate and $EndDate along with Measure-Object and 
> Group-Object, should be able to give you exactly what you want, based on your 
> description. :)
>
> This is the same script I gave Candee (I think it was Candee) last month.
>
> ##
> ## Dump-Calendar.ps1
> ##
> ## Michael B. Smith
> ## michael at TheEssentialExchange dot com
> ## November, 2014
> ##
> ## Provided as-is. No warranties, express or implied, are available.
> ##
>
> param
> (
>         [DateTime]$StartDate         = ( Get-Date -Year 1970 -Month 1 -Day 1 
> -Hour 8 -Minute 0 -Second 0 ),
>         [DateTime]$EndDate           = ( Get-Date ),
>         [bool]$useDefaultCredentials = $true,
>         [bool]$IsRecurring           = $true,
>         [bool]$FilterRecurring       = $false,
>         [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
>         }
>
>
>         $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.ItemSchema       
> ]::DateTimeCreated,       `
>                         [Microsoft.Exchange.WebServices.Data.ItemSchema       
> ]::Id,                    `
>                         
> [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( $FilterRecurring -and ( $appointment.IsRecurring 
> -eq $IsRecurring ) )
>                         {
>                                 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 Id, Subject,                 `
>                                 AppointmentState, AppointmentType,      `
>                                 Start, End, DateTimeCreated,            `
>                                 IsRecurring,                            `
>                                 Location, Organizer
>
>                         $obj.Id               = $appointment.Id
>                         $obj.Subject          = $appointment.Subject
>                         $obj.AppointmentState = $appointment.AppointmentState
>                         $obj.AppointmentType  = $appointment.AppointmentType
>                         $obj.Start            = $appointment.Start
>                         $obj.End              = $appointment.End
>                         $obj.DateTimeCreated  = $appointment.DateTimeCreated
>                         $obj.IsRecurring      = $appointment.IsRecurring
>                         $obj.Location         = $appointment.Location
>                         $obj.Organizer        = $appointment.Organizer
>
>                         Write-Output $obj
>                 }
>         } ## foreach( $mailbox in $mailboxes )
>


Reply via email to