Quantcast
Channel: PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources
Viewing all articles
Browse latest Browse all 6937

Exchange Sync script issue

$
0
0

Hello All,

I am new here with the scripting and have an issue with one of our script from previous employee.

 

Would anyone please explain to me what is this script do so I can understand it clearly before looking into the sync issue that I had.

Thanks,

Key

 

Scripts:

--------------------------------------------------------------------------------------------------

Import-Module C:\PSModule\Exchange
Import-Module C:\PSModule\Data
Import-Module C:\PSModule\Reporting

$exchCred = . 'C:\Scripts\Credential\el-svc-exch-script@xyz.com.ps1'

$To = 'abc@xyz.com'
$Subject = 'Mailbox Permissions Changes'

Import-ExchangeSession -Credential $exchCred

$usedPermissions = 'FullAccess'
$executeChanges = $true

$userTemplate = [pscustomobject]@{
    Key = $null
    Group = $null
    Identity = $null
    User = $null
    AccessRights = $null
}


$mailboxGroups = Get-ADGroup -SearchBase 'OU=Mailbox,OU=Resource Access,OU=Groups,DC=xyz,DC=com' -Filter *
$userGroupPermissions = foreach ($mailboxGroup in $mailboxGroups)
{
    $isMatch = $mailboxGroup.Name -match "\A(.+?) - (.+) - (.+?)\Z"
    if (-not $isMatch)
    {
        Write-Error "Problem with group: $($mailboxGroup.Name)."
        next
    }

    $mailbox = $Matches[2]
    $access = $Matches[3] -split '&' | ForEach-Object { $_.Replace(' ', '') }
   
    $foundPermissions = $usedPermissions |
        Where-Object { $_ -in $access }
    if (-not $foundPermissions)
    {
        next
    }

    $users = Get-ADGroupMember -Identity $mailboxGroup -Recursive |
        Where-Object 'objectClass' -eq 'user'
    foreach ($user in $users)
    {
        $userRecord = $userTemplate | Select-Object *
        $userRecord.Group = $mailboxGroup.Name
        $userRecord.Identity = $mailbox
        $userRecord.User = $user.name
        $userRecord.AccessRights = 'FullAccess'
        $userRecord.Key = $userRecord.Identity + '|' + $userRecord.User + '|' + $userRecord.AccessRights
        $userRecord
    }
}

$mailboxPermTemplate = [pscustomobject]@{
    Key = $null
    Identity = $null
    User = $null
    AccessRights = $null
}

$mailboxGroupNames = $userGroupPermissions |
    Group-Object Group |
    Select-Object -ExpandProperty Name

$mailboxNames = $userGroupPermissions |
    Group-Object Identity |
    Select-Object -ExpandProperty Name
$userMailboxPermissions = foreach ($mailboxName in $mailboxNames)
{
    $mailboxPermissions = $null
    $mailboxPermissions = Get-MailboxPermission -Identity $mailboxName

    if (-not $mailboxPermissions)
    {
        Write-Error "Unable to find mailbox: $mailboxName."
        next
    }

    $applicablePermissions = $mailboxPermissions |
        Where-Object { -not $_.IsInherited -and $_.User -notlike 'NT Authority\Self' -and $_.User -notin $mailboxGroupNames }

    foreach ($permission in $applicablePermissions)
    {
        foreach ($accessRight in $permission.AccessRights)
        {
            $userRecord = $mailboxPermTemplate | Select-Object *
            $userRecord.Identity = $mailboxName
            $userRecord.User = $permission.User
            $userRecord.AccessRights = $accessRight
            $userRecord.Key = $userRecord.Identity + '|' + $userRecord.User + '|' + $userRecord.AccessRights
            $userRecord
        }
    }
}

$differences = Get-CollectionDifferences -LeftCollection $userGroupPermissions -RightCollection $userMailboxPermissions -KeyAttribute Key

$changes = & {
    $differences.LeftOnly | Select @{Name='Action'; Expression={'Add'}}, Identity, User, AccessRights
    $differences.RightOnly | Select @{Name='Action'; Expression={'Remove'}}, Identity, User, AccessRights
}

if ($executeChanges)
{
    foreach ($addPermission in $differences.LeftOnly)
    {
        Add-MailboxPermission -Identity $addPermission.Identity -AccessRights $addPermission.AccessRights -User $addPermission.User -Confirm:$false
    }
    foreach ($addPermission in $differences.RightOnly)
    {
        Remove-MailboxPermission -Identity $addPermission.Identity -AccessRights $addPermission.AccessRights -User $addPermission.User -Confirm:$false
    }
}

if ($changes)
{
    $preHtml = @"
<h1>$Subject</h1>
<p>The following changes are being made to mailbox permissions to sync them with the groups that have access.</p>
"@

    $emailArgs = @{}
    $emailArgs.To = $To
    $emailArgs.Subject = $Subject
    $emailArgs.Port = 587
    $emailArgs.Style = 'Ethos1'
    $emailArgs.HtmlTableArgs = @{
        PreContent = $preHtml
    }

    $changes |
        Sort-Object Identity, User |
        Send-HTMLMailMessageV2 @emailArgs
}

Get-PSSession | Remove-PSSession

$Error |
    Out-File 'C:\Scripts\Exchange Mailbox Permissions Sync\Errors.txt'


Viewing all articles
Browse latest Browse all 6937

Trending Articles