mercoledì 18 dicembre 2019

SAP: Auto logoff dopo inattività.

Tra i parametri di sistema si può impostare il tempo limite oltre il quale, gli utenti inattivi, vengono automaticamente disconnessi dal sistema.

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:

  1. legge gli utenti collegati al sistema
  2. verifica da quanto tempo sono inattivi
  3. 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