none
Powershell: Überprüfen ob AD User deaktiviert oder aktiviert ist!? RRS feed

  • Frage

  • Hallo Community,

    Ich bin gerade dabei einen Powershell script zu schreiben der das Überprüfen des ausgewählten Users aud "disabled" bzw. "enabled" überprüft ich habe bereits viel Hilfe gefunden und bin schlussendlich hier gelandet:

    #region user deactivated + add or remove user
    
    #checking if user is deactivated, if not the user gets a member of the group, if, he is removed
    Write-Host "Step 4: checking if user is deactivated, if not the user gets a member of the group, if, he is removed" -ForegroundColor Black -BackgroundColor Yellow
    
    #variables (with directorysearcher)
    $ds = New-Object System.DirectoryServices.DirectorySearcher
    $ds.Filter = "(&(objectCategory=User)(sAMAccountname=$($USER)))"
    $de = $ds.FindOne() 
    $de = $de.GetDirectoryEntry() 
    
    #checking if user is deactivated 
    if ($de = $ds.findone())
       {
       #adding user to the group
       Write-Host "Step 4.1 adding user to group" -ForegroundColor red -BackgroundColor Yellow
       Add-qadgroupmember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
       }
    else
        {
    	#removing and error if user is deactivated
    	 Remove-QADGroupMember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
    	 Write-Warning "User is deactivated + User is removed from group"
        }
    }
    
    #endregion

    trotzdem fügt der script auch deaktivierte User zu den Gruppen hinzu, woran kann das liegen?

    danke im Vorraus

    Domeniccc

    Dienstag, 14. Mai 2013 09:09

Antworten

  • Hallo Domenic,

    Peters Vorschlag funktioniert zwar, ist aber für die Performance eher nachteilig. Peter holt erst den Benutzer und prüft auf dem Client ob der Benutzer deaktiviert ist. Besser finde ich, wenn Du die LDAP Abfrage so anpasst, dass nur aktive Benutzerkonten gefunden werden:

     

    $ds.Filter = "(&(objectCategory=User)(sAMAccountname=$($USER)))"
    
    

    ändern zu:

    $ds.Filter = "(&(objectCategory=Person)(sAMAccountname=$($USER))(!userAccountControl:1.2.840.113556.1.4.803:=2))"

    Dadurch filterst Du die deaktivierten Konten gleich auf dem Server heraus. Der will auch mal was zu tun haben......:-)

    Bye,

    Frank



    -- Frank Röder http://blog.iteach-online.de --

    • Als Antwort markiert Domeniccc Mittwoch, 15. Mai 2013 09:34
    Dienstag, 14. Mai 2013 19:17

Alle Antworten

  • Hallo,

    das liegt mit Sicherheit daran, dass das Suchen ueber die ADSI-Schnittstelle auch deaktivierte User liefert, deine IF Abfrage aber daruf spekuliert, dass nur aktive User gefunden werden!

    Den Status des Kontos findest Du in der Eigenschaft UserAccountControl, bei dir also
    $de.properties.UserAccountControl
    Naehers hier:

    http://support.microsoft.com/kb/305144


    Beste Gruesse
    Martin


    • Bearbeitet brima Dienstag, 14. Mai 2013 09:29
    Dienstag, 14. Mai 2013 09:21
  • Hi,

    um zu überprüfen welche Benutzerkonten deaktiviert sind reicht folgender Befehl:

    Get-ADUser -Filter *|Where{$_.Enabled -eq "False"}

    Benutzerkonten aktiviert:

    Get-ADUser -Filter *|Where{$_.Enabled -eq "True"}
    Das Ganze kann man noch weiter pipen, so dass eine Ausgabe in eine Datei erfolgt.

    Viele Grüße Daniel Neumann - This posting is provided "AS IS" with no warranties, and confers no rights.

    Dienstag, 14. Mai 2013 09:22
  • #checking if user is deactivated 
    if ((Get-QADUser -Name $USER).userAccountControl -band 2) {
         "User $User is Disabled!"
    }
    else {
     "User $User is Active!"
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 14. Mai 2013 09:28
  • Hallo Daniel !

    Du benutzt die Microsoft Cmdlets diese müssen oft als Modul nachgeladen werden!
    Er benutzt die Quest Cmdlets und [Adsi] soll er noch eine dritte AD Technik nutzen?


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 14. Mai 2013 09:41
  • Hallo Peter,

    deine Variante funktioniert leider auch nicht,

    ich kann mir leider kein Reim draus machen.

    Dienstag, 14. Mai 2013 11:22
  • Ich denke du solltest deinen jetzigen Code wieder posten, da, wie Peter schon sagte, es munter durcheinander geht, ADSI, Quest, ...

    Best regards
    brima
    Dienstag, 14. Mai 2013 11:28
  • Hi birma,

    ich habe nichts verändert nur getestet der code is der selbe s.o.

    #region user deactivated + add or remove user
    
    #checking if user is deactivated, if not the user gets a member of the group, if, he is removed
    Write-Host "Step 4: checking if user is deactivated, if not the user gets a member of the group, if, he is removed" -ForegroundColor Black -BackgroundColor Yellow
    
    #variables (with directorysearcher)
    $ds = New-Object System.DirectoryServices.DirectorySearcher
    $ds.Filter = "(&(objectCategory=User)(sAMAccountname=$($USER)))"
    $du = $ds.FindOne() 
    $de = $du.GetDirectoryEntry()
    
    #checking if user is deactivated 
    if ($de = $ds.findone())
       {
       #adding user to the group
       Write-Host "Step 4.1 adding user to group" -ForegroundColor red -BackgroundColor Yellow
       Add-qadgroupmember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
       }
    else
        {
    	#removing and error if user is deactivated
    	Remove-QADGroupMember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
    	Continue
        }
    }
    
    #endregion


    • Bearbeitet Domeniccc Dienstag, 14. Mai 2013 12:37
    Dienstag, 14. Mai 2013 12:36
  • #region user deactivated + add or remove user
    
    #checking if user is deactivated, if not the user gets a member of the group, if, he is removed
    Write-Host "Step 4: checking if user is deactivated, if not the user gets a member of the group, if, he is removed" -ForegroundColor Black -BackgroundColor Yellow
    
    
    #checking if user is deactivated 
    if ((Get-QADUser -Name $USER).userAccountControl -band 2) {
    	#removing and error if user is deactivated
    	Remove-QADGroupMember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
    	continue
       }
    else
       {
       #adding user to the group
       Write-Host "Step 4.1 adding user to group" -ForegroundColor red -BackgroundColor Yellow
       Add-qadgroupmember -Identity "CN=$($_.GROUPNAME),OU=$($_.OU),OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int" -Member $_.USER
    }
    
    #endregion

    Dann probier mal diesen, Peters Loesung fuer das Pruefen ob enable oder disable und nur Quest....

    Beste Gruesse
    brima

    Dienstag, 14. Mai 2013 12:58
  • Hallo Domenic,

    Peters Vorschlag funktioniert zwar, ist aber für die Performance eher nachteilig. Peter holt erst den Benutzer und prüft auf dem Client ob der Benutzer deaktiviert ist. Besser finde ich, wenn Du die LDAP Abfrage so anpasst, dass nur aktive Benutzerkonten gefunden werden:

     

    $ds.Filter = "(&(objectCategory=User)(sAMAccountname=$($USER)))"
    
    

    ändern zu:

    $ds.Filter = "(&(objectCategory=Person)(sAMAccountname=$($USER))(!userAccountControl:1.2.840.113556.1.4.803:=2))"

    Dadurch filterst Du die deaktivierten Konten gleich auf dem Server heraus. Der will auch mal was zu tun haben......:-)

    Bye,

    Frank



    -- Frank Röder http://blog.iteach-online.de --

    • Als Antwort markiert Domeniccc Mittwoch, 15. Mai 2013 09:34
    Dienstag, 14. Mai 2013 19:17
  • Hallo Frank,

    das habe ich getan und folgende Fehldermeldung bekommen:

    Step 3: checking if group allready exists, if not the group is going to be created
    Step 3.1: creating new group
    test_test_group                group           CN=test_test_group,OU=fs01,OU=Gruppen,OU=Users,OU=KL,OU=D,OU=KL-Group,DC=kl,DC=int                
    Step 4: checking if user is deactivated, if not the user gets a member of the group, if, he is removed
    Ausnahme beim Aufrufen von "FindOne" mit 0 Argument(en):  "The (&(objectCategory=Person)(sAMAccountname=)(!userAccountControl:1.2.840.113556.1.4.
    803:=2)) search filter is invalid."
    Bei C:\temp\ps\Scripts\activedirectory_script\script_file\ADDS_groups_user.ps1:130 Zeichen:18
    + $du = $ds.FindOne <<<< () 
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException
     
    Ausnahme beim Aufrufen von "FindOne" mit 0 Argument(en):  "The (&(objectCategory=Person)(sAMAccountname=)(!userAccountControl:1.2.840.113556.1.4.
    803:=2)) search filter is invalid."
    Bei C:\temp\ps\Scripts\activedirectory_script\script_file\ADDS_groups_user.ps1:134 Zeichen:22
    + if ($du = $ds.FindOne <<<< ())
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : DotNetMethodException

    sorry mein fehler,

    der sich eingeschlichen hat,

    es heißt nicht $($USER) sondern $($_.USER)

    somit funktioniert der check danke an frank ;)


    • Bearbeitet Domeniccc Mittwoch, 15. Mai 2013 09:43 funktioniert
    Mittwoch, 15. Mai 2013 09:06