您的位置:首页 > Web前端

如何自己生成 Solution Manager Key

2009-02-20 08:13 531 查看
 

今天偶然得到一个程序,是用来生成 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息