Hallo Forum, hallo Univention Team,
ich habe mir durch ein fehlerhaftes Migrations-Script doppelte UIDs eingehandelt. Das Script sollte aus einer CSV-Datei Benutzer mit UID > 2000 anlegen, hat aber bei 1 angefangen.
Leider wurde der Fehler zu spät bemerkt, so dass der Server nun schon im Produktionsbetrieb ist.
Jetzt suche ich nach einer Möglichkeit das nachträglich zu korrigieren.
Wenn ich die Benutzer Scriptgesteuert lösche und dann neu anlege, wäre das recht kompliziert und aufwändig.
Ich müsste die Kennworte rüberretten, verhindern dass die Dovecot Postfächer gelöscht werden uvm.
Gibt es einen Weg wie ich die UID ohne neuanlegen des Benutzers ändern könnte?
UCS in Version 4.1 mit Samba4.
Beste Grüße
Gerd Wilhelm
Ich habe bei einem Testuser per LDAP die UID von 63 auf 2063 gesetzt.
Folgendes ist passiert:
[ul]
[li]Die Samba4 SID bleibt zum glück unverändert.[/li]
[li]Der Benutzer ist weiterhin Mitglied in seinen Gruppen und hat über Samba Zugriff auf die Dateien auf die seine Gruppe zugriff haben sollte[/li]
[li]ABER: Wenn er neue Dateien über Samba erstellt, gehören diese im Dateisystem seiner alten UID, hier 63[/li][/ul]
Ich müsste also entweder das User Mapping zwischen Samba4 und UCS korrigieren.
Oder kann ich den den S4-Connector vielleicht zwingen, den Samba4 Benutzer neu anzulegen? Würde er dabei die SID, die im UCS-LDAP steht verwenden? Dann wäre mein Problem gelöst.
Ich bin dankbar für jeden Tip.
LG
Gerd Wilhelm
Ich habe ine Script geschrieben, was die Sache hoffentlich ausbügelt. Für einen einzelnen Testuser funktioniert es schon mal. Vielleicht kann es jemand brauchen der mal UIDNummern nachträglich ändern muss und Samba4 im Einsatz hat.
Sollte jemand einen Grund kennen, weshalb ich genau das nicht machen sollte, bin ich für Warnungen dankbar.
Das Script tut folgendes:
[ol][li]Schlägt alte und neu UIDNummer sowie SID und HomeDir nach[/li]
[li]ändert die UIDNummer im openldap[/li]
[li]passt die Zuordnung zwischen Samba SID und Unix UIDNummer in der idmap.ldb an[/li]
[li]Ändert die Eigentümerschaft des Home-Verzeichnisses auf die neue UIDNummer[/li]
[li]Optional: Sucht Dateien mit der alten UIDNummer-Eigentümerschaft und ändert diese[/li][/ol]
#!/bin/bash
# Dieses Script der nachträglichen Änderung der Posix UID auf einem UCS System
# Mit Samba4 AD-Master.
#
# Es addiert einen festen Wert zur alten UID und passt danach das ID-Mapping in
# Der SAMBA Datenbank idmap.ldb an.
#
# Als Eingangsdatei wird eine liste der zu ändernden DNs aus dem UCS openldap
# verwendet.
# Diese Datei muss folgede Form haben:
#
# uid=benutzer1,cn=users,dc=domain,dc=local
# uid=benutzer2,cn=users,dc=domain,dc=local
# Konstanten
IDMAPPFAD=/var/lib/samba/private/idmap.ldb # real
#test# IDMAPPFAD=/tmp/idmap.ldb #test
EINGABEDATEI=/root/korrektur/nutzer
LDAPBASIS=dc=juwe,dc=local
for i in `cat $EINGABEDATEI `; do
echo $i
#Daten aus openldap holen
univention-ldapsearch -x -LLL -b $i > /tmp/ucsldaptemp
OLDUID=$(cat /tmp/ucsldaptemp | grep uidNumber | cut -d " " -f 2)
NEWUID=$(($OLDUID+2000))
SID=$(cat /tmp/ucsldaptemp | grep sambaSID | cut -d " " -f 2)
HDIR=$(cat /tmp/ucsldaptemp | grep homeDirectory | cut -d " " -f 2)
UNAME=$(cat /tmp/ucsldaptemp | grep uid: | cut -d " " -f 2)
echo $i
echo "OLDUID = $OLDUID"
echo "NEWUID = $NEWUID"
echo "SID = $SID"
echo "HOMEDIR= $HDIR"
echo "Username = $UNAME"
# Hier UID im UCS LDAP ändern
echo"dn: $i
changetype: modify
replace: uidNumber
uidNumber: $NEWUID" > /tmp/$UNAME_UCS.ldif
ldapmodify -D cn=admin,$LDAPBASIS -y /etc/ldap.secret -h localhost -p 7389 -f /tmp/$UNAME_UCS.ldif
# Hier mapping im S4 idmap ändern
echo "dn: cn=$SID
changetype: modify
replace: xidNumber
xidNumber: $NEWUID" > /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif
ldbmodify --url=$IDMAPPFAD /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif
if [ $? -eq 0 ] ; then
echo "$UNAME $OLDUID nach $NEWUID" >> /tmp/idmapchange_ok.log
rm /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif
else
echo $i >> /tmp/idmapchange_fehler.log
cp /tmp/idmapchange$OLDUID_TO_$NEWUID.ldif /tmp/failed-idmapchange$OLDUID_TO_$NEWUID.ldif
fi
# Hier Dateieigentum ändern
chown -R --from $OLDUID $NEWUID $HDIR
# Man könnte auch sowas wie "find /mnt/shares/firmendaten -uid $OLDUID -exec chown $NEWUID {} \;" machen.
done
Hi,
ich habe ein ähnlich geartetes Problem, möchte ebenfalls die uidNumber anpassen, damit die Migration vom alten Fileserver einfacher vonstatten gehen kann.
Hast du dein Script erfolgreich auf die Produktivuser losgelassen - klappt das ohne Nebenwirkungen?
Vielen Dank für das Script. Dass man die idmap.ldb mit ldapmodify (oder ldbedit -H idmap.ldb) bearbeiten kann, war mir nicht bewußt - cool!
/thorsten
Hallo Thorsten,
ja, ich habe das script erfolgreich auf dem Produktivsystem angewendet. Aber: ich habe das script bevor ich es im Forum gepostet habe “verallgemeinert” und dabei haben sich wohl Fehler eingeschlichen.
So hatte ich die LDAP-Basis in eine Variable ausgelagert, das klappt so aber aus Syntaxgründen nicht (Wegen der vielen Gleichheitszeichen?) Also lieber die LDAP Basis direkt in die Befehle schreiben. Und: nicht mich schimpfen wenn hinterher alles kaputt ist 
Außerdem habe ich noch gemerkt, dass die Änderungen an der idmap erst nach langer zeit wirksam werden. D.H. neu angelegte Dateien haben dann immer noch die alte Unix-ID.
Man kann dass aber mit dem Befehl “net cache flush” abkürzen.
So long
Gerd
Ich danke dir Gerd, habe das Script ein wenig angepasst und auf einem testweise installierten System laufen lassen - hat geklappt.
Super, den net cache flush kannte ich noch nicht, hatte die VM einfach durchgestartet…