none
Active Directory: mehrere User mit Skript anlegen RRS feed

  • Frage

  • Servus zusammen,

    ich hoffe mal mir kann hier jemand weiter helfen und ja ich weiß, dass dieses Skript eigentlich ziemlich häufig erstellt wird/ Fragen gestellt werden, allerdings habe ich nichts zu meinem Problem genau gefunden.

    Und zwar geht es um folgenedes:

    Es soll aus einer .csv Datei die Userdaten ausgelesen werden und anhand der Daten die User neuangelegt werden oder angepasst werden. Es funktioniert soweit fast alles, bis auf eine Kleinigkeit. Und zwar wenn der User schon existiert und keine Parameter beim start (in meinem Fall overwrite) mitgegeben werden, dann sollen nur fehlende Werte ersetzt werden. Hier habe ich schon mehrere Dinge probiert, allerdings ohne Erfolg.

    Ich poste mal nur die Relevanten Zeilen, bei Bedarf kann ich auch das ganze Skript posten bzw. hochladen (geht das hier direkt als Anhang?)

    Hier die Erstellung meines Filters:

    $filter="(&(objectCategory=Person)(objectClass=User)(samaccountname=$sAMAccountName))"
    $searcher=New-Object System.DirectoryServices.DirectorySearcher $filter
    $result = $searcher.FindOne()

    Der else Part der dafür sorgen soll, dass die Werte des Users geprüft werden und ggf. gesetzt falls nicht vorhanden.

    else
    {    
    $UserN=[ADSI]$result.path
                  
          if($UserN???????? -eq $null)    
          {
           $UserN=[ADSI]$result.path
           $UserN.Put("telephoneNumber",$phnumber)
           $UserN.SetInfo()
           }

    Hoffe mir kann hier jemand weiterhelfen und ich oute mich mit meinem Skript/ meiner Frage nicht als vollblut Anfänger.

    Gruß Michael

    Edit: Hab gemerkt das ich einen Logikfehler in der if Abfrage hatte. Habs Editiert, allerdings bräuchte ich bei den dicken ??? jetzt Hilfe weil ich da keine Idee (die Funktioniert) habe wie die Syntax dort sein muss.

    Edit2: Ok habs gerade selbst gelöst bekommen.

    if((Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber) -eq $null)

    Mit dieser If-Abfrage erziehle ich den gewünschten Effekt. Falls jemand trotzdem ne kürzere Syntax hierfür hat, dann darf er sie trotzdem gerne noch posten.

    • Bearbeitet n1hl0 Donnerstag, 6. Dezember 2012 10:25
    Donnerstag, 6. Dezember 2012 09:17

Antworten

  • Ich sehe gerade das dein Lösung wahrscheinlich Falsch ist!
    Der Befehl "Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber" gibt dir ein User Objekt mitsammt seiner Telefonnummer zurück und du testet dort ob der User = Null ist!

    Es müsste so heißen:

    IF ((Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber).telephoneNumber -eq $Null)

    Da das User Objekt aber Mehrmals verwendet werden soll wäre es "dumm" und teuer es jedes mal neu abzurufen.

    Die folgenden Zeilen kannst du mit dem Microsoft Cmdlets leicht ersetzen:

    $filter="(&(objectCategory=Person)(objectClass=User)(samaccountname=$sAMAccountName))"
    $searcher=New-Object System.DirectoryServices.DirectorySearcher $filter
    $result = $searcher.FindOne()
    
    # diese Zeile ersetzt die oberen 3 ;-)
    Get-AdUser $sAMAccountName

    Wenn du Microsoft Active Directory Modul geladen hast, dann kannst du alle Cmdlets dieses Moduls mit folgendem Befehl sehen:

    Get-Command -Module ActiveDirectory

    Dort siehst du das es ein Cmdlet Set-ADUser gibt um Änderungen an einem User durchzuführen!

    Folgendes hilft dir weiter! ;-))

    Get-Help Set-ADUser  -Full

    Schau dir dort die Beispiele an !



    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!

    • Als Antwort markiert n1hl0 Mittwoch, 12. Dezember 2012 10:19
    Donnerstag, 6. Dezember 2012 15:39
  • Auch wenn etwas funktioniert heißt das noch lange nicht das es korrekt funktioniert!

    Mach mal bitte folgendes:

    Get-ADUser $UserName -Properties telephoneNumber | Get-Member

    Hier Zeigt dir Get-Member, dass diese Befehlszeile ein Objekt vom Typ Microsoft.ActiveDirectory.Management.ADUser zurück gibt!
    mit –eq $Null testest du nur ob das User Objekt existiert oder nicht!
    Das ist nicht das gewünschte verhalten!?

    Nun mach mal folgendes:

    (Get-ADUser $UserName -Properties telephoneNumber).telephoneNumber | Get-Member

    Hier Zeigt dir Get-Member, dass diese Befehlszeile ein Objekt vom Typ System.String zurückgibt, also die Telefonnumer als String!

    Die folgende Zeile teste die telefonnummer und nicht das Objekt!

    IF ((Get-ADUser $UserName -Properties telephoneNumber).telephoneNumber -eq $Null) {"TelNr ist Null!"}ELSE{"TelNr ist Vorhanden!"}

    LDAP und ADSI habe ich glücklicherweise, als ich allgemein mit Active Directory angefangen habe mich zu beschäftigt, rauf und runter gepaukt (dank einer meiner Ausbilder^^)

    Guter Ausbilder !

    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!


    • Bearbeitet Peter Kriegel Freitag, 7. Dezember 2012 07:45
    • Als Antwort markiert n1hl0 Mittwoch, 12. Dezember 2012 10:19
    Freitag, 7. Dezember 2012 07:43

Alle Antworten

  • Man kann in der PowerShell mehrere Techniken benutzen um mit dem Active Directory zu Arbeiten.

    - COM basiertes ADSI (native API)
    - die .NET Klassen (DirectoryEntry und DirectorySearcher) die auch von den PowerShell die Schreibweise [ADSI] ist nicht das native ADSI sondern die .NET Klasse DirectoryEntry und die Schreibweise [AdsiSearcher] stellt eine .NET Klasse DirectorySearcher her. (die .NET Klassen nutzen intern das native COM ADSI und die wldap32.dll LDAP library)
    - WMI

    Oder zum nachladen

    - Das Snapin von der Firma Quest mit sehr guten Cmdlets zum Verwalten das ADs
    - Das Modul ActiveDirectory von Microsoft mit guten Cmdlets zum Verwalten das ADs

    Du mischst hier die verschiedenen anscheinend die verschiedenen Techniken in einem Skript. Das ist erst mal grundsätzlich nichts verkehrtes, nur ist es meist besser bei einer Technik zu bleiben, da diese aufeinander abgestimmt ist.

    Get-ADUser scheint mir ein Cmdlet aus dem Microsoft Modul zu sein? Oder ist dies eine selbstgeschriebene Funktion?

    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!

    Donnerstag, 6. Dezember 2012 12:18
  • Ok da ich mir alles was ich über Powershell weiß nur selber angeeignet habe (bin Azubi im 2. Lehrjahr im übrigen), wusste ich natürlich nicht das es mehrere Techniken gibt, aber vielen Dank für den Hinweis.

    Da stellt sich mir jetzt die Frage, wie schlimm wäre es, wenn ich so weiter arbeiten würde (erstmal) bis ich immer tiefer in der Materie komme? Mache ich es mir damit hinterher nur schwerer es quasi "richtig" zu lernen oder soll ich sogar einfach so weiter machen wie gehabt da ich auch so an das selbe Ziel komme?

    Get-ADUser ist ein Cmdlet aus dem Microsoft Active Directory Modul, welches ich auch am Anfang meines Skript lade.

    Donnerstag, 6. Dezember 2012 13:39
  • Mache ich es mir damit hinterher nur schwerer es quasi "richtig" zu lernen oder soll ich sogar einfach so weiter machen wie gehabt da ich auch so an das selbe Ziel komme?

    Kommt darauf an was man unter richtig versteht ;-)

    Es ist nicht schlimm alle Techniken zu kennen und zu nutzen man wird daraus nur klüger!
    bei den Modul/Snapin Cmdlets braucht man weniger Grundwissen und sie sind einfacher zu nutzen.

    COM ADSI ist schwer aber man lernt dadurch das AD in und auswendig. Es wird in der PowerShell aber nur sehr selten gebraucht, da es Befehle bietet die in den anderen Techniken fehlen.

    Wenn es z.B. um die Themen Active Directory Schema oder Forest geht dann geht dem Modul\Snapin Cmdlet di puste aus. Da helfen dir dann nur noch die .Net Klassen und das COM ADSI weiter.

    Letztendlich sollte man LDAP und ADSI verstehen um mit dem Microsoft Active Directory umgehen zu können.

    Fazit mach so weiter wie bisher ;-))

    Mit die beste Seite zum Active Directory ist die etwas veraltete SelfADSI Seite:
    http://www.selfadsi.de/
    und die Links dort!: http://www.selfadsi.de/links.htm (LDAP://Yusufs.Directory.Blog/ ist sehr gut ...)


    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!


    Donnerstag, 6. Dezember 2012 15:11
  • Erstmal vielen Dank für deine Rückmeldung :)

    LDAP und ADSI habe ich glücklicherweise, als ich allgemein mit Active Directory angefangen habe mich zu beschäftigt, rauf und runter gepaukt (dank einer meiner Ausbilder^^)

    Yusufs Blog war hier dann auch einer meiner ersten anlaufstellen sowohl für Powershell, als auch beim Thema Active Directory.

    http://www.selfadsi.de/ hab ich noch nicht gekannt, aber vielen Dank nochmals für den Tipp.

    Ich werde dann einfach wie gehabt weiter machen und wenn die mitgelieferten Möglichkeiten nicht mehr ausreichen, vertieft sich der Rest automatisch :)

    Donnerstag, 6. Dezember 2012 15:32
  • Ich sehe gerade das dein Lösung wahrscheinlich Falsch ist!
    Der Befehl "Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber" gibt dir ein User Objekt mitsammt seiner Telefonnummer zurück und du testet dort ob der User = Null ist!

    Es müsste so heißen:

    IF ((Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber).telephoneNumber -eq $Null)

    Da das User Objekt aber Mehrmals verwendet werden soll wäre es "dumm" und teuer es jedes mal neu abzurufen.

    Die folgenden Zeilen kannst du mit dem Microsoft Cmdlets leicht ersetzen:

    $filter="(&(objectCategory=Person)(objectClass=User)(samaccountname=$sAMAccountName))"
    $searcher=New-Object System.DirectoryServices.DirectorySearcher $filter
    $result = $searcher.FindOne()
    
    # diese Zeile ersetzt die oberen 3 ;-)
    Get-AdUser $sAMAccountName

    Wenn du Microsoft Active Directory Modul geladen hast, dann kannst du alle Cmdlets dieses Moduls mit folgendem Befehl sehen:

    Get-Command -Module ActiveDirectory

    Dort siehst du das es ein Cmdlet Set-ADUser gibt um Änderungen an einem User durchzuführen!

    Folgendes hilft dir weiter! ;-))

    Get-Help Set-ADUser  -Full

    Schau dir dort die Beispiele an !



    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!

    • Als Antwort markiert n1hl0 Mittwoch, 12. Dezember 2012 10:19
    Donnerstag, 6. Dezember 2012 15:39
  • Mh ok. Get-ADUser -LDAPFilter $UserN -Properties telephoneNumber hab ich getestet und es kam eigentlich die gewünschte Funktion dabei raus. Er hat also bei Testobjekten ohne gewisse Werte diese Ersetzt, ansonsten halt ignoriert.

    Das mit dem Get-AdUser cmdlet, merk ich gerade wo du es sagst, dass es so natürlich kürzer und übersichtlicher wird :)

    Ich glaube ich werd mich sowieso noch n weilchen mit dem Skript beschäftigen, um alles etwas übersichtlicher zu Gestalten und natürlich weiterhin auch um nützliche Funktionen zu erweitern.

    Donnerstag, 6. Dezember 2012 15:52
  • Danke der cmdlets im ActiveDierctory Module braucht man ADSI eigentlich gar nicht mehr für die Standard-Aufgaben.

    Um Beutzer anzulegen reicht ein

     

    Import-Csv users.txt | New-ADUser

    Zu beachten ist hier, daß die Spaltennamen den Parameternamen entsprechen, also z.B. "Surname","GivenName","Department","State","Description","Address","OfficePhone","EmailAddress","Name"

    Mit Set-ADUser verhält es sich genauso.


    -Raimund


    Donnerstag, 6. Dezember 2012 15:58
  • Auch wenn etwas funktioniert heißt das noch lange nicht das es korrekt funktioniert!

    Mach mal bitte folgendes:

    Get-ADUser $UserName -Properties telephoneNumber | Get-Member

    Hier Zeigt dir Get-Member, dass diese Befehlszeile ein Objekt vom Typ Microsoft.ActiveDirectory.Management.ADUser zurück gibt!
    mit –eq $Null testest du nur ob das User Objekt existiert oder nicht!
    Das ist nicht das gewünschte verhalten!?

    Nun mach mal folgendes:

    (Get-ADUser $UserName -Properties telephoneNumber).telephoneNumber | Get-Member

    Hier Zeigt dir Get-Member, dass diese Befehlszeile ein Objekt vom Typ System.String zurückgibt, also die Telefonnumer als String!

    Die folgende Zeile teste die telefonnummer und nicht das Objekt!

    IF ((Get-ADUser $UserName -Properties telephoneNumber).telephoneNumber -eq $Null) {"TelNr ist Null!"}ELSE{"TelNr ist Vorhanden!"}

    LDAP und ADSI habe ich glücklicherweise, als ich allgemein mit Active Directory angefangen habe mich zu beschäftigt, rauf und runter gepaukt (dank einer meiner Ausbilder^^)

    Guter Ausbilder !

    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!


    • Bearbeitet Peter Kriegel Freitag, 7. Dezember 2012 07:45
    • Als Antwort markiert n1hl0 Mittwoch, 12. Dezember 2012 10:19
    Freitag, 7. Dezember 2012 07:43
  • Hallo,

    ist die Thematik abgeklärt?

    Wenn ja, bitte auch die Antworten markieren, die Dir geholfen haben.

    So dass auch andere davon profitieren können.

    Gruss,
    Raul


    Raul Talmaciu, MICROSOFT 
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 10. Dezember 2012 13:05