Hello All,
Thanks so much for help so far, its helped me an awful lot. I hope I can add value into he forum myself as I gain more experience.
Ok so I am wanting to tidy up my script and I think its too long. Sections have repeats in which I was wondering if I could shorten.
So various functions through the script add members to an Array. Here is an example:
$obj|add-member -membertype NoteProperty -name "ObjectGuid" -value $_.Guid $obj|add-member -membertype NoteProperty -name "ExchangeGuid" -value $_.ExchangeGuid $obj|add-member -membertype NoteProperty -name "SamAccountName" -value $_.SamAccountName $obj|add-member -membertype NoteProperty -name "UserPrincipalName" -value $_.UserPrincipalName $obj|add-member -membertype NoteProperty -name "DisplayName" -value $_.DisplayName
Later the array is sent to a function for export to CSV
Build-Report -Obj $obj
Sometimes various attributes are not available and I’ve found that if say there are 20 attributes I want in the CSV report at the end, then I must ensure that each time I pass the $OBJ array to Build-Report function that all the columns are the same.
So if pass one has only 18 attributes (or members) in the $OBJ array that gets commited to CSV no problem. However if then on the 2nd run all 20 get populated, I get an error message saying:
The appended object does not have a property that corresponds to the following column: ItemCount
So the way I got around this was that for each function, I list an entire set of attributes, even if they are going to be blank. That way I ensure when it comes to exporting to CSV the columns all match up.
This kind of works but its messy. I end up with lots of repetition.
I tried to fix this by only passing when was present from each Function (so much less code repetition) and then have the Build-Report function to pad out ‘blanks’ before Exporting to CSV. However that didnt work. Seems that once a function has passed in the $OBJ array to the Build-Report function, its fixed and new members CANNOT be added. At least not when I tried.
Here is an example of that failed attempt:
#*** Building Report *** if(!$obj.objectGuid){ $obj|add-member -membertype NoteProperty -name "ObjectGuid" -value ""} if(!$obj.ExchangeGuid){$0bj |add-member -membertype NoteProperty -name "ExchangeGuid" -value ""} if(!$obj.ArchiveGuid){$0bj |add-member -membertype NoteProperty -name "ArchiveGuid" -value ""} if(!$obj.SamAccountName){$0bj |add-member -membertype NoteProperty -name "SamAccountName" -value ""} if(!$obj.UserPrincipalName){$0bj |add-member -membertype NoteProperty -name "UserPrincipalName" -value ""} if(!$obj.DisplayName){$0bj |add-member -membertype NoteProperty -name "DisplayName" -value ""} if(!$obj.Company){$0bj |add-member -membertype NoteProperty -name "Company" -value ""} if(!$obj.Department){$0bj |add-member -membertype NoteProperty -name "Department" -value ""} if(!$obj.JobTitle){$0bj |add-member -membertype NoteProperty -name "JobTitle" -value ""} if(!$obj.PrimarySmtpAddress){$0bj |add-member -membertype NoteProperty -name "PrimarySmtpAddress" -value ""} if(!$obj.Database){$0bj |add-member -membertype NoteProperty -name "Database" -value ""} if(!$obj.ItemCount){$0bj |add-member -membertype NoteProperty -name "ItemCount" -value ""} if(!$obj.TotalItemSize){$0bj |add-member -membertype NoteProperty -name "TotalItemSize" -value ""} if(!$obj.ArchiveItemCount){$0bj |add-member -membertype NoteProperty -name "ArchiveItemCount" -value ""} if(!$obj.ArchiveTotalItemSize){$0bj |add-member -membertype NoteProperty -name "ArchiveTotalItemSize" -value ""} if(!$obj.CombinedTotalSize){$0bj |add-member -membertype NoteProperty -name "CombinedTotalSize" -value ""} if(!$obj.EA1){$0bj |add-member -membertype NoteProperty -name "EA1" -value ""} if(!$obj.EA2){$0bj |add-member -membertype NoteProperty -name "EA2" -value ""} if(!$obj.EA3){$0bj |add-member -membertype NoteProperty -name "EA3" -value ""} if(!$obj.EA4){$0bj |add-member -membertype NoteProperty -name "EA4" -value ""} if(!$obj.EA5){$0bj |add-member -membertype NoteProperty -name "EA5" -value ""} if(!$obj.LastLogonDate){$0bj |add-member -membertype NoteProperty -name "LastLogonDate" -value ""} if(!$obj.RecipientType){$0bj |add-member -membertype NoteProperty -name "RecipientType" -value ""} if(!$obj.RecipientTypeDetails){$0bj |add-member -membertype NoteProperty -name "RecipientTypeDetails" -value ""} if(!$obj.DelegateName){$0bj |add-member -membertype NoteProperty -name "DelegateName" -value ""} if(!$obj.DelegateEmail){$0bj |add-member -membertype NoteProperty -name "DelegateEmail" -value ""} if(!$obj.DelegateAccess){$0bj |add-member -membertype NoteProperty -name "DelegateAccess" -value ""} if(!$obj.FolderPath){$0bj |add-member -membertype NoteProperty -name "FolderPath" -value ""} if(!$obj.GroupExists){$0bj |add-member -membertype NoteProperty -name "GroupExists" -value ""} if(!$obj.LitigationHoldEnabled){$0bj |add-member -membertype NoteProperty -name "LitigationHoldEnabled" -value ""} if(!$obj.SingleItemRecoveryEnabled){$0bj |add-member -membertype NoteProperty -name "SingleItemRecoveryEnabled" -value ""} if(!$obj.LitigationHoldDate){$0bj |add-member -membertype NoteProperty -name "LitigationHoldDate" -value ""} if(!$obj.LitigationHoldOwner){$0bj |add-member -membertype NoteProperty -name "LitigationHoldOwner" -value ""} if(!$obj.LitigationHoldDuration){$0bj |add-member -membertype NoteProperty -name "LitigationHoldDuration" -value ""} if(!$obj.RetainDeletedItemsFor){$0bj |add-member -membertype NoteProperty -name "RetainDeletedItemsFor" -value ""} if(!$obj.UMEnabled){$0bj |add-member -membertype NoteProperty -name "UMEnabled" -value ""} if(!$obj.BatchName){$0bj |add-member -membertype NoteProperty -name "BatchName" -value ""} if(!$obj.CurrentStatus){$0bj |add-member -membertype NoteProperty -name "CurrentStatus" -value ""} if(!$obj.EEComments1){$0bj |add-member -membertype NoteProperty -name "EEComments1" -value ""} if(!$obj.EEComments2){$0bj |add-member -membertype NoteProperty -name "EEComments2" -value ""} if(!$obj.BDOComments1){$0bj |add-member -membertype NoteProperty -name "BDOComments1" -value "."} if(!$obj.BDOComments2){$0bj |add-member -membertype NoteProperty -name "BDOComments2" -value "."} $obj|export-csv c:\O365Reports\$report.csv -Append
The idea is, it checks if the array contains that member, and if its not present it adds in a blank, just so that its consistent before export-csv.
So now I have to revert back to this mess in each function (this is just one function):
Function Process-Mailboxes { #FN-PM [cmdletbinding()] param([string]$Name) Get-Mailbox -ResultSize unlimited |?{!($_.DisplayName -like "*Discovery S*")} | select identity,DisplayName,DistinguishedName,guid,ExchangeGuid,ArchiveGuid,SamAccountName,UserprincipalName,DisplayName,PrimarySmtpAddress,Database,ServerName,RecipientType,RecipientTypeDetails,UMEnabled,LitigationHoldEnabled,SingleItemRecoveryEnabled,LitigationHoldDate,LitigationHoldOwner,LitigationHoldDuration,RetainDeletedItemsFor| foreach-object{ #Begin ForLoop #*** Increment Counters and Write to Screen $i++ Write-Host "$($i) Mailbox(s) processed . . ." #*** Gather AD and Mailbox Attributes and send to reporting function *** $ADUser=(Get-ADUser $_.guid -Properties department,company,title,lastlogondate,extensionAttribute1,extensionAttribute2,extensionAttribute3,extensionAttribute4,extensionAttribute5) $Department=$Aduser.department $Company=$ADUser.company $JobTitle=$aduser.title $LastLogonDate=$Aduser.LastLogonDate $EA1=$Aduser.extensionAttribute1 $EA2=$Aduser.extensionAttribute2 $EA3=$Aduser.extensionAttribute3 $EA4=$Aduser.extensionAttribute4 $EA5=$Aduser.extensionAttribute5 #*** Start Hash System Object for Report *** $obj=new-object System.Object $obj|add-member -membertype NoteProperty -name "ObjectGuid" -value $_.Guid $obj|add-member -membertype NoteProperty -name "ExchangeGuid" -value $_.ExchangeGuid $obj|add-member -membertype NoteProperty -name "SamAccountName" -value $_.SamAccountName $obj|add-member -membertype NoteProperty -name "UserPrincipalName" -value $_.UserPrincipalName $obj|add-member -membertype NoteProperty -name "DisplayName" -value $_.DisplayName $obj|add-member -membertype NoteProperty -name "Company" -value $Company $obj|add-member -membertype NoteProperty -name "Department" -value $Department $obj|add-member -membertype NoteProperty -name "JobTitle" -value $JobTitle $obj|add-member -membertype NoteProperty -name "PrimarySmtpAddress" -value $_.PrimarySMTPAddress $obj|add-member -membertype NoteProperty -name "Database" -value $_.Database $obj|add-member -membertype NoteProperty -name "EA1" -value $EA1 $obj|add-member -membertype NoteProperty -name "EA2" -value $EA2 $obj|add-member -membertype NoteProperty -name "EA3" -value $EA3 $obj|add-member -membertype NoteProperty -name "EA4" -value $EA4 $obj|add-member -membertype NoteProperty -name "EA5" -value $EA5 $obj|add-member -membertype NoteProperty -name "LastLogonDate" -value $LastLogonDate $obj|add-member -membertype NoteProperty -name "RecipientType" -value $_.RecipientType $obj|add-member -membertype NoteProperty -name "RecipientTypeDetails" -value $_.RecipientTypeDetails $obj|add-member -membertype NoteProperty -name "LitigationHoldEnabled" -value $_.LitigationHoldEnabled $obj|add-member -membertype NoteProperty -name "SingleItemRecoveryEnabled" -value $_.SingleItemRecoveryEnabled $obj|add-member -membertype NoteProperty -name "LitigationHoldDate" -value $_.LitigationHoldDate $obj|add-member -membertype NoteProperty -name "LitigationHoldOwner" -value $_.LitigationHoldOwner $obj|add-member -membertype NoteProperty -name "LitigationHoldDuration" -value $_.LitigationHoldDuration $obj|add-member -membertype NoteProperty -name "RetainDeletedItemsFor" -value $_.RetainDeletedItemsFor $obj|add-member -membertype NoteProperty -name "UMEnabled" -value $_.UMEnabled #*** Gather Mailbox Statistics Attributes *** Try{ #TRY002 FN-PM $ItemCount=(Get-MailboxStatistics -Identity $_.DisplayName).ItemCount $TotalItemSize=(Get-MailboxStatistics –identity $_.DisplayName).totalitemsize.value.ToMB() $obj|add-member -membertype NoteProperty -name "ItemCount" -value $ItemCount $obj|add-member -membertype NoteProperty -name "TotalItemSize" -value $TotalItemSize } catch { #CATCH002 FN-PM $LogData = @{ Name = $ADUser.name GUID = $ADuser.ObjectGUID DN = $ADuser.DistinguishedName TargetName = $_.CategoryInfo.TargetName Exception= $_.Exception.Message Error0=$Error[0] Error1=$Error[1] Error2=$Error[2] Code = 'Error' TryIndex = '002 FN-PM' }#End Splat [Array]$Invocation= $_.InvocationInfo Write-Log -LogData $LogData -InvocationError $Invocation } #END #CATCH 002 FN-PM #Check if the mailbox has an archive & Gather stats if exists if(($_.ArchiveGuid -ne "00000000-0000-0000-0000-000000000000")){ Try{ #TRY003 FN-PM $ArchiveItemCount=(Get-MailboxStatistics -Identity $_.DisplayName -Archive).ItemCount $ArchiveTotalItemSize=(Get-MailboxStatistics –identity $_.DisplayName -Archive).totalitemsize.value.ToMB() $obj|add-member -membertype NoteProperty -name "ArchiveItemCount" -value $ArchiveItemCount $obj|add-member -membertype NoteProperty -name "ArchiveTotalItemSize" -value $ArchiveTotalItemSize } catch { #CATCH003 FN-PM $LogData = #Begin Splat @{ Name = $ADUser.name GUID = $ADuser.ObjectGUID DN = $ADuser.DistinguishedName TargetName = $_.CategoryInfo.TargetName Exception= $_.Exception.Message Error0=$Error[0] Error1=$Error[1] Error2=$Error[2] Code = 'Error' TryIndex = '003 FN-PM' } #End Splat [Array]$Invocation= $_.InvocationInfo Write-Log -LogData $LogData -InvocationError $Invocation } #END Catch003 FN-PM } #END IF (ArchiveGUID) # *** If the 1st user doesnt have an archive these members need adding to the hash object before its commited to CSV in Build-Report *** else { $obj|add-member -membertype NoteProperty -name "ArchiveItemCount" -value "" $obj|add-member -membertype NoteProperty -name "ArchiveTotalItemSize" -value "" } $CombinedTotal=$TotalItemSize+$ArchiveTotalItemSize $obj|add-member -membertype NoteProperty -name "CombinedTotalSize" -value $CombinedTotal # *** These are added so that the $obj template first committed to the log file report # *** by Build-Report has all headings added. Later the Check-Delegates function will add these # *** headings. If they werent first added here then Check-Delegates could not subsequently # *** add them in. $obj|add-member -membertype NoteProperty -name "DelegateName" -value "" $obj|add-member -membertype NoteProperty -name "DelegateEmail" -value "" $obj|add-member -membertype NoteProperty -name "DelegateAccess" -value "" $obj|add-member -membertype NoteProperty -name "FolderPath" -value "" $obj|add-member -membertype NoteProperty -name "GroupExists" -value "" $obj|add-member -membertype NoteProperty -name "FolderPath" -value "" $obj|add-member -membertype NoteProperty -name "CurrentStatus" -value "" $obj|add-member -membertype NoteProperty -name "EEComments1" -value "" $obj|add-member -membertype NoteProperty -name "EEComments2" -value "" $obj|add-member -membertype NoteProperty -name "BDOComments1" -value "" $obj|add-member -membertype NoteProperty -name "BDOComments2" -value "" #*** Sends $OBJ array to the Build-Report function** Build-Report -Obj $obj # *** Send to Log Function *** If ($IncludeMailboxAccess -eq $true) { $LogData= @{ Code="SUCCESS" GUID=$_.Guid DisplayName=$_.displayname FriendlyText="Interrogating Mailbox:" } #END Splat # *** Find mailbox access permissions and log *** Write-Log -LogData $LogData $Delegates = @() $Delegates = (Get-MailboxPermission $_.DistinguishedName | Where { $DelegatesToSkip -notcontains $_.User -and $_.IsInherited -eq $false }) If ($Delegates -ne $null) { ForEach ($Delegate in $Delegates) { $DelegateAccess = $Delegate.AccessRights Check-Delegates -DelegateID $Delegate.User -objectguid $_.guid -DisplayName $_.Displayname -DelegateAccess $DelegateAccess -PriSMTP $_.PrimarySMTPAddress}}} # *** Find SendAs permissions and log *** If ($IncludeSendAs -eq $true) { $Delegates = @() $Delegates = Get-ADPermission $_.DistinguishedName | Where { $DelegatesToSkip -notcontains $_.User -and $_.ExtendedRights -like "*send-as*" } If ($Delegates -ne $null) { ForEach ($Delegate in $Delegates) { $DelegateAccess = "SendAs" Check-Delegates -DelegateID $Delegate.User -objectguid $_.guid -DisplayName $_.Displayname -DelegateAccess $DelegateAccess -PriSMTP $_.PrimarySMTPAddress} } } # *** Find SendOnBehalf permissions *** If ($IncludeSendOnBehalf -eq $true) { $Delegates = @() $Delegates = (Get-Mailbox $_.DistinguishedName).GrantSendOnBehalfTo If ($Delegates -ne $null) { ForEach ($Delegate in $Delegates) { $DelegateAccess = "SendOnBehalfOf" Check-Delegates -DelegateID $Delegate -objectguid $_.guid -DisplayName $_.Displayname -DelegateAccess $DelegateAccess -PriSMTP $_.PrimarySMTPAddress} } } # *** Export folder permissions *** Try{ If ($IncludeFolderDelegates -eq $true) { If ($IncludeCommonFoldersOnly -eq $true) { $Folders = Get-MailboxFolderStatistics $_.DistinguishedName | Where { $_.FolderPath -eq "/Top of Information Store" -or $_.FolderPath -eq "/Inbox" -or $_.FolderPath -eq "/Calendar" } } Else { $Folders = Get-MailboxFolderStatistics $_.DistinguishedName } ForEach ($Folder in $Folders) { $FolderPath = $Folder.FolderPath.Replace("/","\") If ($FolderPath -eq "\Top of Information Store") { $FolderPath = "\" } [String]$PrimaryEmail=$_.PrimarySMTPAddress $FolderLocation = $PrimaryEmail + ":" + $FolderPath $FolderPermissions = Get-MailboxFolderPermission $FolderLocation -ErrorAction SilentlyContinue If ($FolderPermissions -ne $null) { ForEach ($Permission in $FolderPermissions) { [string]$FolderDelegate = $Permission.User If ($FolderDelegate -ne "Default" -and $FolderDelegate -ne "Anonymous") { $CheckDelegate = Get-Recipient $FolderDelegate -ErrorAction SilentlyContinue If ($CheckDelegate -ne $null) { $DelegateName = $CheckDelegate.Name $DelegateEmail = $CheckDelegate.PrimarySmtpAddress [String]$DelegateAccess = $Permission.AccessRights If ($DelegateName -ne $_.DisplayName) { $obj=new-object System.Object $obj|add-member -membertype NoteProperty -name "ObjectGuid" -value $_.guid $obj|add-member -membertype NoteProperty -name "ExchangeGuid" -value "" $obj|add-member -membertype NoteProperty -name "ArchiveGuid" -value "" $obj|add-member -membertype NoteProperty -name "SamAccountName" -value "" $obj|add-member -membertype NoteProperty -name "UserPrincipalName" -value "" $obj|add-member -membertype NoteProperty -name "DisplayName" -value $_.DisplayName $obj|add-member -membertype NoteProperty -name "Company" -value "" $obj|add-member -membertype NoteProperty -name "Department" -value "" $obj|add-member -membertype NoteProperty -name "JobTitle" -value "" $obj|add-member -membertype NoteProperty -name "PrimarySmtpAddress" -value "" $obj|add-member -membertype NoteProperty -name "Database" -value "" $obj|add-member -membertype NoteProperty -name "ItemCount" -value "" $obj|add-member -membertype NoteProperty -name "TotalItemSize" -value "" $obj|add-member -membertype NoteProperty -name "ArchiveItemCount" -value "" $obj|add-member -membertype NoteProperty -name "ArchiveTotalItemSize" -value "" $obj|add-member -membertype NoteProperty -name "CombinedTotalSize" -value "" $obj|add-member -membertype NoteProperty -name "EA1" -value "" $obj|add-member -membertype NoteProperty -name "EA2" -value "" $obj|add-member -membertype NoteProperty -name "EA3" -value "" $obj|add-member -membertype NoteProperty -name "EA4" -value "" $obj|add-member -membertype NoteProperty -name "EA5" -value "" $obj|add-member -membertype NoteProperty -name "LastLogonDate" -value "" $obj|add-member -membertype NoteProperty -name "RecipientType" -value "" $obj|add-member -membertype NoteProperty -name "RecipientTypeDetails" -value "" $obj|add-member -membertype NoteProperty -name "DelegateName" -value $DelegateName $obj|add-member -membertype NoteProperty -name "DelegateEmail" -value $DelegateEmail $obj|add-member -membertype NoteProperty -name "DelegateAccess" -value $DelegateAccess $obj|add-member -membertype NoteProperty -name "FolderPath" -value $FolderPath $obj|add-member -membertype NoteProperty -name "GroupExists" -value "" $obj|add-member -membertype NoteProperty -name "LitigationHoldEnabled" -value "" $obj|add-member -membertype NoteProperty -name "SingleItemRecoveryEnabled" -value "" $obj|add-member -membertype NoteProperty -name "LitigationHoldDate" -value "" $obj|add-member -membertype NoteProperty -name "LitigationHoldOwner" -value "" $obj|add-member -membertype NoteProperty -name "LitigationHoldDuration" -value "" $obj|add-member -membertype NoteProperty -name "RetainDeletedItemsFor" -value "" $obj|add-member -membertype NoteProperty -name "UMEnabled" -value "" $obj|add-member -membertype NoteProperty -name "BatchName" -value "" $obj|add-member -membertype NoteProperty -name "CurrentStatus" -value "" $obj|add-member -membertype NoteProperty -name "EEComments1" -value "" $obj|add-member -membertype NoteProperty -name "EEComments2" -value "" $obj|add-member -membertype NoteProperty -name "BDOComments1" -value "" $obj|add-member -membertype NoteProperty -name "BDOComments2" -value "" #*** Send data to log and screen *** $LogData= @{ DelegateName=$DelegateName DelegateAccess=$DelegateAccess Mailbox=$_.PrimarySMTPAddress Folder=$FolderPath Code="FolderAccess" } #END Splat #*** Send to Log Function *** Write-Log -LogData $LogData #*** Send Array to report function *** Build-Report -obj $obj # *** Closes for all IFs from Export Folder Permissions *** } } } } } }} } catch { #CATCH003 FN-PM $LogData = @{ Name = $ADUser.name GUID = $ADuser.ObjectGUID DN = $ADuser.DistinguishedName TargetName = $_.CategoryInfo.TargetName Exception= $_.Exception.Message Error0=$Error[0] Error1=$Error[1] Error2=$Error[2] Code = 'Error' TryIndex = '003 FN-PM' }#End Splat [Array]$Invocation= $_.InvocationInfo Write-Log -LogData $LogData -InvocationError $Invocation } #END #CATCH 003 FN-PM } #END IF (MailboxAccess Check) } #END Function
Would be nice to do it more efficiently, any ideas very welcomed
Thanks
Stuart