Python Sync AD with MySQL DB
Revision as of 13:01, 5 February 2020 by Michael.mast (talk | contribs)
Contents
Purpose
To dip my toes into Python.
My intern is syncing a local MySQL database with an external payroll API. Great, but now I need this information synced with AD.
Full Script
##Import things from ldap3 import Server, Connection, ALL, NTLM, MODIFY_REPLACE import mysql.connector from ldap_filter import Filter ##LDAP Setup ldap_server = Server('<ldap server>') ldap_conn = Connection( ldap_server, user="tld\\<adminaccount>", password='<somepassword>', authentication=NTLM ) ##MySQL Setup mysql_conn = mysql.connector.connect( host = "<somehostname>", user = "<db user name>", passwd = "<somepassword>", database = "<database name>" ) ##Value Mapping values_dict = { "First_Name": "givenname", "Middle_Name": "middlename", "Last_Name": "sn", "Preferred_Name": "extensionattribute2", "Work_Location": "physicaldeliveryofficename", "Work_City": "l", "Work_State": "st", "Work_Postal": "postalcode", "Work_Email": "mail" } ##Make connections and compare values. cursor = mysql_conn.cursor() selecttest = "select * from Employee_Info" try: ldap_conn.bind() except: print("Unable to bind to LDAP") exit() try: cursor.execute(selecttest) except: print("Unable to select from database") exit() else: dblist = cursor.fetchall() for i in dblist: #print(i) #print(i[1]) Employee_ID = i[1] First_Name = i[2] Middle_Name = i[3] Last_Name = i[4] Preferred_Name = i[13] Work_Address1 = i[15] Work_Address2 = i[16] Work_City = i[17] Work_State = i[18] Work_Postal = i[19] Job_Title = i[20] Position_Code = i[21] Work_Email = i[22] ldap_conn.search('DC=domain,DC=tld', '(employeeid={})'.format(Employee_ID), attributes = ["givenname","middlename","sn","extensionattribute2","physicaldeliveryofficename","streetaddress","l","st","postalcode","title","mail"]) #print(ldap_conn.entries) try: dn = ldap_conn.entries[0].entry_dn except: '' for x in values_dict: value2 = values_dict[x] try: result1 = getattr(ldap_conn.entries[0], value2) #print(result1) except Exception as error: '' else: if Work_Address2: sql_address='{0}\n{1}'.format(Work_Address1, Work_Address2) else: sql_address=Work_Address1 ldap_address=(ldap_conn.entries[0].streetaddress) if sql_address != ldap_address: print('Updating Address for ',First_Name, Last_Name) #print('Comparing\n',sql_address,'\n\n',ldap_address) ldap_conn.modify(dn, {'streetaddress' : [(MODIFY_REPLACE, [sql_address])] }) ldap1 = str(result1) ldap2 = ldap1.lower() if '[' not in ldap2: try: sql1 = eval(x) sql1 = str(sql1) sql2 = sql1.lower() if not sql2: raise Exception('sql2 is empty') except Exception as error: '' else: if ldap2 != sql2: print(First_Name, Last_Name) #print('SQL', sql1, 'does not match LDAP', ldap1) sql3 = sql2.capitalize() print(sql3, 'replacing', ldap1) ldap_conn.modify(dn, {value2 : [(MODIFY_REPLACE, [sql3])] }) ldap_conn.unbind()
LDAP
[1] Running this on Amazon Linux 2
sudo pip3 install ldap3 ldap-filter
MySQL
sudo pip3 install mysql-connector-python