Aravinda
Aravinda

Reputation: 505

Rename AD groups using two PowerShell arrays

I'm trying to rename existing AD groups in this way.

AD groups starting # to be renamed to the same name without #. For example , I have #dl1 and I wish to get it renamed dl1 (omitting #)

Im trying to rename following four users first.

enter image description here

I have written two arrays, in this manner. ($myArray and $myArray2).

$myArray =@(
$data = Get-ADGroup -Filter {name -like "#*"} |select samaccountname
$data.samaccountname |  foreach {$_.split("#")[1]
}
)

$myArray2 =@(
$assdf=Get-ADGroup -Filter {name -like "#*"}
$myArray2 =@($assdf)
$num=0
foreach($a in $assdf)
{
$myArray2[$num] 
$num=$num+1  
}
)

If I print $myarray it gives exact results, that I wish, in this way.

enter image description here

and also if I print $myarray2 it gives the desired results in this way,

enter image description here

the missing piece of the puzzle is combining those two arrays to run the final command that is

set-adgroup -identity (members indide $myArray2) -samaccountname (members indide $myArray)

For hours, I have tried numerous methods to get set-adgroup .. using for each loop etc.

for example,

$a=0 

foreach ($item in $myArray2) 
{
  
 
  $nameto_replace=$myArray[$a]
  Set-adgroup -identity $item.samaccountname -samaccountname $nameto_replace
  $a=$a+1

}

Can anyone please shed some light, please? I am totally out of ideas now. thanks in advance

Upvotes: 0

Views: 2353

Answers (2)

Theo
Theo

Reputation: 61263

There is no need to perform Get-ADGroup twice, where you can use it once and loop over the results in a ForEach-Object loop:


Updated as per Aravinda's helpful observation

Get-ADGroup -Filter "Name -like '#*'" | ForEach-Object {
    $newName = $_.Name.TrimStart('#')
    Write-Host "Renaming group $($_.Name).. to '$newName'"
    # replace only the SamAccountName
    $_ | Set-ADGroup -SamAccountName $newName

    # or replace multiple properties at the same time.
    # You need to use the LDAP names here, so mind the casing !
    # See http://www.selfadsi.org/group-attributes.htm
    # $_ | Set-ADGroup -Replace @{sAMAccountName = $newName; displayName = $newName}
}

You can limit the search to a specified OU if you want by adding the OU's DistinguishedName with the -SearchBase parameter

Upvotes: 3

Aravinda
Aravinda

Reputation: 505

Theo's answer is fantastic!

Following is the one finally I used derived from theo's answer.

Get-ADGroup -Filter "Name -like '#*'" | ForEach-Object {
$newName = $_.Name.TrimStart('#')

$_ | Set-ADGroup -Replace @{sAMAccountName = $newName;displayName = $newName} 

$_ | Rename-ADObject -NewName $newName
}

If you try using set-adgroup to change 'name' and 'CN' and it gives below error.

"Set-ADGroup : The directory service cannot perform the requested operation on the RDN attribute of an object"

To change multiple attributes, especially including Name and CN, combination of Rename-ADObject and Set-ADGroup can be used.

Upvotes: 1

Related Questions