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;
/ |