Op een linux machine waar ldap en samba op draait moet samba nadat ie een LMpassword en NTpassword heeft veranderd een programma aanroepen dat in ldap het Userpassword attribuut van een bepaalde dn ( is dan een user ) verandert. Ik kan dit wel met een simpel shell-scriptje dat ldapmodify aanroept doen, maar ik wil het liever door een (in C geschreven) programma laten doen.
In de huidige situatie gebruiken we de shell-script variant omdat ik mijn programma niet aan de praat krijg, en eigenlijk werkt dit best goed, maar ik kan het gewoon niet hebben dat mijn programma niet doet wat ik graag wil. Vandaar dat ik eens anderen ernaar wil laten kijken.
Concreet dus: weet iemand hoe je correct in C een attribuut van een bepaalde dn kunt veranderen?
Ik heb een setje variabelen:
Na het verkrijgen van een handle, en het binden
probeer ik dan dit:
Het vreemde is nu dat dit stuk code wel connect naar de ldap server, en zelfs
een MOD wil doen, maar dat ie het attribuut niet verandert.
Wanneer ik bijvoorbeeld met phpldapadmin aan de slag ga, en als zelfde dn
probeer dezelfde jantje (uid=jantje,ou= enz...) te veranderen, lukt het wel.
Nu probeer ik een goed systeembeheerder te zijn, dus heb ik in een andere terminal een tail -f van /var/log/messsages lopen, en wat blijkt:
bij mijn doe-het-zelf progje, verschijnt in de logs:
conn=45 fd=15 ACCEPT from IP=10.10.10.10
conn=45 op=0 BIND dn="<rootdn>" method =128
conn=45 op=0 BIND dn="<rootdn>" mech= simple ssf=0
conn=45 op=0 RESULT tag=97 err=0 text=
conn=45 op=1 MOD dn="uid=jantje,ou=Users,dc=bij-mij,dc=nl"
conn=45 op=1 RESULT tag=103 err=0 text=
conn=45 op=2 UNBIND
en wanneer phpldapadmin het probeert:
conn=43 fd=15 ACCEPT from IP=10.10.10.10
conn=43 op=0 BIND dn="<rootdn>" method =128
conn=43 op=0 BIND dn="<rootdn>" mech= simple ssf=0
conn=43 op=0 RESULT tag=97 err=0 text=
conn=43 op=1 MOD dn="uid=jantje,ou=Users,dc=bij-mij,dc=nl"
conn=43 op=1 MOD attr=userpassword
conn=43 op=1 RESULT tag=103 err=0 text=
conn=43 op=2 UNBIND
het lijkt dus dat ik niet duidelijk genoeg opgeef dat ik attr=userpassword wil
veranderen.
Kan iemand mij vertellen wat ik niet goed heb gedaan in mijn
doehetzelf code?
Ik ben overigens op de hoogte van het manko van het gebruik van Userpasswd in plaats van kerberos en ik weet ook dat het gebruik van de rootdn niet slim is in dit geval. Ik wil later een aparte passwd change only dn gaan maken die dan deze modify moet gaan uitvoeren.
/edit: spelfout
In de huidige situatie gebruiken we de shell-script variant omdat ik mijn programma niet aan de praat krijg, en eigenlijk werkt dit best goed, maar ik kan het gewoon niet hebben dat mijn programma niet doet wat ik graag wil. Vandaar dat ik eens anderen ernaar wil laten kijken.
Concreet dus: weet iemand hoe je correct in C een attribuut van een bepaalde dn kunt veranderen?
Ik heb een setje variabelen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| int auth_method = LDAP_AUTH_SIMPLE;
int desired_version = LDAP_VERSION3;
char *ldap_host = "ldapmachine.bij-mij.nl";
char *change_dn = "uid=admin,dc=bij-mij,dc=nl";
char *dn_passwd = "nunietmeergeheimlijktme";
char *user_dn = "uid=jantje,ou=Users,dc=bij-mij,dc=nl";
char *waarde[] = {"nieuwewachtwoord",NULL};
LDAPMod passwoord;
LDAPMod *mods[2];
passwoord.mod_op = LDAP_MOD_REPLACE;
passwoord.mod_type = "userpassword";
passwoord.mod_values = waarde;
mods[1] = &passwoord;
mods[2] = NULL; |
Na het verkrijgen van een handle, en het binden
probeer ik dan dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| }
/* nu ga ik proberen iets te modden */
/* bink die ik ben */
if (ldap_modify_s(ld,user_dn,mods) != LDAP_SUCCESS) {
printf ("Oh oh, password not changed\n");
ldap_perror (ld, "ldap_modify_s");
return (1 );
} else {
printf ("Hee, Password has changed ");
ldap_perror (ld, "ldap_modify_s");
} /* if ldap_modify */ |
Het vreemde is nu dat dit stuk code wel connect naar de ldap server, en zelfs
een MOD wil doen, maar dat ie het attribuut niet verandert.
Wanneer ik bijvoorbeeld met phpldapadmin aan de slag ga, en als zelfde dn
probeer dezelfde jantje (uid=jantje,ou= enz...) te veranderen, lukt het wel.
Nu probeer ik een goed systeembeheerder te zijn, dus heb ik in een andere terminal een tail -f van /var/log/messsages lopen, en wat blijkt:
bij mijn doe-het-zelf progje, verschijnt in de logs:
conn=45 fd=15 ACCEPT from IP=10.10.10.10
conn=45 op=0 BIND dn="<rootdn>" method =128
conn=45 op=0 BIND dn="<rootdn>" mech= simple ssf=0
conn=45 op=0 RESULT tag=97 err=0 text=
conn=45 op=1 MOD dn="uid=jantje,ou=Users,dc=bij-mij,dc=nl"
conn=45 op=1 RESULT tag=103 err=0 text=
conn=45 op=2 UNBIND
en wanneer phpldapadmin het probeert:
conn=43 fd=15 ACCEPT from IP=10.10.10.10
conn=43 op=0 BIND dn="<rootdn>" method =128
conn=43 op=0 BIND dn="<rootdn>" mech= simple ssf=0
conn=43 op=0 RESULT tag=97 err=0 text=
conn=43 op=1 MOD dn="uid=jantje,ou=Users,dc=bij-mij,dc=nl"
conn=43 op=1 MOD attr=userpassword
conn=43 op=1 RESULT tag=103 err=0 text=
conn=43 op=2 UNBIND
het lijkt dus dat ik niet duidelijk genoeg opgeef dat ik attr=userpassword wil
veranderen.
doehetzelf code?
Ik ben overigens op de hoogte van het manko van het gebruik van Userpasswd in plaats van kerberos en ik weet ook dat het gebruik van de rootdn niet slim is in dit geval. Ik wil later een aparte passwd change only dn gaan maken die dan deze modify moet gaan uitvoeren.
/edit: spelfout
[ Voor 5% gewijzigd door elTigro op 08-04-2004 09:18 ]
Lazlo's Chinese Relativity Axiom:No matter how great your triumphs or how tragic your defeats --approximately one billion Chinese couldn't care less.