IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

DBMS_LDAP - Chercher un utilisateur / argument [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    octobre 2006
    Messages
    445
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 445
    Points : 133
    Points
    133
    Par défaut DBMS_LDAP - Chercher un utilisateur / argument
    Bonjour à tous,

    Il y a quelques articles remontés par Google seulement (je suis désolé), je n'arrive pas à comprendre comment faire ce que je souhaite faire.

    Dans un premier temps, j'arrive à établir une connexion LDAP à notre ActiveDirectory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    SET SERVEROUTPUT ON SIZE 1000000
    DECLARE
      -- Adjust as necessary.
      l_ldap_host    VARCHAR2(256) := 'DC02';
      l_ldap_port    VARCHAR2(256) := '389';
      l_ldap_user    VARCHAR2(256) := 'cn=ldap_user,OU=People-MKT,DC=intra-hospital,DC=fr';
      l_ldap_passwd  VARCHAR2(256) := 'Hjui8-(L;9;';
      l_retval       PLS_INTEGER; 
      l_session      DBMS_LDAP.session;
      l_attrs        DBMS_LDAP.string_collection;
     
     
    BEGIN
      -- Choose to raise exceptions.
      DBMS_LDAP.USE_EXCEPTION := TRUE;
     
      -- Connect to the LDAP server.
      l_session := DBMS_LDAP.init(hostname => l_ldap_host,
                                  portnum  => l_ldap_port);
     
      l_retval := DBMS_LDAP.simple_bind_s(ld     => l_session,
                                          dn     => l_ldap_user,
                                          passwd => l_ldap_passwd);
     
     
      -- Disconnect from the LDAP server.
      l_retval := DBMS_LDAP.unbind_s(ld => l_session);
      DBMS_OUTPUT.PUT_LINE('L_RETVAL: ' || l_retval);
    END;
    /

    Ensuite, je souhaite chercher un utilisateur et récupérer un argument qui se nomme idnoyau.

    Je cherche un utilisateur qui se nomme [test_ldap] et son argument [idnoyau]. Il se trouve dans l'arborescence [OU=5678,OU=67,OU=16,OU=People-MKT,DC=intra-hospital,DC=fr].

    Puis-je chercher l'utilisateur à partir de la base de mon domaine [OU=People-MKT,DC=intra-hospital,DC=fr] ou faut-il renseigner l'OU [OU=5678,OU=67,OU=16,OU=People-MKT,DC=intra-hospital,DC=fr] ou se trouve l'objet cherché?

    Avez-vous des exemples à m'expliquer s'il vous plait?


    Merci d'avance pour votre aide,

    Bonne journée,
    Matt

  2. #2
    Membre habitué
    Inscrit en
    octobre 2006
    Messages
    445
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 445
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Je progresse.

    J'arrive à me connecter et à parcourir une OU à l'aide de ce script : https://gist.github.com/nikitsky/44c66c539a1f014b5ac9

    Maintenant, j'ai déclaré une variable qui correspond à un argument d'un objet utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	my_attr_matricule	VARCHAR2(256) := 'employeeNumber';
    Je tente de récupérer seulement cette argument pour un utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		--- Test recupération matricule RH
    		BEGIN
    			my_vals := DBMS_LDAP.get_values (my_session, my_entry, my_attr_matricule);
    			DBMS_OUTPUT.PUT_LINE('           ' || my_attr_matricule || ' : '|| my_vals(1));		
    		EXCEPTION WHEN NO_DATA_FOUND THEN
    			DBMS_OUTPUT.PUT_LINE('pas de matricule');
    		END;
    Seulement, ça me retourne systématiquement qu'il n'y a pas de donnée...

    Alors que l'argument existe bien.
    employeeNumber : 094253


    Merci d'avance pour votre aide,

    Matt

  3. #3
    Membre habitué
    Inscrit en
    octobre 2006
    Messages
    445
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 445
    Points : 133
    Points
    133
    Par défaut
    C'est bon j'ai trouvé c'est une erreur de ma part.
    Dans la collecte des informations de l'objet au préalable, je ne récupérais pas l'argument EmployeeNumber. Donc non présent dans le record.

    Matt

  4. #4
    Membre habitué
    Inscrit en
    octobre 2006
    Messages
    445
    Détails du profil
    Informations forums :
    Inscription : octobre 2006
    Messages : 445
    Points : 133
    Points
    133
    Par défaut
    Juste au cas ou si quelqu'un comme galère, voici ce que j'ai fasi à partir de mes recherches à droite à gauche.
    Attention : Je ne suis pas DBA ni developpeur ce n'est donc pas du tout optimisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    -- ---------------------------------------------------------------------------------------
    -- Titre           : AD_GET_AGENT_INFO
    -- Auteur          : 
    -- Date de creation : 
    -- Description     : Recupère dans l'annuaire ActiveDirectory des informations sur un agent
    -- 
    -- Description des variables :
    --		IN :
    --			my_dn_etablissement	==> Code établissement
    --			my_dn_pole			==> Code du pôle
    --			my_dn_service		==> Code du service
    --			my_dn_uf			==> Code de l'UF
    --			my_matricule_search	==> Matricule agent recherché
    --		OUT:
    --			my_agent_login		==> Login AD de l'agent dans l'annuaire
    --			my_agent_mail		==> Adresse courriel de l'agent
    --			my_agent_idcu		==> IDCU de l'agent dans le NOYAU REFERENCE
    --			retour_exec_code	==> Code retour d'execution
    --
    -- -----------------------------------------------------------------------------
    --
    -- Nomenclature code erreur retour :
    --		100 - Execution la branche de recherche existe et le matricule également
    --		110 - La branche de recherche dans l'annuaire n'existe pas
    --		111 - Erreur à la récupération du prermier enregistrement
    --		112 - Erreur à la récupération d'un attribut
    --		113 - Le matricule n'existe pas
    -- 
    -- -----------------------------------------------------------------------------
    -- Modification :
    -- Date          Auteur                    Version   Objet
    -- -----------------------------------------------------------------------------
    -- 1		    					       1.0       Creation
    -- -----------------------------------------------------------------------------
    -- 
    -- -----------------------------------------------------------------------------
     
    CREATE OR REPLACE PROCEDURE AD_GET_AGENT_INFO (		my_dn_etablissement IN	VARCHAR2,
    													my_dn_pole			IN	VARCHAR2,
    													my_dn_service		IN	VARCHAR2,
    													my_dn_uf			IN	VARCHAR2,
    													my_matricule_search IN	VARCHAR2,
    													my_agent_login		OUT	VARCHAR2,
    													my_agent_mail		OUT	VARCHAR2,
    													my_agent_idcu		OUT	VARCHAR2,
    													retour_exec_code	OUT NUMBER)
    IS
        retval              PLS_INTEGER;
        my_session          DBMS_LDAP.session;
        my_attrs            DBMS_LDAP.string_collection;
        my_message          DBMS_LDAP.message;
        my_entry            DBMS_LDAP.message;
        entry_index         PLS_INTEGER;
        my_attr_name        VARCHAR2(256);
        my_ber_elmt         DBMS_LDAP.ber_element;
        attr_index          PLS_INTEGER;
        i                   PLS_INTEGER;
        my_vals             DBMS_LDAP.STRING_COLLECTION ;
    	mouchard_matricule	VARCHAR2(10) := 'NON';
     
    	-- A modifier - Information de connexion à l'annuaire LDAP
        ldap_host           VARCHAR2(256) := 'DC02' ;
        ldap_port           VARCHAR2(256) := '389';
        ldap_user           VARCHAR2(256) := 'cn=ldap_user,OU=People-MKT,DC=intra-hospital,DC=fr';
        ldap_passwd         VARCHAR2(256) := 'Hjui8-(L;9;';
        ldap_base			VARCHAR2(256) := 'OU=People-MKT,DC=intra-hospital,DC=fr';
    	ldap_base_search	VARCHAR2(256);
     
    BEGIN
     
    	-- Formattage de la base de recherche
    	ldap_base_search := 'OU=' || my_dn_uf || ',OU=' || my_dn_service || ',OU=' || my_dn_pole || ',OU=' || my_dn_etablissement || ',' || ldap_base;
     
        retval := -1;
        -- Gestion des exceptions au travers de la librairie DBMS_LDAP.
        -- DBMS_LDAP.USE_EXCEPTION := TRUE;
     
    	-- Initialisation de la session à l'annuaire
        my_session := DBMS_LDAP.init(ldap_host,ldap_port);
     
        -- Ouverture de la session à l'annuaire avec authentification
        retval := DBMS_LDAP.simple_bind_s(my_session, ldap_user, ldap_passwd);
     
        -- Declaration de recherche des arguments
        -- Liste des arguments que l'on souhaite collecter
    	my_attrs(1) := 'employeeNumber'; -- Matricule
    	my_attrs(2) := 'sAMAccountName'; -- Login AD
    	my_attrs(3) := 'idnoyau'; -- IDCU du NOYAU
    	my_attrs(4) := 'mail'; -- Mail
     
    	BEGIN
    		-- Récupération des objets dans la branche déclarée
    		retval := DBMS_LDAP.search_s(my_session, ldap_base_search,DBMS_LDAP.SCOPE_SUBTREE,'objectClass=user',my_attrs,0,my_message);
    	EXCEPTION
    		WHEN OTHERS THEN
    			retour_exec_code := 110;
    	END;
     
    	BEGIN
    		-- Recupération du premier enregistrement
    		my_entry := DBMS_LDAP.first_entry(my_session, my_message);
    	EXCEPTION
    		WHEN OTHERS THEN
    			if retour_exec_code != 110 then
    				retour_exec_code := 111;
    			end if;
    	END;
    	entry_index := 1;
     
    	-- Boucle pour parcourir les enregistrements
    	while my_entry IS NOT NULL loop
     
    		-- Recuperation de la valeur du matricule pour l'enregistrement parcouru	
    		my_vals := DBMS_LDAP.get_values (my_session, my_entry, my_attrs(1));
     
    		if my_vals.COUNT > 0 then
    			FOR i in my_vals.FIRST..my_vals.LAST loop
    				-- Verification si c'est le matricule recherche
    				if (my_matricule_search = SUBSTR(my_vals(i),1,200))  then
     
    					-- Matricule trouvé, on initialise le mouchard à OUI
    					mouchard_matricule := 'OUI';
     
    					-- Récupération du nom des arguments
    					my_attr_name := DBMS_LDAP.first_attribute(my_session,my_entry, my_ber_elmt);
    					attr_index := 1;
     
    					-- Boucle pour parcourir les arguments récupérés
    					while my_attr_name IS NOT NULL loop
     
    						-- Certains attributs ne sont pas lisibles - on les ignores
    						if my_attr_name not in ('objectGUID', 'objectSid', 'dnsRecord') then
    							begin
    								-- Recuperation des valeurs des attributs que l'on souhaite recuperer
    								my_vals := DBMS_LDAP.get_values (my_session, my_entry, my_attr_name);
     
    								if my_vals.COUNT > 0 then
    									-- Boucle pour parcourir chaque valeur de l'argumenet
    									FOR i in my_vals.FIRST..my_vals.LAST loop
    										-- Recuperation du login AD
    										if (my_attrs(2) = my_attr_name) then
    											my_agent_login := SUBSTR(my_vals(i),1,200);
    										end if;
    										-- Recuperation du IDCU NOYAU
    										if (my_attrs(3) = my_attr_name) then
    											my_agent_idcu := SUBSTR(my_vals(i),1,200);
    										end if;
    										-- Recuperation du courriel
    										if (my_attrs(4) = my_attr_name) then
    											my_agent_mail := SUBSTR(my_vals(i),1,200);
    										end if;
    									end loop;
    								end if;
     
    							EXCEPTION
    								WHEN OTHERS THEN
    									if retour_exec_code != 110 AND retour_exec_code != 111 then
    										retour_exec_code := 112;
    									end if;
    							END;
    						end if;
    					-- Passe à l'attribut suivant
    					my_attr_name := DBMS_LDAP.next_attribute(my_session,my_entry, my_ber_elmt);
    					attr_index := attr_index+1;
    					end loop;
    				end if;
    			end loop;
    		end if;
     
    		-- Passe à l'objet utilisateur suivant
    		my_entry := DBMS_LDAP.next_entry(my_session, my_entry);
    		entry_index := entry_index+1;
    	end loop;
     
    	-- Traitement du code retour si l'utilisateur existe ou non
    	if ( mouchard_matricule = 'OUI' ) then
    			retour_exec_code := 100;
    	else
    		if retour_exec_code != 110 AND retour_exec_code != 111 AND retour_exec_code != 112 then
    			retour_exec_code := 113;
    		end if;
    	end if;
    	-- Deconnexion de la session à l'annuaire
    	retval := DBMS_LDAP.unbind_s(my_session);
     
    -- Handle Exceptions
    -- EXCEPTION
    --     WHEN OTHERS THEN
    --         DBMS_OUTPUT.PUT_LINE(' Error code    : ' || TO_CHAR(SQLCODE));
    --         DBMS_OUTPUT.PUT_LINE(' Error Message : ' || SQLERRM);
    --         DBMS_OUTPUT.PUT_LINE(' Exception encountered .. exiting');
    END AD_GET_AGENT_INFO;
    /

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LibreOffice] [Visual Basic]Comment retourner plusieurs arguments d'un type défini par l'utilisateur
    Par Obulle dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 06/01/2016, 14h14
  2. Réponses: 12
    Dernier message: 20/04/2011, 22h14
  3. Réponses: 26
    Dernier message: 28/10/2009, 10h07
  4. DBMS_LDAP.compare_s(..) sur utilisateur Désactiver.
    Par Jonathan.Harvey dans le forum PL/SQL
    Réponses: 0
    Dernier message: 16/09/2009, 21h56
  5. ou chercher les sorties utilisateurs dans tomcat
    Par gloglo dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 08/12/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo