Il parametro è questo: rdisp/gui_auto_logout
qui le indicazioni.
Questo però vale per tutti gli utenti del sistema, mentre non è possibile impostare dei tempi di inattività differenti per i vari utenti.
Di seguito come impostare un tempo personalizzato a livello di utente.
Ho pensato di definire un nuovo parametro utente dove inserire il numero di minuti massimo di inattività:
SM30 sulla tabella TPARA
salvare, inserire in una CR e portare in produzione.
Aggiornare gli utenti a cui si vuole impostare un tempo limite di inattività: SU01 - parametri.
I valori dei parametri utente sono salvati nella tabella USR05:
Ho costruito un report che:
- legge gli utenti collegati al sistema
- verifica da quanto tempo sono inattivi
- eventualmente disconnette l'utente se supera il tempo di inattività previsto
pagina iniziale:
ho previsto anche di inserire un tempo massimo che vale per tutti gli utenti (si può modificare in maniera più semplice che non un parametro di sistema che richiede il riavvio dell'istanza SAP).
Si schedula il report in modo ricorrente, io ho impostato ogni 5 minuti, tramite SM36 con una variante BKG in modo da poterla modificare al bisogno.
codice:
*--------------------------------------------------------------------+
* Programma : Z_LOGOUT_USER |
* Autore : Fabio Giacobbe - 16/12/2019 |
* Descrizione: Disconnessione utenti dopo periodo inattività |
* Modifiche : |
*--------------------------------------------------------------------+
REPORT z_logout_user2 LINE-SIZE 133.
*--------------------------------------------------------------------*
* Tabelle del DB utilizzate all'interno del programma.
*--------------------------------------------------------------------*
TABLES: usr02.
* dichiarazione variabili interne.
DATA: local_user_list LIKE uinfo OCCURS 0 WITH HEADER LINE.
DATA: w_usrinfo LIKE usrinfo OCCURS 0 WITH HEADER LINE.
DATA: current_timestamp LIKE ccupeaka-timestamp,
user_timestamp LIKE ccupeaka-timestamp,
elapsed_time TYPE i,
modeid TYPE syindex,
w_secondi TYPE i,
w_data LIKE sy-datum,
w_all_min TYPE i,
w_min TYPE i,
wa_parva LIKE usr05-parva,
w_ipstr(20).
*----------------------------------------------------------------------*
* Parametri di selezione
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blocco1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_bname FOR usr02-bname. "Utente
PARAMETERS: i_minall(4) TYPE n.
SELECTION-SCREEN END OF BLOCK blocco1.
*----------------------------------------------------------------------*
* Inizio programma
*----------------------------------------------------------------------*
START-OF-SELECTION.
* Attenzione, riceve la lista utenti collegati solo al server dove
* gira il programma, se esistono + application server si deve usare
* la funzione 'TH_SERVER_LIST'.
CALL FUNCTION 'TH_USER_LIST'
* EXPORTING
* APSERVER = ' '
TABLES
list = local_user_list
* USRLIST = w_USRINFO
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
STOP.
ENDIF.
* Imposta ora attuale
PERFORM set_current_timestamp.
* trovo tempo limite per tutti gli utenti
IF i_minall > 0.
w_all_min = i_minall.
ENDIF.
* solo sessioni di dialogo
LOOP AT local_user_list WHERE type = 4.
* Verifico se l'utente è contenuto nella lista.
IF local_user_list-bname IN s_bname.
CLEAR elapsed_time.
CLEAR user_timestamp.
* verifico se l'utente ha un tempo di logout nel parametro Z001
SELECT SINGLE parva FROM usr05 INTO wa_parva
WHERE bname = local_user_list-bname
AND parid = 'Z001'.
IF sy-subrc = 0.
w_min = wa_parva.
ELSE.
IF w_all_min > 0.
w_min = w_all_min.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
w_secondi = w_min * 60.
* Se l'ora utente è maggiore dell'ora SYS significa che è di ieri.
IF local_user_list-zeit > sy-uzeit.
w_data = sy-datum - 1.
user_timestamp(8) = w_data.
ELSE.
user_timestamp(8) = sy-datum.
ENDIF.
user_timestamp+8(6) = local_user_list-zeit.
* Trova differenza in secondi tra l'ora di sistema e l'ora
* dell'ultimo aggiornamento eseguito dall'utente.
CALL FUNCTION 'CCU_TIMESTAMP_DIFFERENCE'
EXPORTING
timestamp1 = current_timestamp
timestamp2 = user_timestamp
IMPORTING
difference = elapsed_time
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
IF elapsed_time > w_secondi.
* Nel caso il tempo inattività sia superiore a quanto previsto forza
* la disconnessione dell'utente.
CALL FUNCTION 'TH_DELETE_USER'
EXPORTING
user = local_user_list-bname
client = sy-mandt
tid = local_user_list-tid
EXCEPTIONS
authority_error = 1
OTHERS = 2.
* Trovo indirizzo IP convertendo stringa HOSTADR.
CALL FUNCTION 'GWY_IPADR2STRING'
EXPORTING
ipadr = local_user_list-hostadr
IMPORTING
string = w_ipstr.
WRITE: / 'Disconnessione utente:',
local_user_list-bname,
local_user_list-tid,
w_ipstr,
local_user_list-term,
local_user_list-tcode,
elapsed_time.
ENDIF.
ENDIF.
ENDLOOP.
*---------------------------------------------------------------------*
* FORM SET_CURRENT_TIMESTAMP *
*---------------------------------------------------------------------*
FORM set_current_timestamp.
GET TIME.
current_timestamp(8) = sy-datum.
current_timestamp+8(6) = sy-uzeit.
ENDFORM. " set_current_timestamp
Nessun commento:
Posta un commento