Сценарии Powershell: Как добавлять пользователей в группу ОБЪЯВЛЕНИЙ при перемещении пользователя из подразделения,

#powershell

Вопрос:

Я пытаюсь запустить скрипт, который проверяет, находится ли пользователь в подразделении и добавлен ли в одноименную группу безопасности, если пользователь переходит в другое подразделение, его необходимо удалить из группы и добавить в новую группу

Я понимаю концепцию того, что мне нужно сделать, но я не могу ввести ее в PowerShell.

Пользователь будет перемещаться из подразделения в подразделение, и его необходимо будет удалить из текущей группы и добавить в Новое подразделение группы, и Группы безопасности будут называться одинаково:

Структура ПОДРАЗДЕЛЕНИЯ является введите описание изображения здесь

Комментарии:

1. Вам нужно предоставить свой сценарий, и тогда мы сможем вам помочь. Пожалуйста, отправьте через скрипт, который вы уже создали.

Ответ №1:

Вам необходимо использовать Compare-object командлет.

Попробуйте это на некоторых тестовых подразделениях и тестовых учетных записях пользователей, чтобы быть в безопасности: (Обновите переменные в начале сценария, чтобы они соответствовали вашей среде…)

 $VerbosePreference = "continue"

$UserOULocation = "OU=Test unit,OU=OU1,DC=Domain,DC=local" # please update
$DCServerName = "<servername>" # please update

$ADUsers = Get-ADUser -SearchBase $UserOULocation -filter * -Properties * -Server $DCServerName
$OUNames = Get-ADOrganizationalUnit -SearchBase $UserOULocation -Filter *

Foreach ($ADUser in $ADUsers)
{
    $Groups = $ADUser.MemberOf | % {Get-ADGroup $_}
    $CurrentOU = $ADUser.distinguishedname.Split(",")[1].replace("OU=","")

    If ($Groups)
    {
        # You need to comapre the list of OUs to the groups that the account is a member of
        $Comparing = Compare-Object $CurrentOU $Groups.name

        foreach ($compare in $Comparing | Where-Object {$OUNames.name -contains $_.inputobject})
        {
            If ($Compare.SideIndicator -eq "<=")
            {
                $GroupName = $Compare.InputObject
                Write-Verbose "Adding user $($aduser.name) to group $GroupName"
                Add-ADGroupMember -Identity $Compare.InputObject -Members $ADUser.SamAccountName -Verbose
            }
            else
            {
                $GroupName = $Compare.InputObject
                Write-Verbose "Removing user $($aduser.name) from group $GroupName "
                Remove-ADGroupMember  -Identity $GroupName -Members $ADUser.SamAccountName -Verbose
            }   
        }
    }
    else
    {
        Write-Verbose "No - No groups found for user $($aduser.name)"
        Write-Verbose "ACTION - Adding user to groups"
        Add-ADGroupMember $CurrentOU -Members $ADUser.samaccountname
    }   
}

 

Комментарии:

1. Привет, большое тебе спасибо. Я проверю и обновлю вас

Ответ №2:

Если этот вопрос касается вашего желания переместить пользователя » X » в другое подразделение и, сделав это:

  1. удалите его из группы с тем же именем, что и подразделение, в котором он находится в настоящее время
  2. добавьте его в группу с тем же именем, что и подразделение, в которое он перемещен

Тогда вы могли бы сделать что-то вроде этого:

 # change these to match your configuration
$userToMove    = 'jdoe'
$destinationOU = 'OU=Accounting,DC=Europe,DC=Fabrikam,DC=com'

$user = Get-ADUser -Filter "SamAccountName -eq '$userToMove'" -ErrorAction -SilentlyContinue
if (!$user) { Write-Warning "User '$userToMove' does not exist" }
else {
    # parse the OU from the users DistinguishedName property
    $currentOU    = [regex]::Match($user.DistinguishedName, '(?i)(?=OU=).*

Сведения о регулярном выражении, используемые при анализе подразделения из имени пользователя:

 (?=           Assert that the regex below can be matched, starting at this position (positive lookahead)
   OU=        Match the characters “OU=” literally
)            
.             Match any single character that is not a line break character
   *          Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
$             Assert position at the end of the string (or before the line break at the end of the string, if any)
 


).Value
# use the OU names to get the names for the groups
$currentGroup = (Get-ADOrganizationalUnit -Identity $currentOU).Name
$newGroup = (Get-ADOrganizationalUnit -Identity $destinationOU).Name
# if you need the DisplayNames instead,add parameter -Properties DisplayName
# and get the DisplayName property value. ie:
# $currentGroup = (Get-ADOrganizationalUnit -Identity $currentOU -Properties DisplayName).DisplayName
# $newGroup = (Get-ADOrganizationalUnit -Identity $destinationOU -Properties DisplayName).DisplayName

# remove the user from the group with the same name as the OU he's currently in
Remove-ADGroupMember -Identity $currentGroup -Members $user
# add the user to the new group
Add-ADGroupMember -Identity $newGroup -Members $user
# finally move the user to the new OU
$user | Move-ADObject -TargetPath $destinationOU
}
Сведения о регулярном выражении, используемые при анализе подразделения из имени пользователя: