none
get-aduser | set-aduser --> Logfile? RRS feed

  • Frage

  • Guten Morgen,

    ich möchte gerne abfragen, welche realen Benutzer alle das PasswordNeverExpires auf True gesetzt haben. Im Feld Description steht bei mir immer "Mr", "Mrs", "Mr." oder "Mrs.", diese Felder nehme ich zur Identifikation eines Benutzers. Danach setze ich direkt den set-aduser, um das PasswordNeverExpires auf False zu setzen: 

    Get-ADUser -Filter {(Description -eq 'Mr' -or Description -eq 'Mrs' -or Description -eq 'Mr.' -or Description -eq 'Mrs.') -and (objectclass -eq "User") -and (PasswordNeverExpires -eq 'False')} | set-aduser -PasswordNeverExpires $False

    Wie kann ich es jetzt noch einbauen, dass zusätzlich ein Logfile geschrieben wird mit "Datum, samaacountname" um zu dokumentieren, bei welchen Benutzern dieser Wert auf PasswordNeverExpires auf False gesetzt wurde?

    Danke & Gruß,

    Julian.

    Mittwoch, 15. Juli 2015 08:46

Antworten

  • Hallo,

    ich würde dir zwei Möglichkeiten empfehlen. Entweder du schreibst deine gefundenen Nutzer in eine Variable und nimmst diese dann.:

    $AllUserNeverExpired= Get-ADUser -Filter <Dein Filter> 
    
    foreach($UserNeverExpired in $AllUserNeverExpired)
            {
                Set-ADUser -Identity $UserNeverExpired -PasswordNeverExpires $false
            
            }
        $AllUserNeverExpired | select samaacountname, @{label='Date';Expression={Get-Date}} | Out-File -FilePath c:\tmp\NeverExpired.txt

    zugegeben, da ist keine Fehlerbehandlung dabei und wenn es bei einem Nutzer nicht klappt, steht dieser trotzdem in der Liste.

    Alternativ kannst du das auch Zeilenweise in eine Datei ausgaben, oder brauchst du das zwingend als Tabelle? Da musst du mit einer Hashtable arbeiten. Aber das wäre ein Ansatz:

    $output = "c:\tmp\Nervexpired.txt"
    New-Item -Path $output -Type file
    
    $AllUserNeverExpired= Get-ADUser  | ForEach-Object 
    
    {
        Set-ADUser -Identity $_.name -PasswordNeverExpires $false
        $samaccountname = $_.samaccountname
        $date = Get-Date
        
        Add-Content -Value "$samaccountname $date" -Path $output
    
    
    }

    Ist jetzt nix elegantes aber ein alternativer Ansatz.

    Grüße Andy

    https://joinpowershell.wordpress.com

    Mittwoch, 15. Juli 2015 12:22

Alle Antworten

  • Hallo,

    ich würde dir zwei Möglichkeiten empfehlen. Entweder du schreibst deine gefundenen Nutzer in eine Variable und nimmst diese dann.:

    $AllUserNeverExpired= Get-ADUser -Filter <Dein Filter> 
    
    foreach($UserNeverExpired in $AllUserNeverExpired)
            {
                Set-ADUser -Identity $UserNeverExpired -PasswordNeverExpires $false
            
            }
        $AllUserNeverExpired | select samaacountname, @{label='Date';Expression={Get-Date}} | Out-File -FilePath c:\tmp\NeverExpired.txt

    zugegeben, da ist keine Fehlerbehandlung dabei und wenn es bei einem Nutzer nicht klappt, steht dieser trotzdem in der Liste.

    Alternativ kannst du das auch Zeilenweise in eine Datei ausgaben, oder brauchst du das zwingend als Tabelle? Da musst du mit einer Hashtable arbeiten. Aber das wäre ein Ansatz:

    $output = "c:\tmp\Nervexpired.txt"
    New-Item -Path $output -Type file
    
    $AllUserNeverExpired= Get-ADUser  | ForEach-Object 
    
    {
        Set-ADUser -Identity $_.name -PasswordNeverExpires $false
        $samaccountname = $_.samaccountname
        $date = Get-Date
        
        Add-Content -Value "$samaccountname $date" -Path $output
    
    
    }

    Ist jetzt nix elegantes aber ein alternativer Ansatz.

    Grüße Andy

    https://joinpowershell.wordpress.com

    Mittwoch, 15. Juli 2015 12:22
  • Hi Andy,

    cool, ich probiere es aus und gebe dir Rückmeldung! Vielen Dank schon mal! :) Und nein, ich benötige keine Tabelle, ein einfaches File genügt.

    Bei dem zweiten Beispiel, sind dann die Variable so aus:

    $AllUserNeverExpired= Get-ADUser -Filter {(Description -eq 'Mr' -or Description -eq 'Mrs' -or Description -eq 'Mr.' -or Description -eq 'Mrs.') -and (objectclass -eq "User") -and (PasswordNeverExpires -eq 'False')} | ForEach-Object

    richtig?

    GRüße/Julian.

    Mittwoch, 15. Juli 2015 13:08
  • Hi, 

    sorry das war mein Fehler beim Testen habe ich noch mit der Variable $AllUserNeverExpired gearbeitet. Also einfach die Variable im zweiten Beispiel weglassen und dann sollte es passen. 

    Ein kleiner Tipp noch, wenn du eine große AD-Umgebung hast solltest du dir dein Filter in ein LdapFilter umschreiben. Der LadapFilter ist nochmal um einige klassen besser. Ich kann es jetzt nicht Testen, aber dein Filter könnte in etwa so aussehen:

    Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=65536)(Description=Mr??))"

    Der wert UserAccountControl besagt, dass es sich um ein Konto handelt, bei dem das PW auf "läuft nie ab" gesetzt ist. Bei deiner Beschreibung, habe ich einfach mit Jokerzeichen gearbeitet, erspart die die vielen oder Abfragen. Voraussetzung ist nur, dass es keine Beschreibung gibt, die die gleiche Syntax hat du aber nicht in deiner Abfrage haben willst. Aber bei Mr?? ist das sehr unwahrscheinlich ?

    Grüße 

    Andy

    Mittwoch, 15. Juli 2015 16:04
  • Hi Andy,

    vielen Dank für deine Mühe - finde ich wirklich super wie du mir hilfst! Wenn ich in dem zweiten Beispiel die Variable weg lasse, dann fehlt mir der Filter für das Feld Description (Mr., Mrs..). Denn nur mit durch das Feld Description kann ich einen echten User identifizieren und verhindere, dass Service-Accounts versehentlich mit darunter sind.

    Grüße,

    Julian.

    • Bearbeitet Julian79 Donnerstag, 16. Juli 2015 06:29
    Donnerstag, 16. Juli 2015 06:29