none
AD Benutzer Accounts Ändern RRS feed

  • Frage

  • Guten Tag,

    ich bräuchte im Bereich Powershell Hilfe.

    Ich möchte bei vorhandenen Usern ihre Anmeldedaten ändern.

    Sie sollen ersetzt werden durch die Felder Vorname und Nachname,

    Also sprich der Benutzer meldet sich mit dem Account fertigung1 an, und heißt max mustermann, er soll sich in Zukunft  mit maxmusttermann anmelden

    Wie ich Werte über die Powershell ändere, ist mir bekannst (set-aduser) allerdings wie lese ich vorname und nachname so aus das ich sie als variable verwenden kann und anschließend einfach den wert samaccountname ersetzen kann , ich hab jetzt schon einiges probiert ,aber ich komme nicht voran.

    $user = Read-Host "User"
    $nachname = get-aduser -Identity $user | -ft givenname 

    Aber mit der Ausgabe kann ich nicht weiterarbeiten.

    Vielen Dank für die Hilfe 


    Donnerstag, 10. Januar 2013 10:25

Antworten

  • Das geht ganz einfach mit dem Punkt als Pfadangabe Operator

    $User = Get-AdUser -Identity (Read-Host "Usernamen bitte eingeben")
    
    # Vorname
    $User.givenname
    
    # Nachname
    $User.Surname



    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, 10. Januar 2013 11:32
  • Select-Objelt erzeugt für jeden user ein Objekt das die Property Name,Surname,Givenname enthält.

    Export-CSV erzeugt eine Textdatei mit den Propertynamen als Spaltenüberschriften in der ersten Zeile (Header-Zeile).
    Jede Weitere Zeile in der Datei einthält die Daten des user objektes (1 Zeile pro User)

    Schau dir die Datei in einem Texteditor an!

    Eine CSV Datei ist wie eine Excel Tabelle mit einer Überschrift Pro Spalte in Textform!

    Import-CSV erzeugt aus diesen Daten wieder Objekte (1 Objekt pro User).

    Dieser Code sollte Funktionieren (ungetestet!):

    $Abteilung = "Test"
    Get-AdUser -Filter "*" -SearchBase "OU=$Abteilung,,OU=XX,DC=XXX,DC=XX" | Select-Object Name,Surname,Givenname  | Export-CSV "d:\users.txt" -NoTypeInformation
    
    Import-Csv d:\users.txt | ForEach-Object {
        # $_ ist das Aktuelle Objekt das in der Pipeline gerade verarbeitet wird
        
        Set-ADuser -Identity $_.Name -SamAccountName  $($_.Givenname + $_.Surname) -UserPrincipalName $($_.Givenname + $_.Surname + "@XX.local")
    }

    Ich kann euch aber nur DRINGEND davon abraten diese Vorname+Nachname Ding durchzuziehen!

    Ein SamAccountName MUSS im Active Directory einmalig sein!
    Was macht Ihr wenn es 2 oder 3 Michael Schmidt gibt?
    Das Geht schief!

    Ebenso Heiraten viele Leute und ändern Ihren Namen! Was dann?

    Das SamAccountName Feld darf Maximal 64 Zeichen lang sein (ohne Schemaänderung).
    Was passiert wenn ein User mit einem sehr langen (Doppelnamen) zu lang ist?
    Macht es dem User Spaß sich jeden Tag mit so einem Langen Namen anzumelden?

    Was passiert wen ein User Sonderzeichen in seinem Namen hat?
    Kann der sich mit der Deutschen Tastatur überhaupt noch anmelden und seinen Usernamen eingeben?

    Es gibt bei dieser Vorgehensweise sicher noch mehr Fehlerquellen die mir jetzt nicht einfallen.

    Lasst das sein!

    Jedes Unternehmen das ich kenne generiert aus dem Namen der User einen Zufallsnamen der 8 bis 15 Zeichen lang ist, und nur Amerikanische Buchstaben (keine Umlaute, kein ß) und Zahlen enthält. Vor dem erstellen wird geprüft ob es den Namen schon gibt wenn ja wird ein neuer generiert usw.

    Schau mal hier : http://blogs.msdn.com/b/openspecification/archive/2009/07/10/understanding-unique-attributes-in-active-directory.aspx


    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!




    Freitag, 11. Januar 2013 14:28

Alle Antworten

  • Das geht ganz einfach mit dem Punkt als Pfadangabe Operator

    $User = Get-AdUser -Identity (Read-Host "Usernamen bitte eingeben")
    
    # Vorname
    $User.givenname
    
    # Nachname
    $User.Surname



    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, 10. Januar 2013 11:32
  • Hallo Herr Kriegel,

    vielen Dank es läuft, mit Ihrer Lösung

    Ich bräuchte noch eine kleine Hilfestellung, wie kann ich auswählen alle User die sich z.B in der OU Fertigung befinden, sollen nach und nach geändert werden?


    Donnerstag, 10. Januar 2013 12:07
  • Wie duzen uns hier im Forum ;-)

    sollen nach und nach geändert werden?

    Mit so einem ungenauen Ausdruck kann ich nichts anfangen!
    Hier wird ein unbekannter Zeitraum mit einer unbekannten Menge Pro Zeiteinheit erwähnt!

    Eine Liste aller User einer OU erstellt man sich so:

    Get-AdUser -Filter "*" -SearchBase "OU=XXXX,OU=Domain Users,DC=XXXX" | Select-Object Name,Surname,Givenname | Export-CSV "C:\temp\users.txt" -NoTypeInformation

    Dann kann man z.B. jeden User einzeln aus der Liste abarbeiten ;-)


    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, 10. Januar 2013 13:33
  • Ok dann danke Peter :)

    Ich poste hier mal mein Script, einzeln klappt das möchte ich aber die USER aus einer OU anzeigen lassen und anschließend bei den Usern die Benutzernamen ändern klappt das nicht.

    $Abteilung = "Test"
    Get-AdUser -Filter "*" -SearchBase "OU=$Abteilung,,OU=XX,DC=XXX,DC=XX" | Select-Object Name,Surname,Givenname  | Export-CSV "d:\users.txt" -NoTypeInformation
    $User = Import-Csv d:\users.txt
    Set-ADuser -Identity $User[0] -SamAccountName $vorname$nachname -UserPrincipalName $vorname$nachname@XX.local

    Als fehler kommt

    Set-ADUser : Der Parameter "Identity" kann nicht gebunden werden. Der Wert "@{Name=test; Surname=XXX; Givenname=XXX}" kann nicht in den Typ 
    "Microsoft.ActiveDirectory.Management.ADUser" konvertiert werden. Fehler: "Der Wert "@{Name=xxx; Surname=xxx; Givenname=xxx}" vom Typ 
    "System.Management.Automation.PSCustomObject" kann nicht in den Typ "Microsoft.ActiveDirectory.Management.ADUser" konvertiert werden."

    Freitag, 11. Januar 2013 09:36
  • Select-Objelt erzeugt für jeden user ein Objekt das die Property Name,Surname,Givenname enthält.

    Export-CSV erzeugt eine Textdatei mit den Propertynamen als Spaltenüberschriften in der ersten Zeile (Header-Zeile).
    Jede Weitere Zeile in der Datei einthält die Daten des user objektes (1 Zeile pro User)

    Schau dir die Datei in einem Texteditor an!

    Eine CSV Datei ist wie eine Excel Tabelle mit einer Überschrift Pro Spalte in Textform!

    Import-CSV erzeugt aus diesen Daten wieder Objekte (1 Objekt pro User).

    Dieser Code sollte Funktionieren (ungetestet!):

    $Abteilung = "Test"
    Get-AdUser -Filter "*" -SearchBase "OU=$Abteilung,,OU=XX,DC=XXX,DC=XX" | Select-Object Name,Surname,Givenname  | Export-CSV "d:\users.txt" -NoTypeInformation
    
    Import-Csv d:\users.txt | ForEach-Object {
        # $_ ist das Aktuelle Objekt das in der Pipeline gerade verarbeitet wird
        
        Set-ADuser -Identity $_.Name -SamAccountName  $($_.Givenname + $_.Surname) -UserPrincipalName $($_.Givenname + $_.Surname + "@XX.local")
    }

    Ich kann euch aber nur DRINGEND davon abraten diese Vorname+Nachname Ding durchzuziehen!

    Ein SamAccountName MUSS im Active Directory einmalig sein!
    Was macht Ihr wenn es 2 oder 3 Michael Schmidt gibt?
    Das Geht schief!

    Ebenso Heiraten viele Leute und ändern Ihren Namen! Was dann?

    Das SamAccountName Feld darf Maximal 64 Zeichen lang sein (ohne Schemaänderung).
    Was passiert wenn ein User mit einem sehr langen (Doppelnamen) zu lang ist?
    Macht es dem User Spaß sich jeden Tag mit so einem Langen Namen anzumelden?

    Was passiert wen ein User Sonderzeichen in seinem Namen hat?
    Kann der sich mit der Deutschen Tastatur überhaupt noch anmelden und seinen Usernamen eingeben?

    Es gibt bei dieser Vorgehensweise sicher noch mehr Fehlerquellen die mir jetzt nicht einfallen.

    Lasst das sein!

    Jedes Unternehmen das ich kenne generiert aus dem Namen der User einen Zufallsnamen der 8 bis 15 Zeichen lang ist, und nur Amerikanische Buchstaben (keine Umlaute, kein ß) und Zahlen enthält. Vor dem erstellen wird geprüft ob es den Namen schon gibt wenn ja wird ein neuer generiert usw.

    Schau mal hier : http://blogs.msdn.com/b/openspecification/archive/2009/07/10/understanding-unique-attributes-in-active-directory.aspx


    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!




    Freitag, 11. Januar 2013 14:28
  • Vielen Dank das Script läuft ohne Probleme.

    Ich bin gerne für Verbesserungsvorschläge offen, 

    "Jedes Unternehmen das ich kenne generiert aus dem Namen der User einen Zufallsnamen der 8 bis 15 Zeichen lang ist"

    Hier hab ich eine Verständnissfrage, wie würde denn so ein username als Beispiel heißen?

    mal angenommen, vorname wäre max, nachname wäre mustermann?

    Wie würde ich dann in Powershell sagen, nehme nur die ersten 4 Buchstaben und schreibe diese in die txt. datei?

    Sorry für die vielen Fragen!

    Ich bedanke mich schonmal


    Mittwoch, 16. Januar 2013 10:02
  • So einen leistungsfähigen Code (Algorithmus), der ordentliche gültige Usernamen erstellt, schüttle auch ich nicht aus dem Ärmel!
    Das ist keinen einfache Aufgabe.(Dafür würde ich 2-3 Tage brauchen mit Testen)
    Das siehst du schon an deinem Beispiel. Max ist kürzer als 4 Buchstaben, also müssten dann vom Nachnamen 5 Buchstaben genommen werden. Dies müsste ein Code berücksichtigen.
    Ebenso müssten alle Sonderzeichen in den Namen ersetzt werden usw……

    Der AD-Name wäre hier: maxmuste (Groß- und Kleinschreibung spielen bei den meisten System keine rolle mehr)

    Einige Firmen haben auch mit Zahlen Rumprobiert aber auch diese sind begrenzt:

    Beispiel für Müller:

    Muel0001
    Muel0002
    Muel0003
    ...

    Muel9999 # und was ist mit dem nächsten Müller ? Der bekommt einen reinen Zufallsnamen ;-) =  mfrg0001

    Für die String (Text) Bearbeitung sieh mal hier:
    http://technet.microsoft.com/en-us/library/ee692804.aspx

    Ich habe den Eindruck das Ihr mit PowerShell und dem Active Directory erst beginnt.
    Für das Arbeiten mit dem Active Directory empfehle ich DRINGEN einen Lehrgang!
    Designfehler die am Anfang gemacht werden, sind bei einem wachsenden Active Directory nur schwer zu beheben!

    Ebenso empfehel ich dir/euch zumindest ein PowerShell Buch von vorne bis hinten DURCHZULESEN.
    Buchtipps siehe Hier in der Mitte des Threads:
    http://social.technet.microsoft.com/Forums/de-DE/powershell_de/thread/84727252-3d5d-459e-b3a8-73a15807a807


    Kostenlose PowerShell PDF Bücher siehe hier:
    http://www.admin-source.de/BlogDeu/kostenlose-powershell-ebook-tutorial-workshop-howto


    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, 17. Januar 2013 07:01
  • Das entspricht sicher nicht Deinen exakten Anforderungen und ist auch optimierbar, aber mit der folgenden Funktion hatte ich bisher in einigen Umgebungen Kontonamen erstellt, die eindeutig sind. Nach dem generierten Namen wird im AD gesucht und so lange ein neuer definiert, bis ein neuer eindeutiger gefunden wurde.

    Zunächst der Aufruf:

     
    New-SamAccountName -FirstName John -LastName Doe -AccountType Extern

    Und das ist die Funktion:

    function New-SamAccountName
    {
        Param(
            [ValidateSet("Intern","Extern","Vendor","Service","Technical")]
            [Parameter(Mandatory = $true)]
            [string]$AccountType,
        
            [Parameter(Mandatory = $true)]
            [string]$FirstName,
    
            [Parameter(Mandatory = $true)]
            [string]$LastName
        )
    
    	[bool]$IsSamAccountNameDuplicate = $true
    	$rnd = New-Object System.Random
    	
    	while ($IsSamAccountNameDuplicate)
    	{
    		#="G" & LINKS(L6;1)&LINKS(B6;1)&TEXT(RUNDEN(ZUFALLSZAHL()*9999;0);"0000")
    		$SamAccountName = "G{0}{1}{2}00{3:0000}" -f 
    			$AccountType.ToUpper()[0],
    			$FirstName.ToUpper()[0],
                $LastName.ToUpper()[0],
    			$rnd.Next(0,9999)
    		
    		try
    		{
    			Get-ADUser -Identity $SamAccountName -ErrorAction SilentlyContinue
    		}
    		catch
    		{
    			$IsSamAccountNameDuplicate = $false
    		}		
    	}
    	return $SamAccountName
    }


    -Raimund

    Freitag, 18. Januar 2013 09:31