Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Actuellement, nous avons une application gérée avec une identification propre à notre logiciel.
Notre client demande de pouvoir gérer cette applcation avec un controle de l'utisateur et du mot de passe par l'ACTIVE DIRECTORY.
La gestion des utilsateurs et des droits serait géré par l'ACTIVE DIRECTORY.
Donc il faudrait au démarrage de notre application, après la saisie de l'opérateur et de son mot de passe, controler son existance via ACTIVE DIRECTOY et non plus par notre gestion interne.
Je ne connais pas ACTIVE DIRECTORY.
Existe-t-il des fonctions, des API pour effectuer ce controle.
D'avance merci pour vos réponses
Cordialement
Le gone de lyon
Hors ligne
Bonjour, regarde du côté de API ADSI
code sample trouvé sur sybase.public.powerbuilder.general
OLEObject l_ole, l_ole2 int li_rc string ls_dept, ls_user, ls_site, ls_computername, ls_path, ls_domain long ll_cnt CONSTANT int TEXTCOMPARE = 1, BINARYCOMPARE = 0, DATABASECOMPARE = 2 l_ole = CREATE OLEObject li_rc = l_ole.ConnectToNewObject( "ADSystemInfo") IF li_rc = 0 THEN ls_computername = l_ole.computername //CN=CAL26040,OU=Computers,OU=calgary,DC=forestoil,DC=com ls_site = l_ole.sitename // calgary ls_user = l_ole.username // CN=Terry Dykstra(tddykstra),OU=Users,OU=calgary,DC=forestoil,DC=com ls_domain = l_ole.domaindnsname // forestoil.com l_ole2 = CREATE OLEObject li_rc = l_ole2.ConnectToObject("LDAP://" + ls_user) IF li_rc = 0 THEN ls_dept = l_ole2.department ls_user = l_ole2.description ls_computername = l_ole2.name END IF END IF l_ole2.DisConnectObject() DESTROY l_ole2 l_ole.DisConnectObject() DESTROY l_ole
Hors ligne
Déterrage en règle
Je viens de bosser un bout de code pour authentifier un user / mot de passe sur le domaine : au lieu de vérifier simplement que le user existe comme avec le code précédent, on passe le couple login / pwd au domaine qui réponds si le login est OK.
Ça permet de déporter la gestion des mots de passe (complexité, expiration, ...) dans l'Active Directory.
public function boolean checklogin (string as_domain, string as_login, string as_pwd); boolean lb_ret = false int li_ret oleobject o_ldap, o_dse, o_check string ls_path, ls_domain constant long ADS_SECURE_AUTHENTICATION = 1 constant long ADS_CHASE_REFERRALS_ALWAYS = 96 //&H60 o_ldap = create oleobject li_ret = o_ldap.connecttoobject("LDAP:") //outputdebugstring("connecttoobject LDAP =" + string(li_ret)) o_dse = create oleobject li_ret = o_dse.connecttoobject("LDAP://RootDSE") //outputdebugstring("connecttoobject LDAP://RootDSE =" + string(li_ret)) ls_domain = o_dse.Get("rootDomainNamingContext") ls_path = "LDAP://OU=Users," + ls_domain try o_check = o_ldap.OpenDSObject(ls_path, as_login, as_pwd, ADS_SECURE_AUTHENTICATION + ADS_CHASE_REFERRALS_ALWAYS) lb_ret = true catch (oleruntimeerror ore) //error or invalid password //outputdebugstring("OpenDSObject error " + ore.getmessage()) end try o_ldap.DisconnectObject() destroy o_ldap o_dse.DisconnectObject() destroy o_dse return lb_ret end function
Hors ligne
Bonjour,
Seki, je n'arrive pas a utiliser ton code.
L'argument as_domain n'est jamais utilisé dans ton code.. Est-ce normal ?
Merci
Hors ligne
Snykito a écrit:
Bonjour,
Seki, je n'arrive pas a utiliser ton code.
L'argument as_domain n'est jamais utilisé dans ton code.. Est-ce normal ?
Merci
J'imagine que as_domain -> ls_domain.
Déterrage pour déterrage, j'ai qqchose sous le coude aussi :
// fonction externe ============================================ FUNCTION long ADsOpenObject(string path, string userName, string password, long flags, ref GUID iid, ref long ppObject) library "activeds.dll" // fonction wf_getdomain ============================================ String ls_domain OLEObject lole_ldap lole_ldap = Create OLEObject lole_ldap.ConnectToNewObject( "ADSystemInfo" ) ls_domain = String( lole_ldap.DomainDNSName ) Destroy lole_ldap Return ls_domain // fonction wf_testconnection ============================================ Long ll_pp, ll_return String ls_message, ls_domain GUID ls_iid // IUnknown interface = 00000000-0000-0000-C000-000000000046 ls_iid.data4[1] = Char( 192 ) ls_iid.data4[4] = Char( 17920 ) // récup du domaine ls_domain = wf_getdomain( ) // test de la connexion ll_return = ADsOpenObject( "LDAP://" + ls_domain, as_login, as_password, 1, Ref ls_iid, Ref ll_pp) // message d'erreur Choose Case ll_return Case 0 // ok Case -2147023570 ; ls_message = f_message( -21, "Utilisateur inconnu ou mot de passe incorrect." ) Case -2147943730 ; ls_message = f_message( -22, "Mot de passe expiré. " ) Case -2147943731 ; ls_message = f_message( -23, "Compte désactivé. " ) Case -2147943755 ; ls_message = f_message( -24, "Domaine non trouvé. " ) Case -2147943763 ; ls_message = f_message( -25, "Identifiant de connexion déjà utilisé." ) Case Else ; ls_message = f_message( -26, "Erreur inconnue. " ) End Choose If ll_return <> 0 Then f_messagebox( -20, "Connexion impossible", "Erreur active directory :~n%1", & StopSign!, Ok!, 1, gs_tab_vide, { ls_message } ) End If Return ( ll_return = 0 )
Hors ligne
Salut
Déterrage pour déterrage !
Comment déclarer le type GUID qui n'est pas reconnu en natif par PB ?
Merci
Hors ligne
Bon c'est bon j'ai trouvé :
TYPE GUID FROM structure unsignedlong data1 unsignedinteger data2 unsignedinteger data3 unsignedinteger data4[4] END TYPE
Hors ligne