shell 列出CSV文件中的邮箱权限

eagi6jfj  于 2023-05-18  发布在  Shell
关注(0)|答案(1)|浏览(157)

我正在制作邮箱及其权限列表。所以我做了这个小脚本

$Users = Import-Csv -Path C:\Outlookcache_2019.csv -Delimiter ";"

foreach ($User in $Users)  {

                $Permissions = Get-MailboxPermission -Identity 
                $User.UserPrincipalName | select Identity,AccessRights

                $Output = New-Object psobject -Property @{

                           UserPrincipalName = $User.UserprincipalName
                           Identity = $Permissions.Identity
                           AccessRights = $Permissions.accessrights

               }

 
          $Output | Export-Csv -Path C:\Mail_Permissions.csv -Encoding 
          UTF8 -NoTypeInformaiton
 }

我需要在列表中的UserPrincipalName形式的CSV,因为我需要合并结果与另一个EXCEL列表。问题是当我的条目在Permission Like中有超过一个用户时,例如:身份访问权限约翰读,写简读
这个脚本将它们格式化为{John,Jane} {Read,Write,Read},因为它将它们加在一起。我如何格式化它,使第一个条目中的Identity位于一行中,第二个条目在另一行中。这样我就可以在Excel文件中的一个单元格中有两行。提前感谢
我还没有尝试过Regex是否有可能用它来格式化它。我是PowerShell新手

iyr7buue

iyr7buue1#

所以如果我理解正确的话,您希望输出中的每条记录都代表一个可以访问CSV中邮箱的委托?
你可以这样做:

$Mailboxes = Import-Csv -Path "C:\Outlookcache_2019.csv" -Delimiter ';'

foreach ($Mailbox in $Mailboxes)  {
    $Delegates = Get-MailboxPermission -Identity $Mailbox.UserPrincipalName

    foreach ($Delegate in $Delegates) {
        [PSCustomObject]@{
            UserPrincipalName = $Mailbox.UserPrincipalName
            Delegate = $Delegate.User
            AccessRights = $Delegate.AccessRights
        } | Export-Csv -Path "C:\Mail_Permissions.csv" -Encoding UTF8 -NoTypeInformation -Append
    }
}

但是请记住,这将只获得具有“读取和管理”访问权限的代理。这里有一些更彻底的东西,也显示谁有“发送为”访问权限。

$Mailboxes = Import-Csv -Path "C:\Outlookcache_2019.csv" -Delimiter ';'

foreach ($Mailbox in $Mailboxes)  {
    $DelegatesWithReadAndManage = Get-MailboxPermission -Identity $Mailbox.UserPrincipalName | Where-Object {$_.User -ne "NT AUTHORITY\SELF"}
    $DelegatesWithSendAs = Get-RecipientPermission -Identity $Mailbox.UserPrincipalName | Where-Object {$_.Trustee -ne "NT AUTHORITY\SELF"}

    $Output = New-Object System.Collections.Generic.List[PSObject]
    foreach ($Delegate in $DelegatesWithReadAndManage) {
        $Record = [PSCustomObject]@{
            UserPrincipalName = $Mailbox.UserPrincipalName
            Delegate = $Delegate.User
            ReadAndManage = "TRUE"
            SendAs = "FALSE"
        }
        $Output.Add($Record)
    }

    :delegatesLoop foreach ($Delegate in $DelegatesWithSendAs) {
        foreach ($Record in $Output) {
            if ($Delegate.Trustee -eq $Record.Delegate)
            {
                $Record.SendAs = "TRUE"
                continue delegatesLoop
            }
        }

        $Record = [PSCustomObject]@{
            UserPrincipalName = $Mailbox.UserPrincipalName
            Delegate = $Delegate.Trustee
            ReadAndManage = "FALSE"
            SendAs = "TRUE"
        }
        $Output.Add($Record)
    }
    $Output | Export-Csv -Path "C:\Mail_Permissions.csv" -Encoding UTF8 -NoTypeInformation -Append
}

不过,看看这个算法,我意识到如果你把你的$Output存储到一个哈希表而不是一个列表中,它会更快。由于我们正在检查具有“读取和管理”的所有代表的完整列表,因此每个具有“SendAs”的代表是否应将它们合并到同一记录中。如果你的数据要大幅扩展,看看你是否能想出一个更好的算法。
如果你想看看谁也有“代表发送”权限,那会增加复杂性,但希望这有助于你走上正确的方向。

相关问题