Linux
Programming
Misc
Linux
Programming
Misc
If you have no a central user administration, this report can help. It can create users reading one of the two sources:
The CSV layout is quite simple and it's possible to specify many different roles for each user.
In the table below the record layout:
Field | Note |
---|---|
LogonID | Can be simple (userid) or in User Principal Name format (userid@my_domain) |
First Name | |
Last Name | |
Email address | |
Role List | Roles separated by $ - e.g. ROLE1$ROLE2$ROLE3 |
Another way is to get the user list from a SAP system - this is useful to replicate the same R/3 users in BW, for example.
In this case the roles must be specified in the selection screen, because it's quite sure that R/3 and BW roles will be different.
Obviously all created users will have the same roles - you can specify only common roles and refine every single user after they will be created.
Below the parameters:
Here the source code:
*&---------------------------------------------------------------------* *& Report Z_CREATE_STANDARD_USER *&---------------------------------------------------------------------* *& Create Standard User *&---------------------------------------------------------------------* *& IperCube 2008 *&---------------------------------------------------------------------* REPORT z_create_standard_user. DATA: tab_users TYPE STANDARD TABLE OF txt255. DATA: tab_portal_users TYPE STANDARD TABLE OF txt255. DATA: v_file TYPE string. DATA: w_area TYPE txt255. DATA: wa_bname TYPE xubname. DATA: wa_agr_name TYPE agr_name. * Strutture for passing params to form DATA: BEGIN OF zuser_list_str, logon_id TYPE xubname, firstname TYPE ad_namefir, lastname TYPE ad_namelas, e_mail TYPE ad_smtpadr, fullname TYPE ad_namtext, department TYPE ad_dprtmnt, END OF zuser_list_str. DATA: szmessage(100). DATA: logon_id TYPE string, firstname TYPE string, lastname TYPE string, email TYPE string, role_list TYPE string. *********************************************************************** * Parameters and Checks *********************************************************************** * Source User list params SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title_b1. SELECTION-SCREEN SKIP. PARAMETERS: p_txt RADIOBUTTON GROUP rad1 DEFAULT 'X'. SELECTION-SCREEN ULINE /1(79). PARAMETERS: p_file(100) LOWER CASE. SELECTION-SCREEN COMMENT /33(79) comm1 FOR FIELD p_file. PARAMETERS: p_dept TYPE ad_dprtmnt LOWER CASE. SELECTION-SCREEN SKIP. PARAMETERS: p_r3 RADIOBUTTON GROUP rad1. SELECTION-SCREEN ULINE /1(79). PARAMETERS: p_date TYPE sy-datum DEFAULT sy-datum. SELECT-OPTIONS s_users FOR wa_bname NO INTERVALS. PARAMETERS: p_dest TYPE rfcdes-rfcdest. SELECTION-SCREEN SKIP. SELECTION-SCREEN ULINE /1(79). PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK b1. * User params SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE title_b2. PARAMETERS: p_role AS CHECKBOX DEFAULT 'X'. SELECT-OPTIONS s_roles FOR wa_agr_name NO INTERVALS DEFAULT 'Z_SERVICE'. PARAMETERS: p_ustyp TYPE xuustyp LOWER CASE DEFAULT 'C'. PARAMETERS: p_pwd TYPE xuncode LOWER CASE DEFAULT 'init123456'. SELECTION-SCREEN END OF BLOCK b2. * File for SAP Portal SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE title_b3. SELECTION-SCREEN SKIP. PARAMETERS: p_file1(100) LOWER CASE. SELECTION-SCREEN COMMENT /33(79) comm2 FOR FIELD p_file1. SELECTION-SCREEN END OF BLOCK b3. * Init Costants INITIALIZATION. title_b1 = 'Select the Source for user creation'. title_b2 = 'Additional parameters for user creation'. title_b3 = 'Text file for SAP Portal (language), blank = don''t create'. comm1 = 'Record layout: LogonID;FirstName;LastName;Email;Roles List(separated by $)'. comm2 = 'Upload in SAP Portal via function "User Administration-->Import"'. CONCATENATE 'C:\Profiles\Portal_Users_' sy-datum '_' sy-uzeit '.txt' INTO p_file1. * Check on Source for user creation AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1. * Check on text CSV file IF p_txt = 'X'. IF p_file IS INITIAL. MESSAGE w888(sabapdocu) WITH 'Users list file mandatory !'. ENDIF. ENDIF. * Check on User List from SAP IF p_r3 = 'X'. IF p_date IS INITIAL AND s_users[] IS INITIAL. MESSAGE w888(sabapdocu) WITH 'Insert the starting date or the user list !'. ENDIF. IF p_date IS NOT INITIAL AND s_users[] IS NOT INITIAL. MESSAGE w888(sabapdocu) WITH 'Insert the starting date OR the user list !'. ENDIF. IF p_dest IS INITIAL. MESSAGE w888(sabapdocu) WITH 'Insert an RFC Destination !'. ENDIF. ENDIF. * If roles entered, clear flag "Roles from CSV" AT SELECTION-SCREEN. IF s_roles[] IS NOT INITIAL. CLEAR p_role. ENDIF. * Help CSV file upload AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM help_file USING 'O' CHANGING p_file. * Help for Date AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_date. PERFORM help_data. * Help for RFC Destination AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dest. PERFORM help_rfcdest. * Help for SAP Portal Text file download AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file1. PERFORM help_file USING 'S' CHANGING p_file1. *********************************************************************** START-OF-SELECTION. *********************************************************************** * Get User List from CSV file IF p_txt = 'X' AND p_file IS NOT INITIAL. PERFORM load_users_file. ENDIF. * Get User List from SAP IF p_r3 = 'X'. PERFORM load_sap_users. ENDIF. * Download Text file for SAP Portal if requested IF p_file1 IS NOT INITIAL. PERFORM download_portal_file. ENDIF. *&---------------------------------------------------------------------* *& Form load_users_file *&---------------------------------------------------------------------* * Upload File *----------------------------------------------------------------------* FORM load_users_file. DATA: user_domain TYPE string. DATA: domain TYPE string. DATA: p_get_user(1) VALUE 'N'. DATA: wa_user LIKE zuser_list_str. v_file = p_file. CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = v_file filetype = 'ASC' CHANGING data_tab = tab_users EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. " List header IF p_test IS NOT INITIAL. WRITE / '**** TEST MODE **** User List from CSV file'. ELSE. WRITE / '**** PRODUCTION MODE **** User List CSV file'. ENDIF. ULINE. * Split fields, create users LOOP AT tab_users INTO w_area. SPLIT w_area AT ';' INTO user_domain firstname lastname email role_list. SPLIT user_domain AT '@' INTO logon_id domain. TRANSLATE logon_id TO UPPER CASE. " Create users CLEAR wa_user. wa_user-logon_id = logon_id. wa_user-firstname = firstname. wa_user-lastname = lastname. wa_user-e_mail = email. wa_user-department = p_dept. CONCATENATE wa_user-firstname wa_user-lastname INTO wa_user-fullname SEPARATED BY space. IF p_test IS INITIAL. " Create User PERFORM create_user USING wa_user p_get_user. " Add entry to text file for SAP Portal PERFORM build_portal_entry USING wa_user-logon_id. ELSE. WRITE: / wa_user-logon_id, wa_user-firstname, wa_user-lastname, wa_user-e_mail, wa_user-department. ENDIF. ENDLOOP. ENDFORM. " load_file *&---------------------------------------------------------------------* *& Form load_sap_users *&---------------------------------------------------------------------* * Get Users List from SAP System *----------------------------------------------------------------------* FORM load_sap_users. DATA: user_detail TYPE TABLE OF usr02 WITH HEADER LINE. DATA: wa_user LIKE zuser_list_str. DATA: address LIKE bapiaddr3. DATA: defaults LIKE bapidefaul. DATA: activitygroups TYPE TABLE OF bapiagr WITH HEADER LINE. DATA: groups TYPE TABLE OF bapigroups WITH HEADER LINE. DATA: return TYPE TABLE OF bapiret2 WITH HEADER LINE. DATA: tab_param TYPE TABLE OF bapiparam1 WITH HEADER LINE. DATA: p_get_user(1) VALUE 'Y'. " Get User List CALL FUNCTION 'Z_USER_LIST_GET' DESTINATION p_dest EXPORTING creation_date_start = p_date TABLES user_list = s_users user_detail = user_detail. " List header IF p_test IS NOT INITIAL. WRITE / '**** TEST MODE **** User List from SAP'. ELSE. WRITE / '**** PRODUCTION MODE **** User List from SAP'. ENDIF. ULINE. " Loop on User list LOOP AT user_detail. MOVE-CORRESPONDING user_detail TO wa_user. wa_user-logon_id = user_detail-bname. IF p_test IS INITIAL. " Create User PERFORM create_user USING wa_user p_get_user. " Add entry to text file for SAP Portal PERFORM build_portal_entry USING user_detail-bname. ELSE. WRITE / user_detail-bname. ENDIF. ENDLOOP. ENDFORM. "load_sap_users *&---------------------------------------------------------------------* *& Form Create_User *&---------------------------------------------------------------------* * Create User *----------------------------------------------------------------------* FORM create_user USING p_user STRUCTURE zuser_list_str p_get_user. DATA: wa_usr02 LIKE usr02. DATA: address LIKE bapiaddr3. DATA: logondata LIKE bapilogond. DATA: defaults TYPE bapidefaul. DATA: username TYPE xubname. DATA: password TYPE bapipwd. DATA: wa_activitygroups TYPE bapiagr. DATA: activitygroups TYPE TABLE OF bapiagr WITH HEADER LINE. DATA: groups TYPE TABLE OF bapigroups WITH HEADER LINE. DATA: tab_param TYPE TABLE OF bapiparam1 WITH HEADER LINE. DATA: return TYPE TABLE OF bapiret2 WITH HEADER LINE. * Test if user already created SELECT SINGLE * FROM usr02 INTO wa_usr02 WHERE bname = p_user-logon_id. IF sy-subrc IS INITIAL. CONCATENATE '******* User' p_user-logon_id 'already created !! Anyway, added entry to file for SAP Portal (if specified).' INTO szmessage SEPARATED BY space. WRITE / szmessage. SKIP. EXIT. ENDIF. "If requested, gets user info from SAP, otherwise uses the received IF p_get_user = 'Y'. "I need only a subset of info from SAP CALL FUNCTION 'BAPI_USER_GET_DETAIL' DESTINATION p_dest EXPORTING username = p_user-logon_id IMPORTING defaults = defaults address = address TABLES return = return. ELSE. " Address MOVE-CORRESPONDING p_user TO address. ENDIF. " Logon Data logondata-ustyp = p_ustyp. "User Type username = p_user-logon_id. password = p_pwd. " Check Groups (received form SAP), remove if non existent DATA w_usergroup TYPE xuclass. LOOP AT groups. SELECT SINGLE usergroup FROM usgrp INTO w_usergroup WHERE usergroup = groups-usergroup. IF sy-subrc IS NOT INITIAL. DELETE groups. ENDIF. ENDLOOP. " Defaults values - override some values if received from SAP defaults-langu = 'E'. defaults-spld = 'LOCL'. address-langu_p = 'E'. address-langup_iso = 'EN'. IF address-lastname IS INITIAL. address-lastname = username. ENDIF. " Default Parameters - If needed * REFRESH tab_param. * tab_param-parid = 'MY_PARAMETER'. * tab_param-parva = 'X'. * APPEND tab_param. " Create User - Only with Info I need CALL FUNCTION 'SUSR_BAPI_USER_CREATE' EXPORTING username = username logondata = logondata password = password address = address defaults = defaults TABLES parameter = tab_param return = return groups = groups. "Progress CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = 50 text = return-message. WRITE / return-message. " Assign Roles REFRESH activitygroups. " Check Roles source IF p_role IS INITIAL. "from Parameters LOOP AT s_roles. IF s_roles-low IS NOT INITIAL. activitygroups-agr_name = s_roles-low. APPEND activitygroups. ENDIF. ENDLOOP. ELSE. "from Text File DATA: tab_roles TYPE STANDARD TABLE OF txt255. DATA: w_role TYPE txt255. SPLIT role_list AT '$' INTO TABLE tab_roles. LOOP AT tab_roles INTO w_role. IF w_role IS NOT INITIAL. activitygroups-agr_name = w_role. APPEND activitygroups. ENDIF. ENDLOOP. ENDIF. " Assign Roles CALL FUNCTION 'SUSR_BAPI_USER_ACTGROUPS_ASSIG' EXPORTING username = username TABLES activitygroups = activitygroups return = return. WRITE / return-message. SKIP. "Commit CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. "Progress CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage = 100 text = return-message. ENDFORM. "Create_User *&---------------------------------------------------------------------* *& Form Build_Portal_Entry *&---------------------------------------------------------------------* * Add User to File for import in SAP Portal *----------------------------------------------------------------------* FORM build_portal_entry USING p_logon_id. w_area = '[User]'. APPEND w_area TO tab_portal_users. CONCATENATE 'uid=' p_logon_id INTO w_area. TRANSLATE w_area TO LOWER CASE. APPEND w_area TO tab_portal_users. "Force Language EN for users w_area = 'language=EN'. APPEND w_area TO tab_portal_users. ENDFORM. "Build_Portal_Entry *&---------------------------------------------------------------------* *& Form Download_portal_file *&---------------------------------------------------------------------* * Download File for import in SAP Portal *----------------------------------------------------------------------* FORM download_portal_file. v_file = p_file1. CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING filename = v_file filetype = 'ASC' CHANGING data_tab = tab_portal_users EXCEPTIONS file_write_error = 1 no_batch = 2 gui_refuse_filetransfer = 3 invalid_type = 4 no_authority = 5 unknown_error = 6 header_not_allowed = 7 separator_not_allowed = 8 filesize_not_allowed = 9 header_too_long = 10 dp_error_create = 11 dp_error_send = 12 dp_error_write = 13 unknown_dp_error = 14 access_denied = 15 dp_out_of_memory = 16 disk_full = 17 dp_timeout = 18 file_not_found = 19 dataprovider_exception = 20 control_flush_error = 21 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " Download_portal_file *&---------------------------------------------------------------------* *& Form help_file *&---------------------------------------------------------------------* * Get FileName from Popup *----------------------------------------------------------------------* FORM help_file USING p_mode CHANGING v_file. CALL FUNCTION 'WS_FILENAME_GET' EXPORTING * DEF_FILENAME = ' ' def_path = 'C:\' mask = ',Text files,*.txt;*.csv*,All files,*.*.' mode = p_mode "S=Save, O=Open title = 'User List file' IMPORTING filename = v_file * RC = EXCEPTIONS inv_winsys = 1 no_batch = 2 selection_cancel = 3 selection_error = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " help_file *&---------------------------------------------------------------------* *& Form help_data *&---------------------------------------------------------------------* * Get Date from Popup *----------------------------------------------------------------------* FORM help_data . CALL FUNCTION 'F4_DATE' IMPORTING select_date = p_date. ENDFORM. " help_file *&---------------------------------------------------------------------* *& Form help_rfcdest *&---------------------------------------------------------------------* * Get RFC Destination from Popup *----------------------------------------------------------------------* FORM help_rfcdest. CALL FUNCTION 'SCT2_GET_RFC_DESTINATION_F4' CHANGING cv_rfc_dest = p_dest EXCEPTIONS rfc_dest_not_found = 1 cancel_button_pressed = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. "help_rfcdest