星期一, 11月 06, 2023

2003-03-25 如何讓系統操作人員將使用者設定為可以進入系統?(Command EBLUSRPRF Enabled User Profile)


如何讓系統操作人員將使用者設定為可以進入系統?(Command EBLUSRPRF Enabled User Profile)

當使用者的 SignOn 錯誤次數超過系統值 QMAXSIGN 的設定值時,若另一系統值
QMAXSGNACN設為 2 或 3 時,此時系統會將使用者狀態設為失效(disabled)。所已有需要讓系統操
作人員能將該失效使用者重新設定為有效,該使用者才可以進入系統。

但在開發此工具時,需要注意不得讓系統操作人員將具有 *ALLOBJ, *SECADM, *SERVICE
高級權限的人員,執行啟用(enabled)使用者的動作。

此程式需以 QSECOFR 使用者產生,並指定繼承程式擁有者的權限,系統操作人員執行此
程式時,才能間接取得 QSECOFR 的權限,更改使用者狀態,同時亦排除更改具有高級權
限的使用者。

這裡也提供 Command EBLUSRPRF 使系統操作人員便於使用。


File  : QCLSRC
Member: EBLUSRPRF 
Type  : CLP
Usage : 此程式需以 QSECOFR 使用者產生
        CRTCLPGM EBLUSRPRF USRPRF(*OWNER)


 /*  Program : EBLUSRPRF                                           */
 /*  Version : 1.00                                                 */
 /*  System :  iSeries                                              */
 /*                                                                 */
 /*  Compile the program with user QSECOFR                          */
 /*  and adopt authority :                                          */
 /*          CHGPGM     PGM(EBLUSRPRF) USRPRF(*OWNER)              */

 RSETUSRPRF: PGM        PARM(&USRPRF &PASSWORD &PWDEXP &STATUS)

             DCL        VAR(&USRPRF)    TYPE(*CHAR) LEN(10)
             DCL        VAR(&PASSWORD)  TYPE(*CHAR) LEN(10)
             DCL        VAR(&PWDEXP)    TYPE(*CHAR) LEN(10)
             DCL        VAR(&STATUS)    TYPE(*CHAR) LEN(10)

             DCL        VAR(&CURUSER)   TYPE(*CHAR) LEN(10)
             DCL        VAR(&GRPPRF)    TYPE(*CHAR) LEN(10)
             DCL        VAR(&SPCAUT)    TYPE(*CHAR) LEN(100)
             DCL        VAR(&ALLOBJ)    TYPE(*LGL)

             /*  Parameters for QCLSCAN                              */
             DCL        VAR(&STRINGLEN)  TYPE(*DEC) LEN(3 0) VALUE(100)
             DCL        VAR(&STRPOS)     TYPE(*DEC)  LEN(3 0) VALUE(1)
             DCL        VAR(&PATTERN)    TYPE(*CHAR) LEN(10)
             DCL        VAR(&PATTERNLEN) TYPE(*DEC) LEN(3 0) VALUE(10)
             DCL        VAR(&TRANSLATE)  TYPE(*CHAR) LEN(1) VALUE('1')
             DCL        VAR(&TRIM)       TYPE(*CHAR) LEN(1) VALUE('1')
             DCL        VAR(&WILD)       TYPE(*CHAR) LEN(1) VALUE(' ')
             DCL        VAR(&RESULT)     TYPE(*DEC)  LEN(3 0)

             /*  Check userprofile existence                        */
             CHKOBJ     OBJ(QSYS/&USRPRF) OBJTYPE(*USRPRF)
             MONMSG     MSGID(CPF0000) EXEC(DO)
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('***** +
                          Error ******  invalid userprofile') +
                          TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
             ENDDO

             /*  new password same as userprofile                   */
             IF         COND(&PASSWORD *EQ *USRPRF) THEN(CHGVAR +
                          VAR(&PASSWORD) VALUE(&USRPRF))

             /*  retrieve current user                              */
             RTVJOBA    USER(&CURUSER)

             /*  Retrieve userprofile attributes                    */
             RTVUSRPRF  USRPRF(&USRPRF) SPCAUT(&SPCAUT) GRPPRF(&GRPPRF)

             /*  Check if the userprofile to be changed has         */
             /*  *ALLOBJ authority.                                 */
             CHGVAR     VAR(&PATTERN) VALUE('*ALLOBJ')
             CALL       PGM(QCLSCAN) PARM(&SPCAUT &STRINGLEN &STRPOS +
                          &PATTERN &PATTERNLEN &TRANSLATE &TRIM +
                          &WILD &RESULT)
             /*  String *ALLOBJ was found                           */
             IF         COND(&RESULT *NE 0) THEN(CHGVAR VAR(&ALLOBJ) +
                          VALUE('1'))

             /*  Do not allow to let userprofile QSECOFR, QSRV or   */
             /*  any userprofile with *ALLOBJ authority or group    */
             /*  profile QSECOFR to be changed.                     */
             /*                                                     */
             IF         COND(&USRPRF = QSECOFR *OR &USRPRF = QSRV +
                          *OR &ALLOBJ *OR &GRPPRF *EQ QSECOFR) THEN(DO)
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('*** +
                          Error ***  not authorised to change this +
                          user profile') TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
             ENDDO

             /* Before resetting the userprofile, let the current   */
             /* user authenticate by typing his own password.       */
             /* This prevents changing a userprofile on a terminal  */
             /* where the normal user went for dinner.              */

            ?CHKPWD
             MONMSG     MSGID(CPF0000) EXEC(RETURN)

             /*  Change  userprofile                                */
             CHGUSRPRF  USRPRF(&USRPRF) PASSWORD(&PASSWORD) +
                          PWDEXP(&PWDEXP) STATUS(&STATUS)
             MONMSG     MSGID(CPF0000) EXEC(DO)
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('*** +
                          Error occurred ***  see joblog') +
                          TOPGMQ(*PRV) MSGTYPE(*ESCAPE)
             ENDDO

             /*  Log the changes into the History log               */
             SNDPGMMSG  MSG('Userprofile ' *CAT &USRPRF *TCAT ' +
                          reset by user ' *CAT &CURUSER) TOMSGQ(QHST)

             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) +
                          MSGDTA('Userprofile ' *CAT &USRPRF *BCAT +
                          'reset') TOPGMQ(*PRV) MSGTYPE(*COMP)

 END:        ENDPGM


File  : QCMDSRC
Member: RSETUSRPRF 
Type  : CMD
Usage : CRTCMD CMD(your-lib/EBLUSRPRF) PGM(your-lib/EBLUSRPRF)


 /*  Command : EBLUSRPRF                                           */
 /*  Version : 1.00                                                 */
 /*  System :  iSeries                                              */
 /*  Description : Enable userprofile and password                   */

 RSETUSRPRF: CMD        PROMPT('Enable userprofile and password')
             PARM       KWD(USRPRF) TYPE(*NAME) LEN(10) MIN(1) +
                          PROMPT('User profile')
             PARM       KWD(PASSWORD) TYPE(*CHAR) LEN(10) +
                          DFT(*USRPRF) SPCVAL((*USRPRF) (*SAME)) +
                          DSPINPUT(*PROMPT) PROMPT('User password')
             PARM       KWD(PWDEXP) TYPE(*CHAR) LEN(10) RSTD(*YES) +
                          DFT(*YES) VALUES(*SAME *NO *YES) +
                          PROMPT('Set password to expired')
             PARM       KWD(STATUS) TYPE(*CHAR) LEN(10) RSTD(*YES) +
                          DFT(*ENABLED) VALUES(*ENABLED *DISABLED +
                          *SAME) PROMPT('Status')

            




沒有留言: