Fjerne brugere fra grupper med powershell

Fjerne brugere fra grupper i Powershell

Når man skal fjerne brugere fra grupper, enten flere brugere fra flere grupper eller bare en bruger fra en gruppe.

Så er det blevet meget nemmere med Powershell frem for den gamle måde i Active Directory Users and Computers.

Jeg har lavet et lille script som fjerner en række brugere fra flere grupper, jeg beskriver kort processen.

Jeg bruger her div. kommandoer som Remove-ADGroupMember og Get-ADGroupMember læs mere om den her Remove-ADGroupMember

Der er altid mange måder at gøre tingene på, jeg er ikke super programmør men det er learn by doing så har diverse optimeringer nederst i min artikel.

Til optimering af min søgning i Active Directory  bruger jeg Compare-Object til at sammenligne en liste med en gruppe og tage foreskellen i en fil.

Script til at fjerne brugere fra grupper

$grp = Get-Content H:\Powershells\Grupperderskalfjernesbbrugerefra.txt
$usrs = Get-Content H:\Powershells\Brugersomskalfjernes.txt
# Laver en Funktion som laver et opslag for at se om bruger er i gruppe.
function get-memberof($user,$group){
 $member = (Get-ADGroupMember -Identity $group).name -contains "$user"
    If ($member) {
           #hvis den er så skriv at du fjerner den og i hvilken gruppe
           Write-host " Fjerner $user i gruppen "
           remove-adgroupmember -identity "$group" –members $user -confirm:$false
         } 
           # Ellers skriv at den ikke findes.
         Else
         {
           Write-Host "$user Findes ikke i gruppen "
         }
}
# Kald funktion get-memberof bruger gruppe.
## Eks.: get-memberof Admintfi DomainUsers (Fjerner Admintfi fra DomainUser)
foreach ($adgroup in $grp)       { 
      #$forestUser = Get-ADUser $aduser -Server DC01PR |  
      Write-host Søger nu i $adgroup
      foreach ($aduser in $usrs) {
        get-memberof $aduser $adgroup 
        
         } 
     }

Scriptet kører nu igennem og gør hvad det skal, måske du også er interesseret i at læse om Sæt beskrivelse på Gruppe eller Kopiere gruppe medlemskaber

Selve scriptet er nu noget langsomt hvis grupperne indeholder rigtig mange brugere.

Så her er anden løsning og ret smart hvis jeg selv skal sige det, jeg bruger en compare-object i stedet for.

# En liste over grupper som skal testes og Brugere som skal slettes hvis de er der
$grp = Get-Content H:\grp.txt
$Path = "H:\deluser.txt"
# Inkluderet en Trim til out-file som fjerner tomme linier
Function trim($file,$mode)
{
	$input = Get-Content $file
	$output = $input | where {$_ -notmatch "^$" }
	If ($mode -eq 'includeblanks')
	{
		$output = $output -replace(' ','')
	}
	Set-Content $file $output
}
# har lavet en ny algoritme som tjekker om brugeren er der og ligger brugere i en fil
# Compare-Object -ReferenceObject (Get-AdGroupMember $Group | Select -ExpandProperty SamAccountName) -DifferenceObject (Get-Content $Path) -IncludeEqual | Where SideIndicator -eq "==" | Select @{Name="Name";Expression={$_.InputObject}} | Out-File H:\userstodelete.txt
 
function del-memberof($group){
 Compare-Object -ReferenceObject (Get-AdGroupMember $Group | Select -ExpandProperty SamAccountName) -DifferenceObject (Get-Content $Path) -IncludeEqual | Where SideIndicator -eq "==" | Select @{Name="Name";Expression={$_.InputObject}} | Out-File H:\userstodelete.txt
    # Jeg trimmer filen så den kan læses
    trim “h:\userstodelete.txt” includeblanks
    $users2del = Get-Content H:\userstodelete.txt
  foreach ($user in $users2del) {           
           Write-host " Fjerner $user i $group "
           remove-adgroupmember -identity "$group" –members $user -confirm:$false
           } 
    }
foreach ($grps in $grp) {
        del-memberof $grps 
        }

Get-AdGroupMember Error

Hvis man får en fejl eller error som ser sådan ud. og ens Get-ADgroupMember retunere en tom streng.

Get-ADGroupMember : The operation completed successfully
At line:1 char:41
+ Get-ADGroup "..." | Get-ADGroupMember
+ ~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (CN=...,DC=..:ADGroup) [Get-ADGroupMember], ADException
+ FullyQualifiedErrorId : The operation completed successfully,Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember

Så er det fordi at der er en tom linie eller et mellemrum i din gruppe fil.

Det kan betyde at man også har foreing security user i din gruppe member of. 

du kan så prøve at skrive flg. one-liner som erstatning. den virker helt sikkert.

(get-adgroup $group -properties member | select -expand member | get-adobject | Select -ExpandProperty name)

Den speeder din funktion op, Utroligt meget op.! som foreksempel i din compare streng.

Compare-Object -ReferenceObject (get-adgroup $group -properties member | select -expand member | get-adobject | Select -ExpandProperty name) -DifferenceObject (Get-Content $UserPath) -IncludeEqual | Where SideIndicator -eq "==" | Select InputObject | Out-File H:\userstodelete.txt

 

Skriv en kommentar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.