none
Script bringt nicht das gewünschte Ergebnis.

    Frage

  • Hallo liebe Community. Ich bin noch blutiger Anfänger, also verzeiht, wenn mein Script ineffizient und schlecht geschrieben ist.

    Ich verwende folgendes Script bzw teste es momentan :

    cls
    # LÄD FUNKTION ZUM ÖFFNEN EINES INPUT-FENSTERS
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
    
    
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Anrede des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $anrede = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Nachname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $username = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Vorname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $uservname = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Titel des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $usertitel = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Abteilung des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $abtei = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    
    
    
    $uservname1 = $uservname.remove(1.30)
    
    $Account = $username+"."+$uservname1
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname1
    }
    Else 
    {
    $uservname2= $uservname.remove(2.30)
    $Account = $username+"."+$uservname2
    
    }
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname2
    }
    Else 
    {
    $uservname3= $uservname.remove(3.30)
    $Account = $username+"."+$uservname3
    
    }
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname3
    }
    $Account


    Am ende soll er mir eigentlich einen Accountnamen ausgeben der aus dem kompletten Nachnamen besteht plus einem Punkt dazwischen und danach, je nachdem, ob der Nutzer bereits im AD existiert, 1, 2 oder 3 Buchstaben vom Vornamen anzeigen.

    nach diesem Script steht aber immer nur "Nachname." keine Spur von den Buchstaben des Vornamens. Was mache ich falsch. Und noch eine weitere Frage, sucht Powershell automatisch im gesamten Verzeichnis oder nur in der Domäne in der es ausgeführt wird? Unsere Nutzer sollen Domänenübergreifend einzigartig sein.

    Vielen Dank schon mal!

    Mit freundlichen Grüßen

    Antenne


    Montag, 8. Januar 2018 09:44

Alle Antworten

  • verzeiht, wenn mein Script ineffizient und schlecht geschrieben ist.

    Das sei jedem verziehen, es ist ja ein Hilfe- und Support-Forum. Aber verwende bitte das Code-Editor-Fenster, um den Code a. lesbar und b. kopierbar zu halten.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 8. Januar 2018 10:25
  • Den Vornamen bekommt man mit:

    $Vorname = Get-AdUser ..... $Vorname.Givenname

    Den letzten Codeschnipsel kann man dann noch mit Remove etc. bearbeiten.
    Mit

    Get-ADUser -Filter {Samaccountname -like "*Testuser*"} -Properties * | Select *

    erhält man dann auch eine Auflistung aller möglicher Eigenschaften, welche mit $Variable.Eigenschaftsname angewählt werden können.
    Das Ganze lässt sich auch ohne weiteres mit der Powershell umsetzen, ohne dass VB genutzt werden muss.


    Set-Aduser -filter {Samaccountname -like "*Testuser*"} -Givenname $Vorname
    wäre dann zum setzen des Vornamens einsetzbar.
    • Bearbeitet BeatYa Montag, 8. Januar 2018 12:07
    Montag, 8. Januar 2018 12:05
  • Soweit ich das verstehe, ist in deinem Fall der Benutzer nicht in der Domäne enthalten, richtig? Dass das Resultat nachher "nur" der Nachname und ein Punkt ist, ist insofern logisch, weil alle deine else-Teile nur dann angewendet werden, wenn ein Benutzer vorhanden ist. 

    Beispiel: Ich gebe die Daten für Benutzer "Manfred Test" ein. Dieser Benutzer ist nicht in der Domäne existent. Demnach macht dein Programm zuerst die Abfrage auf das AD, ob der Benutzer enthalten ist (was er nicht ist). Die Variable $Account ist dann "Test.M". Nachher kommt wieder eine AD-Abfrage mit dem gleichen Ergebnis. Dabei wird $Account mit den Werten von $username und $uservname2 definiert. Aber Achtung: Hier ist dann der Fehler. 

    if ($User -eq $Null)
    {
        $Account = $username+"."+$uservname2
    }

    Du benutzt hier die Variable $uservname2, die eigentlich gar nicht existiert. In der oberen If-Schlaufe definierst du nur den Account, nicht aber diese Variable. Die wird nur definiert, wenn der Account im AD vorhanden ist. 

    Selbiges mit der Variable $uservname3. Die wird auch erst definiert, wenn der Account im AD vorhanden ist. Dein Skript retourniert dann am Schluss das, was es soll: Den Nachnamen + ein Punkt und dann nichts mehr, da die Variablen nicht definiert, sprich leer, sind. 

    Montag, 8. Januar 2018 12:11
  • Ahhh vielen Dank. Wie kann ich die Abfrage anders gestalten? Wenn der Nutzer vorhanden ist, ist es kein Problem, aber wenn nicht, haut die Abfrage ja nicht hin. Zweites Problem. Wie lasse ich Powershell im gesamten Verzeichnis suchen und nicht nur in unserer Domäne?

    Nachtrag:

    Ich verstehe nicht ganz warum die variable $uservname2 und $uservname3 keinen Wert bekommen. 

    in dieser Zeile :

    $uservname2= $uservname.remove(2.30)
    $Account = $username+"."+$uservname2
    wird doch dem $uservname2 ein wert mitgeteilt, nämlich der $uservname mit 2 Stellen. Wieso ist dieser wert dann nicht mehr vorhanden? Ich würde es verstehen wenn am Ende immer ein Benutzername mit 3 Buchstaben vom Vornamen heraus kommt. Aber leer kann ich irgendwie nicht nachvollziehen.

    Montag, 8. Januar 2018 12:18
  • Deine $uservname2 und $uservname3 werden nur dann definiert, wenn der Account auch tatsächlich im AD enthalten ist. Du machst drei mal dieselbe Abfrage für den Benutzer und landest somit drei mal im if-Teil deiner if/else Anweisung. 
    In deiner ersten if/else-Anweisung definierst du $uservname2 im else-Teil. Dieser wird aber nicht ausgeführt wegen der Bedingung $User -eq $null (trifft zu, wenn der Benutzer nicht vorhanden ist). Somit wird die Variable $uservname2 gar nicht erst definiert, da der betreffende Teil nicht ausgeführt wird. 

    Kleines Beispiel: 

    $a = "Hallo"
    If($a -eq "Hallo"){
        Write-Host $a
    }
    else{
        Write-Host $false
    }

    In dieser Bedingung wird überprüft, ob die Variable $a den Wert "Hallo" hat. Dies trifft bekanntlich zu, also wird in der Konsole den Wert von $a ausgegeben. Der zweite Teil, die else-Bedingung, wird aber nicht ausgeführt, da dieser nur dann ausgeführt wird, wenn $a NICHT "Hallo" ist. Dies ist de facto das gleiche wie bei deinem Skript mit der Abfrage für den Benutzer (wenn Wert = <nichts>, dann tu dies, sonst das). 

    Wenn der Benutzer nicht vorhanden ist, was möchtest du denn dann machen? Nur den Namen des Benutzers ausgeben oder gleich einen neuen erstellen? Ich muss allerdings anmerken, dass ich beim Erstellen von Benutzern im AD keine Ahnung habe.

    Wie du den gesamten Scope durchsuchen kannst, ist hier beschrieben. 

    Montag, 8. Januar 2018 14:42
  • Jetzt hat  es klick gemacht :D Danke dafür. Kann man die Abfrage da anders gestalten? mit einer Schleife zb oder wie sollte man das am besten lösen? Er soll ja sozusagen aufhören, sobald der Nutzer nicht existiert.
    Dienstag, 9. Januar 2018 09:33
  • if($User -eq $null)
    {
        Write-Host "User $Account does not exist"
    }
    else
    {
        #Stell hier das rein, was er ausgeben soll
    }
    Nach der ersten Get-ADUser Abfrage kannst du obige If-Bedingung angeben. Der Rest entfällt dann praktisch von alleine, den braucht es dann nicht mehr.
    Ist der Account nicht vorhanden, gibt er die Variable $Account aus. Im Else-Teil kannst du dann das reintun was er machen soll wenn der Account existiert. Dies kann die Ausgabe des ganzen Benutzers sein oder auch nur den Vornamen (beschrieben im Post von BeatYa). 
    Dienstag, 9. Januar 2018 09:54
  • Genau auf das bin ich grad selber gekommen :D

    Hier der aktuelle Code

    cls
    # LÄD FUNKTION ZUM ÖFFNEN EINES INPUT-FENSTERS
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
    
    
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Anrede des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $anrede = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Nachname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $username = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Vorname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $uservname = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Titel des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $usertitel = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Abteilung des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $abtei = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    
    
    
    $uservname1 = $uservname.remove(1.30)
    
    $Account = $username+"."+$uservname1
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname1
    }
    Else 
    {
    $uservname2= $uservname.remove(2.30)
    $Account = $username+"."+$uservname2
    
    
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname2
    }
    Else 
    {
    $uservname3= $uservname.remove(3.30)
    $Account = $username+"."+$uservname3
    
    
    $User = Get-ADUser -Filter "sAMAccountName -eq '$Account'"
    
    if ($User -eq $Null)
    {
    
    $Account = $username+"."+$uservname3
    }
    Else
    {
    [System.Windows.Forms.MessageBox]::Show(„Zu viele Nutzer mit gleichem Namen“,“Achtung!“,0)
    }}}
    
    $Account

    Hab einfach alles nach Else in einen extra Block gepackt, der eben nur ausgelöst wird, sofern der Nutzer bereits existiert.

    Dienstag, 9. Januar 2018 10:11
  • Zum Thema: alle Domänen durchsuchen.

    Hab das Script ausprobiert aber da gibt es nur lauter Fehler. Welche Stellen muss ich an unsere Domäne anpassen?

    cls
    
    
    Import-Module ActiveDirectory
    (Get-ADForest).domains | % {
    Get-ADUser -filter * -SearchBase "OU=Accounts,$((Get-ADDomain -Server $_).distinguishedname)" -Server $_ | Select Name,sAMAccountName | Export-CSV "C:\test1\test.csv" -nti
    }

    Dienstag, 9. Januar 2018 10:18
  • Welche Stellen muss ich an unsere Domäne anpassen?

    Import-Module ActiveDirectory
    (Get-ADForest).domains | % {
    Get-ADUser -filter * -SearchBase "OU=Accounts,$((Get-ADDomain -Server $_).distinguishedname)" -Server $_ | Select Name,sAMAccountName | Export-CSV "C:\test1\test.csv" -nti
    }


    Der Pfad C:\TEST1 muss existieren und eventuell den Teil "OU=Accounts," löschen.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.


    Dienstag, 9. Januar 2018 13:14
  • Das hat geklappt, wenn ich das OU=Accounts weg mache. Aber irgendwie dachte ich, dieses Script macht etwas anderes. Ich will ja keine csv Datei von den Nutzern. Ich möchte, dass er, nachdem ich den Namen des neuen Mitarbeiters angegeben habe, im gesamten Verzeichnis schaut, ob es diesen schon gibt. Momentan macht er das ja ausschließlich in unserer Domäne
    Dienstag, 9. Januar 2018 14:13
  • Ich habe jetzt nochmal folgendes Script gefunden, was wohl den kompletten "forest" durchsucht.

    #Importing Active Directory Module in PowerShell
    Import-Module ActiveDirectory
    #Forest Wide Search Function
    Function ForestWideSearch([String]$Filter)
    {
            Foreach ($Domain in (Get-ADForest).Domains)
            #Listing the Domains in a Forest
           {
                  $Domain = (Get-ADDomain $Domain).DNSRoot
                  #Performing Search Operation per Domain
                  $Objects = Get-ADObject -LDAPFilter $Filter -Server $Domain -Properties *
                  Foreach ($Object in $Objects)
                  {
                         #Perform any Operation
                         Write-Host $Object.Name
                  }
           }
    }
    #LDAP Filter
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Nachname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $username = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $title = 'Neuer Nutzer'
    $msg   = 'Bitte Vorname des neuen Nutzers eingeben:'
    
    
    # ÖFFNET DAS INPUT-FENSTER
    
    $uservname = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
    
    $uservname1 = $uservname.remove(1.30)
    
    $Account = $username+"."+$uservname1
    
    $Filter = "(&(objeCtcategory=Person)(objectClass=User)(samaccountname=$Account))"
    #Calling the Function
    ForestWideSearch $Filter
    
    if ($Filter -eq $Null)
    {
    $Account = $username+"."+$uservname1
    }
    else
    
    {
    $uservname2= $uservname.remove(2.30)
    $Account = $username+"."+$uservname2
    }
    $Account

    Ich habe garantiert noch irgendetwas falsch definiert, denn es wird immer else angewendet, egal was ich eingebe.


    • Bearbeitet antenne1988 Mittwoch, 10. Januar 2018 08:44
    Mittwoch, 10. Januar 2018 07:32
  • Ich habe garantiert noch irgendetwas falsch definiert, denn es wird immer else angewendet, egal was ich eingebe.


    Ja, hast Du. Du weist $Filter einen String zu und vergleichst das danach mit $null. 

    Dabei ist noch nicht einmal ein leerer String gleich $null:


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 12. Januar 2018 19:24