Hier ein kleiner Helfer um eine User => Gruppen Matrix automatisch zu bauen aus dem Active Directory. Anleitung und Code findet Ihr auch auf Github. lanbugs/get_ad_right_matrix: Script to export active directory user => group matrix to excel (github.com)
#!/usr/bin/env python3 # # get_ad_right_matrix.py # Export AD User -> Group Matrix to Excel # Written by Maximilian Thoma 2021 # import json import re import ldap3 import pandas as pd ######################################################################################################################## # NOTE: # ----- # Following packages must be installed in your python environment: # pandas, xslxwriter, ldap3 # # Just install them with: # pip install pandas xslxwriter ldap3 # ######################################################################################################################## # Settings # LDAP server ip or fqdn LDAP_SERVER = '10.1.1.231' # LDAP port 389 = unencrypted, 636 = encrypted PORT = 389 # Use SSL? True/False USE_SSL = False # LDAP bind user DN BIND = 'CN=ldap bind,CN=Users,DC=lab,DC=local' # LDAP bind user password BIND_PW = 'Test12345!' # Base search DN SEARCH = 'OU=lab,DC=lab,DC=local' # All users regardless deactivated or activated SEARCH_FILTER = '(&(objectclass=user)(sAMAccountName=*))' # All users who are not deactivated #SEARCH_FILTER = '(&(objectclass=user)(sAMAccountName=*)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))' # All users who are not deactivated and in special group #SEARCH_FILTER = '(&(objectclass=user)(sAMAccountName=*)(!(UserAccountControl:1.2.840.113556.1.4.803:=2))(memberOf=CN=b_testgruppe und restlicher DN))' # Output file FILE = 'output.xlsx' ######################################################################################################################## def main(): # Connect to LDAP and query server = ldap3.Server(LDAP_SERVER, port=389, use_ssl=USE_SSL) conn = ldap3.Connection(server, BIND, BIND_PW, auto_bind=True) conn.search(SEARCH, SEARCH_FILTER, attributes=['memberOf', 'sAMAccountName']) response = json.loads(conn.response_to_json()) def get_cn(cn_str): cn = re.findall(r"CN=([^,]*),?", cn_str)[0] return cn buffer_users = {} buffer_user_in_group = {} for entry in response['entries']: # Get short and long username long_username = get_cn(entry['dn']) short_username = entry['attributes']['sAMAccountName'].lower() # append to users dir buffer_users[short_username] = long_username # go trough groups for group in entry['attributes']['memberOf']: # add to group buffer group_name = get_cn(group) if group_name not in buffer_user_in_group: buffer_user_in_group[group_name] = [] if short_username not in buffer_user_in_group[group_name]: buffer_user_in_group[group_name].append(short_username) matrix = {} length_cell = 0 for group, users in buffer_user_in_group.items(): matrix[group] = {} for user, long_user in buffer_users.items(): index = "%s - %s" % (user, long_user) # determine width of 1 column index_length = len(index) if index_length > length_cell: length_cell = index_length if user in users: matrix[group][index] = "X" else: matrix[group][index] = "-" # generate data matrix with pandas a = pd.DataFrame(matrix) # create excel file writer = pd.ExcelWriter(FILE, engine='xlsxwriter') # write pandas matrix to sheet1 a.to_excel(writer, sheet_name="Sheet1", startrow=1, header=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] # format header line header_format = workbook.add_format( { 'bold': True, 'valign': 'bottom', 'fg_color': '#D7E4BC', 'border': 1, } ) # set header line text rotation to 90 degree header_format.set_rotation(90) # apply header format for col_num, value in enumerate(a.columns.values): worksheet.write(0, col_num + 1, value, header_format) # format for X cells format2 = workbook.add_format( { 'bg_color': '#C6EFCE', 'font_color': '#006100' } ) # set autofilter in first line cols_count = len(a.columns.values) worksheet.autofilter(0, 0, 0, cols_count) # set column width worksheet.set_column(0, 0, length_cell+1) worksheet.set_column(1, cols_count, 3) # freeze panes worksheet.freeze_panes(1, 1) # conditional formatting worksheet.conditional_format('A1:ZA65535', { 'type': 'cell', 'criteria': '=', 'value': '"X"', 'format': format2 }) # save excel file writer.save() if __name__ == "__main__": main()