Wednesday, July 28, 2010

Modify AD from PL/SQL

Here is how we connect to and modify our Active Directory @ my current place of business using PL/SQL. Our setup is Oracle 11gR1/RHEL.



DECLARE

SSL_WALLET_AUTH VARCHAR2(256) := '*******************';
SSL_WALLET_LOC VARCHAR2(256) := 'file:/opt/oracle/walletloc/subfolder';

AD_SERVER VARCHAR2(256) := 'server.someaddress.edu';
AD_BASE VARCHAR2(256) := 'DC=something,DC=edu';
AD_PORT NUMBER := 636;
AD_USERNAME VARCHAR2(400) := 'DOMAIN\username';
AD_PASSWORD VARCHAR2(100) := '*******************';

SESSN DBMS_LDAP.SESSION;
MYRETVAL PLS_INTEGER;
MYMESSAGE DBMS_LDAP.MESSAGE;

MA DBMS_LDAP.MOD_ARRAY;
MAN NUMBER := 1; -- current number of attributes to populate

DN VARCHAR2(300);

NEW_ATTR_VAL_COL DBMS_LDAP.STRING_COLLECTION;

ATTRIBUTE_TO_CHANGE VARCHAR2(1000);

BEGIN

DN := 'CN=Lname\, fname,CN=Users,DC=something,DC=edu'; --distinguishedName from AD
ATTRIBUTE_TO_CHANGE := 'department';
NEW_ATTR_VAL_COL(1) := 'Network Ops';

DBMS_LDAP.USE_EXCEPTION := TRUE;

SESSN := DBMS_LDAP.INIT(AD_SERVER, AD_PORT); -- start LDAP session
MYRETVAL := DBMS_LDAP.OPEN_SSL(SESSN, SSL_WALLET_LOC, SSL_WALLET_AUTH, 2); --open ssl channel
MYRETVAL := DBMS_LDAP.SIMPLE_BIND_S(SESSN, AD_USERNAME, AD_PASSWORD); -- bind auth as user

MA := DBMS_LDAP.CREATE_MOD_ARRAY(MAN);

DBMS_LDAP.POPULATE_MOD_ARRAY(MODPTR => MA, MOD_OP => DBMS_LDAP.MOD_REPLACE, MOD_TYPE => ATTRIBUTE_TO_CHANGE, MODVAL => NEW_ATTR_VAL_COL);

-- actual modification occurs here
MYRETVAL := DBMS_LDAP.MODIFY_S(SESSN, DN, MA);

DBMS_LDAP.FREE_MOD_ARRAY(MA);
MYRETVAL := DBMS_LDAP.UNBIND_S(SESSN);

EXCEPTION
WHEN OTHERS THEN

MYRETVAL := DBMS_LDAP.UNBIND_S(SESSN);
DBMS_OUTPUT.PUT_LINE(SQLERRM);

END;

1 comment:

  1. Hello,

    very useful information. I have allmost the same task to do. Could you tell me how you created sertificates and added them in oracle wallet?

    ReplyDelete