如何實現用戶一登陸SAP即觸發特定程序的運行的說明(二) 增強SUSR0001

如何實現用戶一登陸SAP即觸發特定程序的運行的說明(二)

作者:袁雲飛(AlbertYuan)- 微信號yuanalbert

以下內容均爲原創,希望對初學者有一些輔助作用,本人主要從事MM/QM/WM的相關工作,不專業處請多多指點,十足乾貨,碼字不易,且行且珍惜,你們的關注就是我努力的動力,轉載請引用出處,感激不盡;

我們在上一篇以及討論過通過標準的一個程序,或者一個函數,就能實現當用戶登錄系統的時候自動執行一個設定好的事務代碼;

這一篇,我們繼續探討實現這個功能的另一個辦法,這個辦法的應用場景可不僅僅只有這一個,如果小夥伴們能腦洞大開,這個辦法可以用來做非常多的功能應用出來;

言歸正傳,我們說的這個方法就是系統爲我們提供的增強SUSR0001;
在這裏插入圖片描述
這個增強裏沒有任何入參,出參,以及表參;其可以在我們登陸系統成功後進行介入;所以我們的設計思路就是,當增強被執行的時候,我們call需要啓動的程序,來完成用戶登錄事務代碼立即啓動的效果;而作爲輔助,我們可以創建一個客製表,裏面存放用戶名和對應的事務代碼,甚至可以設計一個有效期間;這樣當用戶登錄,增強執行的時候,我們先訪問這個客製表,找到是否SY-UNAME的用戶在我們的客製表中存在,並處於有效期,這樣我們就能定製化的讓其執行我們制定的程序;

對於這個增強,我們再拓展延伸一下;比如企業的網絡管理或者域控制比較齊備,我們可以控制,非特定IP或特定IP的用戶能登錄我們的SAP;比如我們創建一個客製表SRVLIST;配置好允許登錄SAP的用戶名和IP地址,以有效期;這樣當授權用戶沒有使用授權IP進行登錄的時候(說白了,用戶移動網絡設置,或不在有效局域網裏);我們可以通過發出錯誤消息,阻止用戶登錄系統;

TABLES: SRVLIST.    
SELECT * FROM SRVLIST
       WHERE SERVER = SYST-HOST
       AND   USER   = SYST-UNAME.
IF SY-SUBRC <> 0.
  MESSAGE E...     
ENDIF.

我們的設計思路就類似於上面的這段僞代碼;

當然了隨着科技發展,如果網絡控制技術本身就能實現這些功能,比如VPN相關技術,或多用戶授權系統等等,則就沒有必要使用上面的方法了,比較這個辦法比較“廉價”O(∩_∩)O;

而如何能在用戶登錄的時候得到其對應的比如IP地址,登錄終端名字,比如計算機名等;我們可以使用函數TH_USER_INFO;很簡單吧;
在這裏插入圖片描述
輸入登錄用戶名(這個好獲得吧),對應client,以及是否堅持GUI(就是檢查是否本次登錄是通過SAP GUI客戶端登錄的,還是其他方式比如WEB);
在這裏插入圖片描述
就能輕鬆得到IP地址,計算機名;

我們再拓展一下這個增強,結合上面這個函數,我們還能設計出一個功能,就是鎖定用戶只能同時打開多少個會話窗口;如上圖,函數同時會返回,目前用戶激活的會話數量,以及最大會話數量,如果我們鎖定某些用戶只能同時打開2個,則通過這裏判斷,結合一個客製化表即可完成我所說的功能,小夥伴們可以自行進行試驗;非常簡單的;

其實這個函數的核心代碼如下;

  CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE_USR_ATTR
    id 'CLIENT' field client
    id 'USR' field user
    ID 'TERMINAL' FIELD TERMINAL
    ID 'TID' FIELD TID
    ID 'HOSTADDR' FIELD HOSTADDR
    ID 'ACT_SESSIONS' FIELD ACT_SESSIONS
    ID 'MAX_SESSIONS' FIELD MAX_SESSIONS
    ID 'MY_SESSION' FIELD MY_SESSION
    ID 'MY_INTERNAL_SESSION' FIELD MY_INTERNAL_SESSION
    ID 'TASK_STATUS' FIELD TASK_STATE
    id 'UPD_REC' field update_rec_exist
    id 'CHECK_GUI' field check_gui
    id 'ADDRSTR' field addrstr.

  rc = sy-subrc.

  if gui_check_failed is requested.
    gui_check_failed = sy-subrc.
  endif.

之所以給小夥伴們看這個,就是我們可以也通過另一個方法來實現控制用戶會話窗口的目的(當然也是利用這個增強);有空的小夥伴可以花點時間研究一下,它的設計思路又是怎麼樣的,是否更優秀一些;

TABLES: UINFO. 
DATA: N TYPE I VALUE 2.              "Upper limit of login sessions 
DATA: OPCODE TYPE X VALUE 2, I TYPE I, A(60). 
DATA: BEGIN OF BDC_TAB1 OCCURS 5. 
        INCLUDE STRUCTURE BDCDATA. 
DATA: END OF BDC_TAB1. 

DATA: BEGIN OF USR_TABL OCCURS 10. 
        INCLUDE STRUCTURE UINFO. 
DATA: END OF USR_TABL. 

* Exclude Limit login by Users 
IF  SY-UNAME <> 'XXX' 
AND SY-UNAME <> 'XXX'. 

CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE 
  ID 'TAB' FIELD USR_TABL-*SYS*. 

LOOP AT USR_TABL. 
  IF SY-UNAME = USR_TABL-BNAME AND SY-MANDT = USR_TABL-MANDT. 
    I = I + 1. 
  ENDIF. 

ENDLOOP. 

IF I >= N. 

A = 'You have already '. 
A+17(2) = I - 1. 
A+19(25) = 'login sessions in client '. 
A+44(4) = SY-MANDT. 

  CALL FUNCTION 'POPUP_TO_INFORM' 
       EXPORTING 
            TITEL = 'UNSUCCESSFUL LOGIN' 
            TXT1  = A 
            TXT2  = 'You are not allowed to log in'. 

  MOVE: 'SAPMSSY0' TO BDC_TAB1-PROGRAM, 
          '120' TO BDC_TAB1-DYNPRO, 
          'X' TO BDC_TAB1-DYNBEGIN. 
  APPEND BDC_TAB1.CLEAR BDC_TAB1. 
  MOVE: 'BDC_OKCODE' TO BDC_TAB1-FNAM, 
         '/nex' TO BDC_TAB1-FVAL. 
  APPEND BDC_TAB1.CLEAR BDC_TAB1. 

  CALL TRANSACTION 'SM04' USING BDC_TAB1 MODE 'N'. 

ENDIF. 
ENDIF. 

最後小夥伴們要注意一點就是,SUSR0001這個增強在低版本的ECC系統裏,不僅僅在用戶登錄系統的時候介入,每次用戶進入事務代碼,它都會介入,所以可以用來做一個用戶操作系統的日誌表來用,當然要注意併發和系統負載的問題;但到了S/4,這個增強就僅僅在用戶登錄系統的時候介入了;

以上爲本章全部內容,希望對小夥伴們有所幫助;

發佈了102 篇原創文章 · 獲贊 1 · 訪問量 8421
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章