RFC로 접속시 해당 사용자의 로컬 아이피 가져오는 방법..

  • Home
  • ABAPABAP QnA
  • RFC로 접속시 해당 사용자의 로컬 아이피 가져오는 방법..

안녕하세요~^^
제가 예전에 History 체크를 위해 사용자의 로컬 아이피를 가져오는 펑션을 구현한 적이 있었습니다..
이렇게 떡 하니.. TERMINAL_ID_GET라는 펑션이 있는 줄도 모르고..
그런데 이 때.. 사용을 하다가 보니.. RFC로 접속을 했을 때..
이 펑션을 사용해도 아이피를 체크해서 가져오지를 못하더라구요…
제가 다른 작업중에 RFC로 접속했을 때도 제 아이피를 가져오는 TCODE를 본적이 있는데..
혹시 아이피를 알 수 있는 TCODE나…(TCODE만 알면 디버깅이라도 해서..^^)
RFC접속시에도 아이피를 가져올 수 있는 펑션을 아신다면 도움 부탁드리겠습니다..
그럼.. 즐거운 하루 되세요~^^


5 Comments

avatar

예전에 만든 함수인데.. 한번 테스트해보세요~

FUNCTION z_bc_ipaddress.
*”———————————————————————-
*”*”Local interface:
*” EXPORTING
*” REFERENCE(IP) LIKE ZBC0002T-ZIP
*”———————————————————————-

DATA: BEGIN OF desti OCCURS 100.
INCLUDE STRUCTURE msxxlist.
DATA: END OF desti.

DATA: BEGIN OF usr_list OCCURS 1000.
INCLUDE STRUCTURE uinfo.
DATA: END OF usr_list.

DATA: BEGIN OF serverp OCCURS 100, ” Presentationserver
s(32),sl(15),x(4) TYPE x,l(5),h(5),m(5),c,pro(4),commu,
” SL(31) for new IP-Address
END OF serverp.

*>Server IP address
REFRESH desti.
CALL FUNCTION ‘RFC_GET_LOCAL_SERVERS’
TABLES
hosts = desti
EXCEPTIONS
not_available = 1.

READ TABLE desti WITH KEY host = sy-host.
IF sy-subrc EQ 0.
REFRESH usr_list.
CALL FUNCTION ‘THUSRINFO’ DESTINATION desti-name
TABLES
usr_tabl = usr_list
EXCEPTIONS
communication_failure = 17.
IF sy-subrc = ’17’.
serverp-commu = ‘P’.
EXIT.
ELSE.
serverp-commu = ‘ ‘.
ENDIF.
READ TABLE usr_list WITH KEY bname = sy-uname.
IF sy-subrc EQ 0.
CLEAR serverp-s.
serverp-s = usr_list-term.
serverp-x = usr_list-hostadr.

*> SERVERP-SL —> IP Address —>
ENDIF.
ENDIF.

TABLES UINFO.

DATA OPCODE TYPE X VALUE 2.
DATA USR_TABL LIKE UINFO OCCURS 10 WITH HEADER LINE.

DATA: rs_id(30) type c,
l_tid type utid.

CONSTANTS: opcode_usr_attr TYPE x VALUE 5.

CALL ‘ThUsrInfo’ ID ‘OPCODE’ FIELD opcode_usr_attr
ID ‘TID’ FIELD l_tid.

CALL ‘ThUsrInfo’ ID ‘OPCODE’ FIELD OPCODE
ID ‘TAB’ FIELD USR_TABL-*SYS*.

*LOOP AT USR_TABL where tid = l_tid.
*WRITE: /1 USR_TABL-TID,’|’, “Terminal ID
*USR_TABL-MANDT,’|’, “Client
*USR_TABL-BNAME,’|’, “User name
*USR_TABL-TCODE,’|’, “Tcode
*USR_TABL-TERM,’|’. “Terminal name
*ENdLOOP.

DATA: gs_USR41 TYPE USR41. ” occurs 0 with header line.

select *
INTO CORRESPONDING FIELDS OF gs_usr41
from USR41
where bname = sy-uname
and termid = l_tid.
endselect.
* read table gt_usr41 with key terminal+14 = usr_list-term.

MOVE gs_usr41-terminal+0(14) TO ip.

REPLACE ‘-‘ WITH SPACE INTO ip.
CONDENSE ip NO-GAPS.
ENDFUNCTION.

avatar

감사합니다..^^ 하지만 안되네요~
저두 1년전쯤인가 다른 소스 참조해서 위 소스와 유사하게 코딩을 했었습니다..
위 소스와 아래 소스는 TERMINAL_ID_GET이라는 펑션과 기능이 동일 합니다…
저는 RFC로 다른 서버에 접속했을 시 접속한 사용자의 아이피 정보가 필요합니다…

FUNCTION ZLOCIPADDR .
*”———————————————————————-
*”*”Local interface:
*” EXPORTING
*” REFERENCE(IP) TYPE C
*” TABLES
*” LUSR_LIST STRUCTURE UINFO
*”———————————————————————-

DATA: BEGIN OF DESTI OCCURS 100.
INCLUDE STRUCTURE MSXXLIST.
DATA: END OF DESTI.

DATA: BEGIN OF TUSR_LIST OCCURS 1000.
INCLUDE STRUCTURE UINFO.
DATA: END OF TUSR_LIST.

DATA: BEGIN OF SERVERP OCCURS 100, ” Presentationserver
S(32),SL(15),X(4) TYPE X,L(5),H(5),M(5),C,PRO(4),COMMU,
” SL(31) for new IP-Address
END OF SERVERP.

*>Server IP address
REFRESH DESTI.
CALL FUNCTION ‘RFC_GET_LOCAL_SERVERS’
TABLES
HOSTS = DESTI
EXCEPTIONS
NOT_AVAILABLE = 1.

READ TABLE DESTI WITH KEY HOST = SY-HOST.
IF SY-SUBRC EQ 0.
REFRESH TUSR_LIST.
CALL FUNCTION ‘THUSRINFO’ DESTINATION DESTI-NAME
TABLES USR_TABL = TUSR_LIST
EXCEPTIONS COMMUNICATION_FAILURE = 17.
IF SY-SUBRC = ’17’.
SERVERP-COMMU = ‘P’.
EXIT.
ELSE.
SERVERP-COMMU = ‘ ‘.
ENDIF.

READ TABLE TUSR_LIST WITH KEY BNAME = SY-UNAME.
IF SY-SUBRC EQ 0.
CLEAR SERVERP-S.
SERVERP-S = TUSR_LIST-TERM.
SERVERP-X = TUSR_LIST-HOSTADR.
PERFORM IP_HEX2ASCII_N USING SERVERP-X CHANGING SERVERP-SL.
MOVE SERVERP-SL TO IP.
MOVE-CORRESPONDING TUSR_LIST TO LUSR_LIST.
APPEND LUSR_LIST.
ENDIF.
ENDIF.
ENDFUNCTION.

*Convert Internet address hex(8) to ascii string(31)
FORM IP_HEX2ASCII_N USING DESI CHANGING ERGEBNIS.
DATA: T TYPE X,
TT(3) TYPE C,
HELP TYPE I, HELP1 TYPE I VALUE 0,
DESTI_X(8) TYPE X ,
DESI_HLP TYPE I,
H_TYPE.

* non-unicode
DESCRIBE FIELD DESI LENGTH DESI_HLP.
DESCRIBE FIELD DESI TYPE H_TYPE.

IF DESI_HLP <> 4 AND DESI_HLP <> 8.
WRITE: / ‘Length of processed IP-address is'(026), DESI_HLP, ‘.’.
WRITE: / ‘It should be of length 4 or 8 !'(027).
ELSE.
IF H_TYPE = ‘X’.
DESTI_X = DESI.
DESI_HLP = DESI_HLP – 1.

CLEAR ERGEBNIS.
DO DESI_HLP TIMES.
T = DESTI_X+HELP1(1).
PERFORM HEX2ASCII USING T CHANGING TT.
HELP = STRLEN( ERGEBNIS ).
ERGEBNIS+HELP = TT.
HELP = STRLEN( ERGEBNIS ).
ERGEBNIS+HELP = ‘.’.
HELP1 = HELP1 + 1.
ENDDO.
T = DESTI_X+HELP1(1).
PERFORM HEX2ASCII USING T CHANGING TT.
HELP = STRLEN( ERGEBNIS ).
ERGEBNIS+HELP = TT.
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDFORM.

* Conversion hex to ascii
FORM HEX2ASCII USING T CHANGING V.
DATA: H TYPE I,
E(3) TYPE C.
CLEAR V.
H = T.
E = H.
CONDENSE E.
V = E.
ENDFORM.

avatar

SAP상의 TERMINAL_ID_GET 펑션입니다..
찾기 귀찮으신 분들을 위해서..^^
FUNCTION TERMINAL_ID_GET.
*”———————————————————————-
*”*”Lokale Schnittstelle:
*” IMPORTING
*” VALUE(USERNAME) LIKE SY-UNAME DEFAULT SY-UNAME
*” EXPORTING
*” VALUE(TERMINAL) LIKE USR41-TERMINAL
*” EXCEPTIONS
*” MULTIPLE_TERMINAL_ID
*” NO_TERMINAL_FOUND
*”———————————————————————-
TABLES: USR41.
DATA: TERMINAL_TAB LIKE USR41-TERMINAL OCCURS 1 WITH HEADER LINE,
COUNT TYPE I,
IP_ADDR_X LIKE MSXXLIST-HOSTADR, ” ip as parameter
HELP_IP(16),
HELP_ID(20),
TERM_ID(20),
BEGIN OF IP_HELP_X, ” ip hexadecimal
A TYPE X,
B TYPE X,
C TYPE X,
D TYPE X,
END OF IP_HELP_X,
BEGIN OF IP_HELP_P, ” ip decimal
A(4) TYPE N,
B(4) TYPE N,
C(4) TYPE N,
D(4) TYPE N,
END OF IP_HELP_P,
BEGIN OF IP_ADDRESS, ” ip character
A(4),
B(4),
C(4),
D(4),
END OF IP_ADDRESS,
IP_PATTERN LIKE USR41-TERMINAL.
* read terminals for user from table usr41.
SELECT * FROM USR41
WHERE BNAME EQ USERNAME.
MOVE USR41-TERMINAL TO TERMINAL_TAB.
COLLECT TERMINAL_TAB.
ENDSELECT.
DESCRIBE TABLE TERMINAL_TAB LINES COUNT.
* if more then one terminal, get own ip-address.
IF COUNT GT 1 AND USERNAME = SY-UNAME.
CALL FUNCTION ‘TH_USER_INFO’
IMPORTING
HOSTADDR = IP_ADDR_X
EXCEPTIONS
OTHERS = 1.
* move structure to hex-structure (byte-wise)
MOVE IP_ADDR_X TO IP_HELP_X-A.
MOVE IP_ADDR_X+1 TO IP_HELP_X-B.
MOVE IP_ADDR_X+2 TO IP_HELP_X-C.
MOVE IP_ADDR_X+3 TO IP_HELP_X-D.
* move hex to decimal (byte-wise)
MOVE-CORRESPONDING IP_HELP_X TO IP_HELP_P.
* move decimal to char (without zero)
WRITE IP_HELP_P-A TO IP_ADDRESS-A NO-ZERO.
IF IP_ADDRESS-A IS INITIAL. “P3HK016700
IP_ADDRESS-A = ‘0’. “P3HK016700
ENDIF. “P3HK016700
WRITE IP_HELP_P-B TO IP_ADDRESS-B NO-ZERO.
IF IP_ADDRESS-B IS INITIAL. “P3HK016700
IP_ADDRESS-B = ‘0’. “P3HK016700
ENDIF. “P3HK016700
WRITE IP_HELP_P-C TO IP_ADDRESS-C NO-ZERO.
IF IP_ADDRESS-C IS INITIAL. “P3HK016700
IP_ADDRESS-C = ‘0’. “P3HK016700
ENDIF. “P3HK016700
WRITE IP_HELP_P-D TO IP_ADDRESS-D NO-ZERO.
IF IP_ADDRESS-D IS INITIAL. “P3HK016700
IP_ADDRESS-D = ‘0’. “P3HK016700
ENDIF. “P3HK016700
* add dots, condense and compare with terminal list.
CONCATENATE IP_ADDRESS-A ‘.’
IP_ADDRESS-B ‘.’
IP_ADDRESS-C ‘.’
IP_ADDRESS-D ‘-‘ ‘*’ INTO IP_PATTERN.
CONDENSE IP_PATTERN NO-GAPS.
LOOP AT TERMINAL_TAB.
IF TERMINAL_TAB NP IP_PATTERN.
DELETE TERMINAL_TAB.
ENDIF.
ENDLOOP.
DESCRIBE TABLE TERMINAL_TAB LINES COUNT.
ENDIF.

CASE COUNT.
WHEN 0.
RAISE NO_TERMINAL_FOUND.
WHEN 1.
* if one terminal found, delete domain address from terminal-id (to
* insecure to depend on, sometimes given, sometimes not).
READ TABLE TERMINAL_TAB INDEX 1 INTO TERMINAL.
IF TERMINAL CA ‘-‘.
MOVE TERMINAL(SY-FDPOS) TO HELP_IP.
MOVE TERMINAL+SY-FDPOS TO HELP_ID.
IF HELP_ID CA ‘.’.
MOVE HELP_ID(SY-FDPOS) TO TERM_ID.
CONCATENATE HELP_IP TERM_ID INTO TERMINAL.
ENDIF.
ENDIF.
WHEN OTHERS.
RAISE MULTIPLE_TERMINAL_ID.
ENDCASE.
ENDFUNCTION.

avatar

저도 이것 저것 찾아보고 있는데 어려운 문제네요.
rfc는 rfc 연결할때 기본적으로 하나의 id로 세팅하여 연결되는데,
이 id로 접속한 원격의 user들을 봐야 한다는얘기잖아요…

bc 한테도 물어보고 저도 좀 더 알아보겠습니다.

avatar

좋은정보 감솨^^*

Leave a Reply