none
Usermaker Active Directory (doppelte User) RRS feed

  • Frage

  • Ich bin absolut neu bei Powershell. Ich versuche für meinen AD Usermaker eine Funktion einzubauen, um alternative Usernamen zu vergeben, wenn der angedachte bereits vergeben ist. Dafür habe ich eine If Bedingung erstellt, um den angedachten Usernamen, mit den existierenden Usern zu vergleichen

    Der Code, den ich dafür benutzen will, sieht so aus:

    if(Get-ADuser -Filter {sAMAccountName -eq ($txtFirstName.text.ToLower()[0]+$txtLastName.text.ToLower())}

    Das ist die Fehlermeldung, die ich rauskriege:

    Get-ADuser : Fehler beim Analysieren der Abfrage: "sAMAccountName -eq ($txtFirstName.text.ToLower()[0]+$txtLastName.text.ToLower())" Fehlermeldung: "syntax error" an folgender
    Position: "20".
    In C:\xxx\Desktop\usermaker2.0.ps1:306 Zeichen:4
    + if(Get-ADuser -Filter {sAMAccountName -eq ($txtFirstName.text.ToLower ...
    +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ParserError: (:) [Get-ADUser], ADFilterParsingException
        + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft.ActiveDirectory.Management.Commands.GetADUser

    Vielen Dank für Eure Hilfe!


    • Bearbeitet nu11ahnung Montag, 24. September 2018 11:04
    Montag, 24. September 2018 11:02

Antworten

  • Auch auf die Gefahr hin, unhöflich oder anmassend zu erscheinen, aber ich möchte mich wirklich nicht durch diesen verworrenen und schlecht fomrattierten Code ackern. Wenn der komplett von Dir ist, würde ich Dich gerne nochmal "auf die Schulbank" schicken - schau Dir bitte nochmal Grundlagen und vielleicht Style Guide und Best Practices an. Ist er von jemand anderem, würde ich Dich bitten, den Code einmal mit ca 150 Kopien auszudrucken und dem Author kräftig mehrmals um die Ohren zu hauen. ;-) :-D

    z.B. benutzt Du Variablen, die offenbar ausserhalb der Funktion gefüllt werden oder Du hast leere Code-Blöcke im Code ( "esle{}" ) und auskommentierten Code ... was sollen wir damit anfangen?

    Hier mal ein ganz kurzes Beispiel, wie man sich der Aufgabe initial nähern könnte:

    function Get-UniqueSamAccountName {
    	[OutputType([System.String])]
    	param(
    		[Parameter(Position=0, Mandatory=$true)]
    		[ValidateNotNullOrEmpty()]
    		[System.String]
    		$Vorname,
    
    		[Parameter(Position=1, Mandatory=$true)]
    		[ValidateNotNullOrEmpty()]
    		[System.String]
    		$Nachname
    	)
        $NewUniqueSamAccountName = $Vorname[0] + $Nachname
        $Count = 0
        While(Get-ADUser -Filter "sAMAccountname -eq '$NewUniqueSamAccountName'" ) {
            $Count++
            $NewUniqueSamAccountName = $NewUniqueSamAccountName +$Count
        }
        $NewUniqueSamAccountName
    }
    Das sind nur ein paar Zeilen aber der Code funktioniert (wenigstens in meiner Umgebung) und Du kannst ihn schrittweise so weit erweitern, wie Du es brauchst. Es ist aber empfehlenswert, Funktionen immer so einfach wie möglich zu halten. Das macht sie üblicherweise universell einsetzbar und leichter zu debuggen oder falls nötig anzupassen.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    Montag, 24. September 2018 23:41

Alle Antworten

  • Die Anwort auf die von Dir implizierte Frage ist nicht so einfach, weil Du nicht genug von Deinem Code zeigst.

    Vielleicht schaust Du Dir die Hilfe für Get-ADUser und auch speziell die für about_ActiveDirectory_Filter nochmal an. Der Parameter Filter erwartet eigentlich keinen Scriptblock sondern einen String. Ich würde also die "Konstruktion" des erwarteten sAMAccountNamens vorher erledigen und dem Filter den fertigen String verfüttern.

    ... so ungefähr:

    $txtFirstName = 'Vorname'
    $txtLastName = 'Nachname'
    $EstimatedsAMAccountName = $txtFirstName[0] + $txtLastName
    if(Get-ADuser -Filter {sAMAccountName -eq $EstimatedsAMAccountName}){
        'cool'
    }
    Else{
        'uncool'
    }


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Montag, 24. September 2018 12:05
    Montag, 24. September 2018 12:05
  • Das Folgende ist der Code, den ich jetzt habe. Ich möchte, dass wenn es eine Namenskombination bereits gibt, eine Zahl hintenanzuhängen. sprich Thomas Müller -> tmüller1... Wenn ich meinen Usermaker jetzt laufen lasse kriege ich trotz der bedingungen tmüller
    Function Set-sAMAccountName {
        Param([Switch]$Csv=$false)
        if(!$Csv)
            {
            $GivenName = $txtFirstName.text
            $SurName = $txtLastName.text
            }
        else{}
    #$est = ($GivenName.ToLower()[0] + $SurName.ToLower())
    $est = ($GivenName.ToLower()[0] + $SurName.ToLower())
    $estuser = (Get-ADuser -Filter {sAMAccountName -eq $est })
    if($estuser -eq $null)
    {
        Switch($XML.Options.Settings.sAMAccountName.Style | Where{$_.Enabled -eq $True} | Select -ExpandProperty Format)
    {
            "FirstName.LastName"    {"{0}.{1}" -f ($GivenName.ToLower()),$Surname.ToLower()}
            "FirstInitialLastName"  {"{0}{1}" -f ($GivenName.ToLower()[0] + $SurName.ToLower())}
            "LastNameFirstInitial"  {"{0}{1}" -f $SurName.ToLower(),($GivenName.ToLower())[0]}
            Default                 {"{0}.{1}" -f $GivenName.ToLower(),$Surname.ToLower()}
         <#   {
            "FirstName.LastName"    {"{0}.{1}" -f ($GivenName.ToLower()),$Surname.ToLower()}
            "FirstInitialLastName"  {"{0}{1}" -f ($GivenName.ToLower())[0],$SurName.ToLower()}
            "LastNameFirstInitial"  {"{0}{1}" -f $SurName.ToLower(),($GivenName.ToLower())[0]}
            Default                 {"{0}.{1}" -f $GivenName.ToLower(),$Surname.ToLower()}
    #>
     } 
    }
    else
    {
    $i = 1
    $alt = ($GivenName.ToLower()[0] + $SurName.ToLower() + $i.ToString())
    $altuser = (Get-ADuser -Filter {sAMAccountName -eq $alt})
    while ($altuser -ne $null)
    {
    for ($i=1; $i -le 10; $i++) {
     $alt = ($GivenName.ToLower()[0] + $SurName.ToLower() + $i.ToString())
    $altuser = (Get-ADuser -Filter {sAMAccountName -eq $alt})
    }
    }
    Switch($XML.Options.Settings.sAMAccountName.Style | Where{$_.Enabled -eq $True} | Select -ExpandProperty Format)
     {
    "FirstInitialLastName"  {"{0}{1}" -f ($GivenName.ToLower())[0],$SurName.ToLower(),$i.ToString()}
    }
    }
    }

    Montag, 24. September 2018 14:29
  • Auch auf die Gefahr hin, unhöflich oder anmassend zu erscheinen, aber ich möchte mich wirklich nicht durch diesen verworrenen und schlecht fomrattierten Code ackern. Wenn der komplett von Dir ist, würde ich Dich gerne nochmal "auf die Schulbank" schicken - schau Dir bitte nochmal Grundlagen und vielleicht Style Guide und Best Practices an. Ist er von jemand anderem, würde ich Dich bitten, den Code einmal mit ca 150 Kopien auszudrucken und dem Author kräftig mehrmals um die Ohren zu hauen. ;-) :-D

    z.B. benutzt Du Variablen, die offenbar ausserhalb der Funktion gefüllt werden oder Du hast leere Code-Blöcke im Code ( "esle{}" ) und auskommentierten Code ... was sollen wir damit anfangen?

    Hier mal ein ganz kurzes Beispiel, wie man sich der Aufgabe initial nähern könnte:

    function Get-UniqueSamAccountName {
    	[OutputType([System.String])]
    	param(
    		[Parameter(Position=0, Mandatory=$true)]
    		[ValidateNotNullOrEmpty()]
    		[System.String]
    		$Vorname,
    
    		[Parameter(Position=1, Mandatory=$true)]
    		[ValidateNotNullOrEmpty()]
    		[System.String]
    		$Nachname
    	)
        $NewUniqueSamAccountName = $Vorname[0] + $Nachname
        $Count = 0
        While(Get-ADUser -Filter "sAMAccountname -eq '$NewUniqueSamAccountName'" ) {
            $Count++
            $NewUniqueSamAccountName = $NewUniqueSamAccountName +$Count
        }
        $NewUniqueSamAccountName
    }
    Das sind nur ein paar Zeilen aber der Code funktioniert (wenigstens in meiner Umgebung) und Du kannst ihn schrittweise so weit erweitern, wie Du es brauchst. Es ist aber empfehlenswert, Funktionen immer so einfach wie möglich zu halten. Das macht sie üblicherweise universell einsetzbar und leichter zu debuggen oder falls nötig anzupassen.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''


    Montag, 24. September 2018 23:41

  • $NewUniqueSamAccountName = $NewUniqueSamAccountName +$Count

    tmueller1
    tmueller12
    tmueller123

    SCNR... :-)) Mußt nen $UniqueBaseName mitschleppen, dann klappt es besser.

    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Dienstag, 25. September 2018 11:30
  • Der Martin hat natürlich Recht, aber "unique" wären die sAMAccountNamen auch so ...   :-P  ... und nach meiner Erfahrung halten sich solche Namensdopplungen auch in relativ engen Grenzen.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 25. September 2018 11:57