{"id":832,"date":"2016-06-08T10:22:45","date_gmt":"2016-06-08T10:22:45","guid":{"rendered":"https:\/\/www.lieben.nu\/liebensraum\/?p=832"},"modified":"2016-06-08T10:22:45","modified_gmt":"2016-06-08T10:22:45","slug":"exporting-shared-mailbox-permissions-to-a-csv","status":"publish","type":"post","link":"https:\/\/lieben.nu\/liebensraum\/2016\/06\/exporting-shared-mailbox-permissions-to-a-csv\/","title":{"rendered":"Exporting shared mailbox permissions to a CSV"},"content":{"rendered":"<p>A demonstration of one way to get shared\u00a0mailbox permissions exported to a CSV file. We needed both users, groups and users in groups (so, a recursive search). Only Shared mailboxes had to be included, we could identity these by a simple rule:<\/p>\n<blockquote><p>the first portion of the primary email address does not contain a dot<\/p><\/blockquote>\n<p>See line 126 and 127 for this rule if you need a different method.<\/p>\n<p>Edit: make sure you replace CED\\ with your own domain! Sorry bout that&#8230;<\/p>\n<p>This export excludes Deny permissions and looks for users in groups up to 2 levels deep. Credits to<a href=\"https:\/\/gallery.technet.microsoft.com\/scriptcenter\/Get-nested-group-15f725f2\"> Piotrek<\/a> for his Get-ADNestedGroupMember function.<\/p>\n<p>Script source:<!--more--><\/p>\n<pre class=\"brush: powershell; title: ; notranslate\" title=\"\">\n\n#Module name: reportSharedMailboxPermissions\n#Author: Jos Lieben (OGD)\n#Date: 08-06-2016\n#Script help: www.liebensraum.nl\n#Purpose: writes a csv report of user and group permissions (recursive) on mailboxes with a . in their primary email prefix\n#Requirements: run from Exchange Shell, requires AD module\n\nipmo ActiveDirectory\n\n$users = Get-Mailbox -Resultsize Unlimited\n$script:csvEntries = @()\n$csvExportPath = &quot;C:\\Scripts\\mailboxRights.csv&quot;\n\nfunction searchForUserOrGroup{\n param(\n &#x5B;String]$name\n )\n $found = $False\n try{\n $adresult = Get-ADUser -filter{samAccountName -eq $name}\n if($adresult) {$found = $True}\n }catch{$Null}\n if($found -eq $False){\n try{\n $adresult = Get-ADGroup -filter{samAccountName -eq $name}\n if($adresult) {$found = $True}\n }catch{$Null}\n }\n if($found){\n return $adresult\n }else{\n return $False\n }\n}\n\nfunction Get-ADNestedGroupMembers {\n param ( \n &#x5B;Parameter(ValuefromPipeline=$true,mandatory=$true)]&#x5B;String] $GroupName, \n &#x5B;int] $nesting = -1, \n &#x5B;int]$circular = $null \n ) \n $table = $null \n $nestedmembers = $null \n $adgroupname = $null \n $nesting++ \n $ADGroupname = get-adgroup $groupname -properties memberof,members \n $memberof = $adgroupname | select -expand memberof \n if ($adgroupname){ \n if ($circular){ \n $nestedMembers = Get-ADGroupMember -Identity $GroupName -recursive \n $circular = $null \n } \n else{ \n $nestedMembers = Get-ADGroupMember -Identity $GroupName | sort objectclass -Descending\n if (!($nestedmembers)){\n $unknown = $ADGroupname | select -expand members\n if ($unknown){\n $nestedmembers=@()\n foreach ($member in $unknown){\n $nestedmembers += get-adobject $member\n }\n }\n\n }\n } \n foreach ($nestedmember in $nestedmembers){ \n $Props = @{Type=$nestedmember.objectclass;Name=$nestedmember.name;DisplayName=&quot;&quot;;ParentGroup=$ADgroupname.name;Enabled=&quot;&quot;;Nesting=$nesting;DN=$nestedmember.distinguishedname;Comment=&quot;&quot;} \n if ($nestedmember.objectclass -eq &quot;user&quot;){ \n $nestedADMember = get-aduser $nestedmember -properties enabled,displayname \n $table = new-object psobject -property $props \n $table.enabled = $nestedadmember.enabled\n $table.name = $nestedadmember.samaccountname\n $table.displayname = $nestedadmember.displayname\n $table | select type,name,displayname,parentgroup,nesting,enabled,dn,comment \n } \n elseif ($nestedmember.objectclass -eq &quot;group&quot;){ \n $table = new-object psobject -Property $props \n \n if ($memberof -contains $nestedmember.distinguishedname){ \n $table.comment =&quot;Circular membership&quot; \n $circular = 1 \n } \n $table | select type,name,displayname,parentgroup,nesting,enabled,dn,comment \n if($nesting -lt 3){\n Get-ADNestedGroupMembers -GroupName $nestedmember.distinguishedName -nesting $nesting -circular $circular \n } \n } \n else{ \n if ($nestedmember){\n $table = new-object psobject -property $props\n $table | select type,name,displayname,parentgroup,nesting,enabled,dn,comment \n \n }\n } \n } \n } \n \n}\n\nfunction addToCSV{\n Param(\n &#x5B;String]$mailboxEmail,\n &#x5B;String]$mailboxAlias,\n &#x5B;String]$mailboxDisplayName,\n &#x5B;String]$mailboxType,\n &#x5B;String]$permissionName,\n &#x5B;String]$permissionClass,\n &#x5B;String]$permissionType\n )\n $csvEntry = New-Object PSObject\n $csvEntry | Add-Member NoteProperty mailboxEmail($mailboxEmail)\n $csvEntry | Add-Member NoteProperty mailboxAlias($mailboxAlias)\n $csvEntry | Add-Member NoteProperty mailboxDisplayName($mailboxDisplayName)\n $csvEntry | Add-Member NoteProperty mailboxType($mailboxType)\n $csvEntry | Add-Member NoteProperty permissionName($permissionName)\n $csvEntry | Add-Member NoteProperty permissionClass($permissionClass)\n $csvEntry | Add-Member NoteProperty permissionType($permissionType)\n $script:csvEntries += $csvEntry\n}\n\nWrite-Progress -Activity &quot;Running report&quot; -PercentComplete 0 -Status &quot;Indexing...&quot;\n\n$done = 0\nforeach($user in $users){\n \n $mail = $user.PrimarySMTPAddress.ToString()\n if($mail.Split(&quot;@&quot;)&#x5B;0] -like &quot;*.*&quot;){\n write-verbose &quot;$mail not shared&quot; \n }else{\n try{\n $perms = $user | Get-MailboxPermission -erroraction stop | where{$_.Deny -eq $False}\n }catch{\n write-error &quot;failed to retrieve mailbox permissions for $mail&quot;\n continue\n }\n foreach ($perm in $perms){\n $permUserName = $perm.User.ToString()\n if($permUserName -like &quot;*CED\\*&quot;){\n $permAdInfo = searchForUserOrGroup -name $permUserName.Split(&quot;\\&quot;)&#x5B;1]\n if($permAdInfo -eq $False){\n $rights = $perm.AccessRights -Join &quot;,&quot;\n addToCSV -mailboxEmail $mail -mailboxAlias $user.alias -mailboxDisplayName $user.displayName -mailboxType $user.recipientTypeDetails -permissionName $permUserName -permissionClass &quot;failed to retrieve&quot; -permissionType $rights \n write-output &quot;failed to find AD object for $permUserName&quot;\n }else{\n if($permAdInfo.ObjectClass -eq &quot;group&quot;){\n try{\n $members = Get-ADNestedGroupMembers -GroupName $permAdInfo.Name\n foreach($member in $members){\n Write-Output &quot;$mail : $($member.Name)&quot;\n $rights = $perm.AccessRights -Join &quot;,&quot;\n addToCSV -mailboxEmail $mail -mailboxAlias $user.alias -mailboxDisplayName $user.displayName -mailboxType $user.recipientTypeDetails -permissionName $member.DisplayName -permissionClass $member.ObjectClass -permissionType $rights\n }\n }catch{\n Write-Output &quot;$mail : $($permAdInfo.Name)&quot;\n $rights = $perm.AccessRights -Join &quot;,&quot;\n addToCSV -mailboxEmail $mail -mailboxAlias $user.alias -mailboxDisplayName $user.displayName -mailboxType $user.recipientTypeDetails -permissionName $permAdInfo.Name -permissionClass $permAdInfo.ObjectClass -permissionType $rights\n }\n }else{\n Write-Output &quot;$mail : $($permAdInfo.Name)&quot;\n $rights = $perm.AccessRights -Join &quot;,&quot;\n addToCSV -mailboxEmail $mail -mailboxAlias $user.alias -mailboxDisplayName $user.displayName -mailboxType $user.recipientTypeDetails -permissionName $permAdInfo.Name -permissionClass $permAdInfo.ObjectClass -permissionType $rights \n }\n }\n }\n }\n }\n $done++\n try{$percent_done = ($done\/($users.Count))*100}catch{$percent_done = 0}\n Write-Progress -Activity &quot;Running report&quot; -PercentComplete $percent_done -Status &quot;$percent_done % done&quot;\n}\n\n$csvEntries | Export-CSV -Path $csvExportPath -Delimiter &quot;;&quot;\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A demonstration of one way to get shared\u00a0mailbox permissions exported to a CSV file. We needed both users, groups and users in groups (so, a recursive search). Only Shared mailboxes had to be included, we could identity these by a simple rule: the first portion of the primary email address does not contain a dot &hellip; <a href=\"https:\/\/lieben.nu\/liebensraum\/2016\/06\/exporting-shared-mailbox-permissions-to-a-csv\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Exporting shared mailbox permissions to a CSV<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[14,15,16,39],"tags":[],"class_list":["post-832","post","type-post","status-publish","format-standard","hentry","category-exchange-2007","category-exchange-2010","category-exchange-2013","category-powershell"],"_links":{"self":[{"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/posts\/832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/comments?post=832"}],"version-history":[{"count":0,"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/posts\/832\/revisions"}],"wp:attachment":[{"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/media?parent=832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/categories?post=832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lieben.nu\/liebensraum\/wp-json\/wp\/v2\/tags?post=832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}