I did not found a standard method to replicate users. But SAP provides mighty BADI function modules for authorizations – with them (if you have an RFC destination) it is possible to replicate users quite easy:
report z_usr_repl.
types:
begin of struc_usr,
user_src type bapibname-bapibname,
user_tgt type bapibname-bapibname,
passwd type string,
txt type string,
type type bapi_mtype,
id type symsgid,
number type symsgno,
message type bapi_msg,
log_no type balognr,
log_msg_no type balmnr,
message_v1 type symsgv,
message_v2 type symsgv,
message_v3 type symsgv,
message_v4 type symsgv,
end of struc_usr
.
data: lv_username_new type bapibname-bapibname,
lv_username_src type bapibname-bapibname,
lt_fields type slis_t_fieldcat_alv,
ls_fields like line of lt_fields,
lt_usr type standard table of struc_usr,
lt_usr2 type standard table of struc_usr,
ls_usr like line of lt_usr,
lv_return type standard table of bapiret2,
ls_logondata type bapilogond,
ls_defaults type bapidefaul,
ls_address type bapiaddr3,
lv_company type bapiuscomp,
lv_islocked type bapislockd,
lt_parameter type standard table of bapiparam,
activitygroups type standard table of bapiagr,
lt_addtel type standard table of bapiadtel,
lt_addsmtp type standard table of bapiadsmtp,
lv_password type bapipwd,
lv_lock_locally type bapiuslockx-bapiuslock,
lv_generated_password type bapipwd.
select-options: susr for ls_usr-user_src default 'MYUSER'.
loop at susr assigning field-symbol().
lv_username_new = 'MYUSER_T'.
lv_username_src = -low.
ls_usr-user_src = lv_username_src.
ls_usr-user_tgt = lv_username_new.
call function 'BAPI_USER_GET_DETAIL' " DESTINATION 'SYSCLNT100'
exporting
username = lv_username_src
* CACHE_RESULTS = 'X'
importing
logondata = ls_logondata
defaults = ls_defaults
address = ls_address
company = lv_company
* SNC = SNC
* REF_USER = REF_USER
* ALIAS = ALIAS
* UCLASS = UCLASS
* LASTMODIFIED = LASTMODIFIED
islocked = lv_islocked
* IDENTITY = IDENTITY
* ADMINDATA = ADMINDATA
* description = description
tables
parameter = lt_parameter
* PROFILES = PROFILES
activitygroups = activitygroups
return = lv_return
addtel = lt_addtel
* ADDFAX = ADDFAX
* ADDTTX = ADDTTX
* ADDTLX = ADDTLX
addsmtp = lt_addsmtp
* ADDRML = ADDRML
* ADDX400 = ADDX400
* ADDRFC = ADDRFC
* ADDPRT = ADDPRT
* ADDSSF = ADDSSF
* ADDURI = ADDURI
* ADDPAG = ADDPAG
* ADDCOMREM = ADDCOMREM
* PARAMETER1 = PARAMETER1
* GROUPS = GROUPS
* UCLASSSYS = UCLASSSYS
* EXTIDHEAD = EXTIDHEAD
* EXTIDPART = EXTIDPART
* SYSTEMS = SYSTEMS
.
move-corresponding lv_return to lt_usr2 keeping target lines .
if lv_return is initial.
clear lv_return.
call function 'BAPI_USER_DELETE'
exporting
username = lv_username_new
tables
return = lv_return.
move-corresponding lv_return to lt_usr2 keeping target lines .
clear lv_return.
lv_password-bapipwd = 'tt'.
lv_lock_locally = lv_islocked-local_lock.
call function 'BAPI_USER_CREATE1'
exporting
username = lv_username_new
logondata = ls_logondata
password = lv_password
defaults = ls_defaults
address = ls_address
company = lv_company
lock_locally = lv_lock_locally
generate_pwd = 'X'
importing
generated_password = lv_generated_password
tables
parameter = lt_parameter
return = lv_return
addtel = lt_addtel
addsmtp = lt_addsmtp.
move-corresponding lv_return to lt_usr2 keeping target lines .
clear lv_return.
call function 'BAPI_USER_ACTGROUPS_ASSIGN'
exporting
username = lv_username_new
tables
activitygroups = activitygroups
return = lv_return.
move-corresponding lv_return to lt_usr2 keeping target lines.
clear lv_return.
ls_usr-txt = 'created user'.
ls_usr-passwd = lv_generated_password.
else.
ls_usr-txt = ' Error when reading user in source'.
endif.
append ls_usr to lt_usr.
endloop.
append lines of lt_usr2 to lt_usr.
*--------------------------------------------------------------------
* Display
*--------------------------------------------------------------------
ls_fields-col_pos = 1.
ls_fields-fieldname = 'user_src'.
ls_fields-seltext_l = 'user_src'.
ls_fields-outputlen = 10.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'user_tgt'.
ls_fields-seltext_l = 'user_tgt'.
ls_fields-outputlen = 10.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'PASSWD'.
ls_fields-seltext_l = 'PASSWD'.
ls_fields-outputlen = 28.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'TXT'.
ls_fields-seltext_l = 'TXT'.
ls_fields-outputlen = 38.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'message'.
ls_fields-seltext_l = 'message'.
ls_fields-outputlen = 20.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'message_v1'.
ls_fields-seltext_l = 'message_v1'.
ls_fields-outputlen = 20.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'message_v2'.
ls_fields-seltext_l = 'message_v2'.
ls_fields-outputlen = 20.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'message_v3'.
ls_fields-seltext_l = 'message_v3'.
ls_fields-outputlen = 20.
append ls_fields to lt_fields.
ls_fields-col_pos = ls_fields-col_pos + 1.
ls_fields-fieldname = 'message_v4'.
ls_fields-seltext_l = 'message_v4'.
ls_fields-outputlen = 20.
append ls_fields to lt_fields.
* call ALV
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_grid_title = ''
it_fieldcat = lt_fields
tables
t_outtab = lt_usr
exceptions
program_error = 1
others = 2.
if sy-subrc 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.