Quantcast
Channel: Rob V IT
Viewing all articles
Browse latest Browse all 64

Dynamic Group population and Role based Access PowerShell

$
0
0

For a customer i created a script which create new groups for all kind of unique jobtitles available in Active Directory. After the creation of all groups it loops through all users and add these to the created groups in the function above. This scripts help you to maintain for example role base access.

This scripts contains 3 functions:
1. Creating groups for all the unique jobtitle’s available.
2. Adding users with the same Jobtitle
3. Remove users after jobtitle change

 

<#
.SYNOPSIS
  Dynamic ADGroup population with PowerShell.

.DESCRIPTION
  This scripts contains 3 functions: 
   1. Creating groups for all the unique jobtitle's available.
   2. Adding users with the same Jobtitle
   3. Remove users after jobtitle change

.PARAMETER <Parameter_Name>
    $DynamicGroupOU = "OU=Functions,OU=Company,OU=Contoso,DC=contoso,DC=com"
    $GroupScope = "global"
    $logfile = "C:\Temp\Joblog.log"

.INPUTS
    CreateNewJobTitleGroups -usersWithJobTitle $usersWithJobTitle -DynamicGroupOU $DynamicGroupOU -GroupScope $GroupScope
    AddUsersJobTitleGroups -DynamicGroupOU $DynamicGroupOU
    RemoveUsersJobTitleGroups -DynamicGroupOU $DynamicGroupOU

.OUTPUTS
    Log file stored in C:\Windows\Temp\<name>.log>

.NOTES
  Version:        1.0
  Author:         Rob Verhees
  Creation Date:  16-11-2018
  Purpose/Change: Initial script development
  
#>


Function Write-Log {
    [CmdletBinding()]
    Param(
    [Parameter(Mandatory=$False)]
    [ValidateSet("INFO","WARN","ERROR","FATAL","DEBUG")]
    [String]
    $Level = "INFO",

    [Parameter(Mandatory=$True)]
    [string]
    $Message,

    [Parameter(Mandatory=$False)]
    [string]
    $logfile
    )

    $Stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
    $Line = "$Stamp $Level $Message"
    If($logfile) {
        Add-Content $logfile -Value $Line
    }
    Else {
        Write-Output $Line
    }
}



Function CreateNewJobTitleGroups {

    Param(
        $usersWithJobTitle,
        $DynamicGroupOU,
        $GroupScope
    )

    $jobGroups = $usersWithJobTitle | Group-Object title
    $UniqueJobGroups = ($jobGroups | select group).group.title | select -Unique $_

    Foreach($Unique in $UniqueJobGroups) {

        $adGroup = Get-ADGroup -SearchBase $DynamicGroupOU -Filter * | where{$_.name -like $Unique}
        
        if(!$adGroup){

            try {
                write-log -Level INFO -Message "Creating new group: $unique" -logfile $logfile
                New-ADGroup -GroupScope $GroupScope -Path $DynamicGroupOU -Name $Unique
        
            } Catch {
                write-log -Level ERROR -Message "Failed to create group: $unique" -logfile $logfile
                Write-log -Level ERROR -Message $_.exception.message -logfile $logfile
            }
    
        }

    }

}

function AddUsersJobTitleGroups {

    Param (
        $DynamicGroupOU
    )
    
    $adGroups = Get-ADGroup -SearchBase $DynamicGroupOU -Filter *

    foreach($adGroup in $adGroups){

        $adRoleMembers = get-aduser -Filter * -Properties sAMAccountName,Title | where {$_.title -eq $adGroup.name -and $_.enabled -eq $true} 
           
        foreach($adRoleMember in $adRoleMembers){
    
            if(($adgroup | Get-ADGroupMember | where{$_.ObjectGUID -eq $($adRoleMember.ObjectGUID)} | select -ExpandProperty ObjectGUID) -ne $adRoleMember.ObjectGUID){
    
                write-log -Level INFO -Message "Adding new member: $($adrolemember.name) to $($adgroup.Name)" -logfile $logfile
                
                Try {
                    Add-ADGroupMember $adGroup -Members $adRoleMember

                } Catch {
                     Write-Log -Level ERROR -Message $_.exception.message -logfile $logfile

                }
            }

        }

    }

}

function RemoveUsersJobTitleGroups {

    Param (
        $DynamicGroupOU

    )
   
   
    $adGroups = Get-ADGroup -SearchBase $DynamicGroupOU -Filter *

    foreach($adGroup in $adGroups){
        $currentAdGroupMembers = Get-ADGroupMember $adGroup
        
        foreach($currentAdGroupMember in $currentAdGroupMembers) {
            
            if((Get-ADUser -Identity $currentAdGroupMember.objectGUID.guid -Properties title | select -ExpandProperty title) -ne $adGroup.name){
                
                write-log -Level INFO -Message "Removing: $($currentAdgroupmember.name) because JobTitle is changed" -logfile $logfile
                
                Try {
                    
                    Remove-ADGroupMember -identity $adGroup -members $currentAdGroupMember -Confirm:$false
                
                } Catch {
                   
                    Write-log -Level ERROR -Message $_.exception.message -logfile $logfile
                
                }

            } Elseif((Get-ADUser -Identity $currentAdGroupMember.objectGUID.guid | select -ExpandProperty Enabled) -eq $false  ){
                
                write-log -Level INFO -Message "Removing Disabled User: $($currentAdGroupMember.name)" -logfile $logfile
      
                Try {
                    
                    Remove-ADGroupMember -identity $adGroup -members $currentAdGroupMember -Confirm:$false
                
                } Catch {
                   
                    Write-log -Level ERROR -Message $_.exception.message -logfile $logfile
                
                }

            } Else {
                #Do Nothing
            }


        }
         

    }

}


$usersWithJobTitle = get-aduser -Filter *  -Properties sAMAccountName,Title | where {$_.title -notlike $null -and $_.enabled -eq $true}
$DynamicGroupOU = "OU=Functions,OU=Company,OU=Contoso,DC=contoso,DC=com"
$GroupScope = "global"
$logfile = "C:\Temp\Joblog.log"

CreateNewJobTitleGroups -usersWithJobTitle $usersWithJobTitle -DynamicGroupOU $DynamicGroupOU -GroupScope $GroupScope
AddUsersJobTitleGroups -DynamicGroupOU $DynamicGroupOU
RemoveUsersJobTitleGroups -DynamicGroupOU $DynamicGroupOU

 

The post Dynamic Group population and Role based Access PowerShell appeared first on Rob V IT.


Viewing all articles
Browse latest Browse all 64

Trending Articles