franz-josef-ii
Goto Top

Username generieren . ab in eine csv

Schönen Nachmittag

Ich möchte für alle User einen (neuen) Username automatisiert erstellen, am besten in eine csv. Allerdings darf da eben keiner doppelt sein und der Name muß nach gewissen Richtlinien geformt sein.

- die ersten beiden Stellen ergeben sich aus der Jahreszahl
- dann kommen 4 (zufällige) Buchstaben

Somit können pro Jahr knappe 500.000 Kennungen generiert werden und erst in 100 Jahren könnte es theoretisch passieren, daß eine doppelt sein könnte ..... mia wuascht face-wink

Wie könnte ich dies am besten angehen, wenn die "üblichen" Werte (Vor-, Zuname, Wohnort, Geburtsdatum etc) in der csv bereits enthalten sind?

Verweise auf Webseiten die dies beschreiben sind auch willkommen face-wink vielleicht habts Ihr bessere Suchbegriffe als ich face-wink

Content-Key: 331397

Url: https://administrator.de/contentid/331397

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: colinardo
Lösung colinardo 07.03.2017 aktualisiert um 15:31:10 Uhr
Goto Top
Hallo @Franz-Josef-II,
das lässt seich sehr schön mit Powershell aber auch jeder anderen Scrip- und Programmiersprache erledigen.

Das folgende Skript importiert deine CSV-Datei, fügt dieser einen neue Spalte ('Username') hinzu und generiert für alle Zeilen der CSV einen neuen Usernamen unter Beachtung auf doppelte Namen.
Hier mal ein einfaches Beispiel mit Powershell nach deinem Schema:
(jede Zeile für dein Verständnis kommentiert)
# Pfad zur CSV-Datei
$quelle = 'C:\users.csv'  
# CSV Datei importieren (Delimiter anpassen)
$csv = Import-CSV $quelle -delimiter ";"  
# PS 3.0 erforderlich
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    
# Spalte 'Username' hinzufügen 
$csv | Add-Member -MemberType NoteProperty -Name 'Username' -Value ''  
# Funktionsscriptblock zum generieren nach dem Schema YYYY[A-Z]{4}
$generatename = {"$((get-date).Year)$(((65..90| %{[char]$_}) | Get-Random -Count 4) -join '')"}  

# Jede Zeile der CSV durchlaufen, neuen Usernamen generieren und der Spalte 'Username' zuweisen 
$csv | %{
    # Neuen Namen generieren
    $newname = . $generatename
    # sollte der Name bereits in der CSV vorhanden sein generiere so lange einen neuen bis er frei ist
    while($newname -in $csv.Username){$newname = . $generatename}
    # Name der Spalte zuweisen
    $_.Username = $newname
}
# Neue CSV wieder exportieren
$csv | export-csv $quelle -Delimiter ";" -NoType -Encoding UTF8  
Falls dich das 65..90| %{[char]$_} irritiert, das erspart mir hier einfach nur das Alphabet hinzutippeln face-wink

Viel Spaß damit
Grüße Uwe
Mitglied: Franz-Josef-II
Franz-Josef-II 07.03.2017 um 19:10:42 Uhr
Goto Top
Danke Uwe tMotS (the Master of the Scripts) face-wink ich werde es morgen ausprobieren.
Zitat von @colinardo:
das 65..90| %{[char]$_} irritiert, ....

Hmmmm, ASCII-Tabelle? Allerdings nur Großbuchstaben, eigentlich egal, wenn nicht unterschieden wird. Also ein 17AbCd und ein 17aBcD sollten dasselbe sein, also nur einmal vorkommen.

Aber ich werde mich durch den Code kämpfen face-wink und verstehen.

My English is like my Powershell .... a little broken face-wink but the railwaystations got away face-wink

Danke nochmal
Mitglied: colinardo
colinardo 07.03.2017 aktualisiert um 21:09:23 Uhr
Goto Top
Hmmmm, ASCII-Tabelle?
Rischtisch. face-smile
Allerdings nur Großbuchstaben, eigentlich egal, wenn nicht unterschieden wird.
Bei Windows Benutzernamen wird nicht zwischen Groß- und Kleinschreibung unterschieden, denn wenn, hätte ich sie auch noch mit aufgeführt.
Mitglied: Franz-Josef-II
Franz-Josef-II 08.03.2017 aktualisiert um 10:51:52 Uhr
Goto Top
Guten Morgen

Im Script sind zwei Fehler drin, wobei ich nur einen lösen konnte.

In der Zeile 2:
$quelle = 'C:\users.csv''
Ist ein ' zuviel, es darf dort nur ein einfaches Hochkomma sein.

In Zeile 17:
while($newname - in $csv.Username){$newname = . $generatename}
schmeißt er mir folgende Fehlermeldung raus:

Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.
Bei C:\.....\Desktop\users.ps1:17 Zeichen:21
+ while($newname - <<<< in $csv.Username){$newname = . $generatename}
+ CategoryInfo : ParserError: (face-smile , ParseException
+ FullyQualifiedErrorId : ExpectedValueExpression

Da blicke ich (noch) nicht durch was da nicht läuft.
Mitglied: colinardo
colinardo 08.03.2017 aktualisiert um 11:06:46 Uhr
Goto Top
Zitat von @Franz-Josef-II:
In der Zeile 2:
$quelle = 'C:\users.csv''
Ist ein ' zuviel, es darf dort nur ein einfaches Hochkomma sein.
Sorry Tippfühler face-wink
In Zeile 17:
while($newname - in $csv.Username){$newname = . $generatename}
schmeißt er mir folgende Fehlermeldung raus:

Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.
Bei C:\.....\Desktop\users.ps1:17 Zeichen:21
+ while($newname - <<<< in $csv.Username){$newname = . $generatename}
+ CategoryInfo : ParserError: (face-smile , ParseException
+ FullyQualifiedErrorId : ExpectedValueExpression

Da blicke ich (noch) nicht durch was da nicht läuft.
Du hast nicht mind. PS 3.0 face-smile, denn den Operator gibts erst dort, deswegen kommt diese Fehlermeldung. Es wird dort einfach überprüft ob ein Eintrag in einem Array vorhanden ist in dem Fall sind das alle Usernamen der csv ($csv.Username).
Du kannst stattdessen aber auch die contains() Funktion benutzen wenn du willst, geht beides einwandfrei face-smile
while($csv.Username.contains($newname)){$newname = . $generatename}
Mitglied: Franz-Josef-II
Franz-Josef-II 08.03.2017 um 11:07:05 Uhr
Goto Top
Ok, gewonnen, es ist die 2er.

Ich war der Meinung, daß ich alle PCs auf die 5er upgedatet habe ..... somit habe ich (zumindest) einen übersehen.

Danke
Mitglied: colinardo
colinardo 08.03.2017 aktualisiert um 11:12:17 Uhr
Goto Top
Zitat von @Franz-Josef-II:
Ok, gewonnen, es ist die 2er.
Wie, ich hab was gewonnen? Geil, sind wir hier bei Der Preis ist Heiß? face-big-smile

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.

p.s. Preise bitte gerne immer hier abladen face-wink
Mitglied: Franz-Josef-II
Franz-Josef-II 10.03.2017 um 08:26:06 Uhr
Goto Top
Guten Morgen

Ich habe mich jetzt mit dem Script ein bißchen herumgespielt, Jahreszahl einmal 2, einmal 4-stellig dann vorne und hinten, mehr Buchstaben und dann wieder weniger.

Wie kann ich eine Prüfung einbauen, ob für den User bereits eine Kennung gibt, wenn ja überspringe es. Z.Zt wird immer eine neue Kennung generiert. Die "Alten" sollen ja ihre jeweilige Kennung behalten.

mfG
Mitglied: colinardo
colinardo 10.03.2017 aktualisiert um 08:45:55 Uhr
Goto Top
Zitat von @Franz-Josef-II:
Wie kann ich eine Prüfung einbauen, ob für den User bereits eine Kennung gibt,
Wo gibt? In der CSV oder im AD?
wenn ja überspringe es. Z.Zt wird immer eine neue Kennung generiert. Die "Alten" sollen ja ihre jeweilige Kennung behalten.
Mach einfach eine IF-Abfrage in der Schleife und schon hast du was du willst
if ($_.Username -eq ""){  
   # generiere hier den neuen Usernamen (bestehender Code siehe oben)
}
Mitglied: Franz-Josef-II
Franz-Josef-II 10.03.2017 um 10:45:17 Uhr
Goto Top
Dann sage ich nochmals Danke


Allerdings gehört dann diese Zeile:
# Spalte 'Username' hinzufügen 
$csv | Add-Member -MemberType NoteProperty -Name 'Username' -Value ''  

entsorgt, weil es sonst zu einer Fehlermeldung (Kann nicht hinzugefügt werden, weil es bereits existiert) kommt.


Allerdings muß ich dann, wenn ich Zeilen hinzufüge, auch den letzten Delimiter setzen, weil er sonst (in dieser Zeile) nichts tut.

Also:
1) users.csv erstellen
2) Script drüberlaufen lassen
3) Verwenden ... werkeln ....
4) Neue User kommen dazu, z.B. über eine csv
5) in der neuen csv (automatisiert face-wink ) den letzten Delimiter setzen
6) Dateien zusammenführen
7) -> 2)
8) -> 3)
etc


Danke nochmal
Franz
Mitglied: colinardo
colinardo 10.03.2017 aktualisiert um 11:29:28 Uhr
Goto Top
Zitat von @Franz-Josef-II:

Dann sage ich nochmals Danke
Keine Ursache.

Allerdings gehört dann diese Zeile:
# Spalte 'Username' hinzufügen 
> $csv | Add-Member -MemberType NoteProperty -Name 'Username' -Value ''  

entsorgt, weil es sonst zu einer Fehlermeldung (Kann nicht hinzugefügt werden, weil es bereits existiert) kommt.
Korrket, wenn sie schon existiert logisch.

Allerdings muß ich dann, wenn ich Zeilen hinzufüge, auch den letzten Delimiter setzen, weil er sonst (in dieser Zeile) nichts tut.
Nein musst du nicht!!
Also:
1) users.csv erstellen
2) Script drüberlaufen lassen
3) Verwenden ... werkeln ....
4) Neue User kommen dazu, z.B. über eine csv
5) in der neuen csv (automatisiert face-wink ) den letzten Delimiter setzen
6) Dateien zusammenführen
7) -> 2)
8) -> 3)
etc
Falsch face-wink

Man fügt einen User mit einem Custom Object zum $csv Array hinzu dann musst du nicht irgendeinen Delimiter hinzubasteln, das ist völliger Quatsch, Sorry.

Beispiel
$csv += [pscustomobject] @{Vorname="Max";Nachname="Muster"}  
usw. Denk immer daran, Powershell arbeitet Objektorientiert! Man bastelt also nicht irgend einen String an ein Object face-big-smile
Mitglied: Franz-Josef-II
Franz-Josef-II 10.03.2017 aktualisiert um 11:41:11 Uhr
Goto Top
Zitat von @colinardo:
Nein musst du nicht!!

Ich habe es ausprobiert und einen Teil der generierten User gelöscht. Diejenigen, wo der letzte Delimiter gesetzt war bekamen einen neuen User, dort wo ich auch diesen gelöscht habe, kam nichts.

Zitat von @colinardo:
Man fügt einen User mit einem Custom Object zum $csv Array hinzu dann musst .....

Ok, ich gestehe, da muß ich noch etwas, nicht viel aber a bißale ..... nachbessern face-wink

Die Userliste bekomme ich über eine csv oder xls und es sind mindestens 50 die dazukommen, dafür fallen andere weg.


Na, wenigstens habe ich eine Wochenendbeschäftigung, durchdenken und nachvollziehen face-wink Da glaubt man, man hat es und .... wieder nix face-wink
Mitglied: colinardo
colinardo 10.03.2017 aktualisiert um 11:48:22 Uhr
Goto Top
Wenn da ein Leerzeichen in der Spalte steht wär das für mich kein Wunder, ist das der Fall entweder das auch entfernen oder in der If-Prüfung zusätzlich trimmen um die Leerzeichen zu entfernen.
if ($_.Username.Trim() -eq ""){  

}

Na, wenigstens habe ich eine Wochenendbeschäftigung, durchdenken und nachvollziehen Da glaubt man, man hat es und .... wieder nix
Wenn man nichts mehr dazu lernt ist man tot face-wink.

Sonniges Wochenende
Grüße Uwe
Mitglied: Franz-Josef-II
Franz-Josef-II 10.03.2017 aktualisiert um 12:34:43 Uhr
Goto Top
Zitat von @colinardo:
Wenn da ein Leerzeichen in der Spalte steht wär ....

Wäre möglich, werde ich kontrollieren

Zitat von @colinardo:
Wenn man nichts mehr dazu lernen will, gibt man besser den Löffel ab face-wink

Absolut korrekt face-wink Das habe ich vor 2 Jahren zu meiner Angegrau.... ähhhh Angetrauten gesagt, als sie mich fragte: In deinem Alter willst dir das noch antun?
face-wink


Dir auch ein
Schönes Wochenende
Franz
Mitglied: colinardo
colinardo 10.03.2017 um 12:50:34 Uhr
Goto Top
Zitat von @Franz-Josef-II:
Zitat von @colinardo:
Wenn man nichts mehr dazu lernen will, gibt man besser den Löffel ab face-wink
Nana, wer wird mich denn da falsch zitieren ... "Fake News Alarm"! face-big-smile
Mitglied: Franz-Josef-II
Franz-Josef-II 10.03.2017 um 12:57:51 Uhr
Goto Top
Zitat von @colinardo:
Nana, wer wird mich denn da falsch zitieren ... "Fake News Alarm"! face-big-smile


War wahrscheinlich der Google-Übersetzer face-wink Schreibst halt gleich auf deutsch face-wink