您的位置:首页 > 其它

如何自己生成 Solution Manager Key

2011-05-05 10:52 477 查看
今天偶然得到一个程序,是用来生成 Solution Manager Key 的,有了它,以后装 ECC 版的 SAP 软件就不用到处找人了。



*&---------------------------------------------------------------------*


*& Report ZSLMKEY


*&


*&---------------------------------------------------------------------*


*&


*&


*&---------------------------------------------------------------------*




REPORT ZSLMKEY.




types: begin of dswpclientkey,


INSTNO type num10,


DBID(3),


BUNDLE_ID(8),


SERVICE_KEY(40),


end of dswpclientkey.


*data: dswpclientkey_w type standard table of dswpclientkey.


DATA: P_VALUE(10),


P_INSTNO(10).




PARAMETERS: P_SID(3),


P_SYSNO(2),


P_SERVER(15).




START-OF-SELECTION.


PERFORM GET_SP_VALUE USING P_SID


P_SYSNO


P_SERVER


P_INSTNO


CHANGING P_VALUE.




END-OF-SELECTION.


WRITE P_VALUE.


*&---------------------------------------------------------------------*


*& Form get_sp_value


*&---------------------------------------------------------------------*


* text


*----------------------------------------------------------------------*


* -->P_PF_SID text


* -->P_PF_SYSNO text


* -->P_PF_SERVER text


* <--P_PF_VALUE text


*----------------------------------------------------------------------*


FORM get_sp_value USING P_PF_SID


P_PF_SYSNO


P_PF_SERVER


P_PF_INSTNO


CHANGING P_PF_VALUE.




CONSTANTS: lc_part_len TYPE i VALUE 5,


lc_pw_len TYPE i VALUE 10,


lc_allowed_chars(38) TYPE c VALUE


'-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_'.




data: lf_string(20) type c,


lf_key type i,


ls_key type dswpclientkey,


lf_part(lc_part_len) type c,


lf_finalf(lc_pw_len) type c,


lf_finalx type xstring,


lf_xbuffer type xstring,


lf_opf(10) type c,


lf_langu like sy-langu,


lf_subrc like sy-subrc,


lf_len type i,


lo_conv_to_x TYPE REF TO cl_abap_conv_out_ce.




clear: lf_string, lf_finalx, lf_opf.




concatenate p_pf_sid p_pf_sysno p_pf_server into lf_string.




* Large letters only


translate lf_string to upper case.




lf_langu = sy-langu.


SET LOCALE LANGUAGE 'E'.


lo_conv_to_x = cl_abap_conv_out_ce=>create( encoding = '1100' ).


lf_len = STRLEN( lf_string ).




IF lf_string(lf_len) CN lc_allowed_chars.


else.




* Fold the input string to a lc_part_len long string


WHILE lf_len > 0.


lf_part = lf_string(lc_part_len).


SHIFT lf_string BY lc_part_len PLACES.


lf_len = STRLEN( lf_string ).


CALL METHOD lo_conv_to_x->reset.


CALL METHOD lo_conv_to_x->write( data = lf_part n = -1 ).


lf_xbuffer = lo_conv_to_x->get_buffer( ).


lf_finalx = lf_finalx BIT-XOR lf_xbuffer.


ENDWHILE.




lf_key = 12.




PERFORM scramble USING lf_finalx


lf_key


lc_part_len


CHANGING lf_finalf


lf_subrc.




if not lf_finalf is initial.


p_pf_value = lf_finalf.


ls_key-dbid = p_pf_sid.


ls_key-instno = p_pf_instno.


ls_key-bundle_id = 'SM_KEY'.


ls_key-service_key = lf_finalf.


if not p_pf_instno is initial.


* insert dswpclientkey_w from ls_key.


if sy-subrc <> 0.


* update dswpclientkey_w from ls_key.


endif.


endif.


else.


clear p_pf_value.


endif.


endif.


ENDFORM. " get_sp_value


*&---------------------------------------------------------------------*


*& Form scramble


*&---------------------------------------------------------------------*


* text


*----------------------------------------------------------------------*


* -->P_LF_FINALX text


* -->P_LF_KEY text


* -->P_LC_PART_LEN text


* <--P_LF_finalf text


* <--P_LF_SUBRC text


*----------------------------------------------------------------------*


FORM scramble USING iv_xstring TYPE xstring


iv_key TYPE i


iv_src_len TYPE i


CHANGING lf_finalf


lf_subrc LIKE sy-subrc.




CONSTANTS: lc_max_len TYPE i VALUE 20,


lc_mask(4) TYPE x VALUE '0000003F',


lc_random(64) TYPE x VALUE


'F0ED53B83244F1F876C67959FD4F13A2' &


'C15195EC5483C234774943A27DE26596' &


'5E5398789A17A33CD383A8B829FBDCA5' &


'55D702778413ACDDF9B83116610E6DFA'.




DATA: lv_key_index(4) TYPE x,


lv_rand_index(4) TYPE x,


lv_xkey(4) TYPE x,


lv_xkey_shl_1(4) TYPE x,


lv_xkey_shr_5(4) TYPE x,


lv_scramble_byte TYPE x,


lv_dest(lc_max_len) TYPE x,


lv_index TYPE i,


lv_len TYPE i.




CLEAR lf_subrc.




IF iv_src_len EQ 0. EXIT. ENDIF.


lv_len = XSTRLEN( iv_xstring ).


IF iv_src_len GT lc_max_len OR


iv_src_len GT lv_len.


lf_subrc = 2.


EXIT.


ENDIF.




lv_xkey = iv_key.


lv_xkey_shl_1 = iv_key * 2.


lv_xkey_shr_5 = iv_key DIV 32.


lv_rand_index = lv_xkey BIT-XOR lv_xkey_shr_5 BIT-XOR lv_xkey_shl_1.


lv_rand_index = lv_rand_index BIT-AND lc_mask.




lv_index = 0.


DO iv_src_len TIMES.


CATCH SYSTEM-EXCEPTIONS compute_int_times_overflow = 1.


lv_key_index = ( iv_key * lv_index * lv_index ) - lv_index.


ENDCATCH.


IF sy-subrc <> 0.


lf_subrc = 1.


EXIT.


ENDIF.


lv_scramble_byte = lc_random+lv_rand_index(1) BIT-XOR


lv_key_index+3(1).


lv_dest+lv_index(1) = iv_xstring+lv_index(1) BIT-XOR


lv_scramble_byte.


lv_index = lv_index + 1.


lv_rand_index = lv_rand_index + 1.


lv_rand_index = lv_rand_index BIT-AND lc_mask.


ENDDO.


IF lf_subrc <> 0.


EXIT.


ENDIF.




WRITE lv_dest(iv_src_len) TO lf_finalf.




ENDFORM. " scramble
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: