如何找出允許限制使用者(ALWLMTUSR)執行的指令?(Command PRTLMTCMD by API QCDRCMDI)
於 USRPRF 指定使用者參數 LMTCPB(*YES)時,該使用者無法於命令列執行指令,除非所要執行指令的參數 ALWLMTUSR 值設定為 *YES,
否則無法執行該指令。
系統預設 ALWLMTUSR(*YES) 的指令有下列:
DSPJOB
DSPJOBLOG
DSPMSG
SIGNOFF
SNDMSG
STRPCO
WRKENVVAR
WRKMSG
所以 USRPRF 中參數 LMTCPB(*YES)的使用者可以執行上述指令,若有其他指令也要讓使用者參數 LMTCPB(*YES) 的使用者執行,就要
執行 CHGCMD CMD(your-command) ALWLMTUSR(*YES)。
利用 DSPCMD 可以顯示指令參數 ALWLMTUSR 值來判斷該指令是否允許LMTCPB(*YES)的使用者執行。但是系統指令繁多,無法一依查詢,
所以可以透過 API QUSLOBJ, QCDRCMDI 來列印指令參數 ALWLMTUSR(*YES) 的指令。
File : QRPGLESRC
Member : PRTLMTCMD
Type : RPGLE
Usage : CRTBNDRPG PGM(PRTLMTCMD) TGTRLS(V5R1M0)
**
** Program . . : PrtLmtCmd
** Description : Print Allow Limit User Command
** Author . . : Vengoal Chang
**
** Input parameters
** Description Type Size How Used
** ----------- ---- ---- --------
** InLibary Char 10 Library to search for objects
**
**
** Compile options:
**
** CrtBndRpg Pgm( PrtLmtCmd )
** DbgView( *LIST ) TgtRls(V5R1M0)
**
**
**-- Header Specifications: --------------------------------------------**
H DEBUG OPTION(*SRCSTMT:*NODEBUGIO) DFTACTGRP(*NO) ACTGRP(*NEW)
FQSYSPRT O F 132 Printer
*
* Program Info
*
d SDS
d @PGM 1 10
d @PARMS 37 39 0
d @JOB 244 253
d @USER 254 263
d @JOB# 264 269 0
*
* Field Definitions.
*
d AllText s 10 Inz('*ALL')
d CmdString s 256
d CmdLength s 15 5
d Count s 4 0
d Format s 8
d GenLen s 8
d InLibrary s 10
d InType s 10 inz('*CMD')
d ObjectLib s 20
d SpaceVal s 1 inz(*BLANKS)
d SpaceAuth s 10 inz('*CHANGE')
d SpaceText s 50 inz(*BLANKS)
d SpaceRepl s 10 inz('*YES')
d SpaceAttr s 10 inz(*BLANKS)
d UserSpaceOut s 20
? * ?
? * Data structures ?
? * ?
d GENDS ds
d OffsetHdr 1 4i 0
d NbrInList 9 12i 0
d SizeEntry 13 16i 0
*
* Create userspace datastructure
*
d DS
d StartPosit 10i 0
d StartLen 10i 0
d SpaceLen 10i 0
*
* Date structure for retriving userspace info
*
d InputDs DS
d UserSpace 1 20
d SpaceName 1 10
d SpaceLib 11 20
d InpFileLib 29 48
d InpFFilNam 29 38
d InpFFilLib 39 48
d InpRcdFmt 49 58
*
d ObjectDs ds
d Object 10
d Library 10
d ObjectType 10
d InfoStatus 1
d ExtObjAttrib 10
d Description 50
**-- API Error Data Structure:
D ERRC0100 Ds Qualified Inz
D BytPrv 10i 0 Inz( %Size( ERRC0100 ))
D BytAvl 10i 0
D MsgId 7a
D 1a
D MsgDta 1024a
**-- Global constants:
D OFS_MSGDTA c 16
**-- Command information:
D CMDI0100 Ds 10240 Qualified Inz
D BytRtn 10i 0
D BytAvl 10i 0
D CmdNam_q 20a
D CmdNam 10a Overlay( CmdNam_q: 1 )
D CmdLib 10a Overlay( CmdNam_q: 11 )
D CmdPgm_q 20a
D PgmNam 10a Overlay( CmdPgm_q: 1 )
D PgmLib 10a Overlay( CmdPgm_q: 11 )
D SrcFil 10a
D SrcLib 10a
D SrcMbr 10a
D VcpNam 10a
D VcpLib 10a
D ModeInf 10a
D AlwInf 15a
D AlwLmtUsr 1a
D MaxPos 10i 0
D PmtMsfNam 10a
D PmtMsfLib 10a
D MsgFilNam 10a
D MsgFilLib 10a
D HlpPngNam 10a
D HlpPngLib 10a
D HlpId 10a
D SchIdxNam 10a
D SchIdxLib 10a
D CurLib 10a
D PrdLib 10a
D PopNam 10a
D PopLib 10a
D RstTgtRls 6a
D TxtDsc 50a
D CppCalStt 2a
D VcpCalStt 2a
D PopCalStt 2a
D OfsHlpBks 10i 0
D LenHlpBks 10i 0
D CcsId 10i 0
D EnbGui 1a
D ThdSafInd 1a
D MltJobAcn 1a
D PxyCmdInd 1a
D 14a
**-- Retrieve command information:
D RtvCmdInf Pr ExtPgm( 'QCDRCMDI' )
D RcvVar 65535a Options( *VarSize )
D RcvVarLen 10i 0 Const
D FmtNam 10a Const
D CmdNam_q 20a Const
D Error 32767a Options( *VarSize )
**-- Send program message:
D SndPgmMsg Pr ExtPgm( 'QMHSNDPM' )
D MsgId 7a Const
D MsgFil_q 20a Const
D MsgDta 128a Const
D MsgDtaLen 10i 0 Const
D MsgTyp 10a Const
D CalStkE 10a Const Options( *VarSize )
D CalStkCtr 10i 0 Const
D MsgKey 4a
D Error 32767a Options( *VarSize )
**-- Send completion message:
D SndCmpMsg Pr 10i 0
D PxMsgId 7a Const
D PxMsgFil 10a Const
D PxMsgDta 512a Const Varying
**-- Parameter definitions:
D ObjNam_q Ds Qualified
D ObjNam 10a
D ObjLib 10a
D ERRMSGID S 7a
D firstRcd S N INZ('1')
D matchRcd S N
? * ?
* Create a userspace
*
c exsr $QUSCRTUS
*
c eval ObjectLib = AllText + InLibrary
*
* List all the objects to the user space
*
c eval Format = 'OBJL0200'
*
c call(e) 'QUSLOBJ'
c parm Userspace UserSpaceOut
c parm Format
c parm ObjectLib
c parm '*CMD' InType
*
* Retrive header entry and process the user space
*
c eval StartPosit = 125
c eval StartLen = 16
*
* Retrive header entry and process the user space
*
c call 'QUSRTVUS'
c parm UserSpace UserSpaceOut
c parm StartPosit
c parm StartLen
c parm GENDS
*
c eval StartPosit = OffsetHdr + 1
c eval StartLen = %size(ObjectDS)
*
*
? * Do for number of fields ?
*
c if NbrInList > 0
B1 c Do NbrInList
*
c call(e) 'QUSRTVUS'
c parm UserSpace UserSpaceOut
c parm StartPosit
c parm StartLen
c parm ObjectDs
*
c eval ObjNam_q.ObjLib = Library
c eval ObjNam_q.ObjNam = Object
c
c callp RtvCmdInf( CMDI0100
c : %Size( CMDI0100 )
c : 'CMDI0100'
c : ObjNam_q
c : ERRC0100
c )
c If ERRC0100.BytAvl > *Zero
c
c If ERRC0100.BytAvl < OFS_MSGDTA
c eval ERRC0100.BytAvl = OFS_MSGDTA
c EndIf
c eval ErrMsgId = ERRC0100.MsgId
c If ErrMsgId <> 'CPF6250'
c except error
c EndIf
c Else
c If (CMDI0100.AlwLmtUsr = '1')
c If firstRcd
c except head
c eval firstRcd = *Off
c eval matchRcd = *On
c EndIf
c except detail
c EndIf
c EndIf
c eval StartPosit = StartPosit + SizeEntry
c EndDo
c EndIf
c If matchRcd
c callp SndCmpMsg( 'CPF9898'
c :'QCPFMSG'
c :'Print allow limit user command' +
c ' on library ' + %trim(InLibrary)+
c ' completed'
c )
c Else
c callp SndCmpMsg( 'CPF9898'
c :'QCPFMSG'
c :'Library ' + %trim(InLibrary) +
c ' no any allow limit user command'
c )
c EndIf
*
c eval *Inlr = *On
*===============================================
* $QUSCRTUS - API to create user space
*===============================================
c $QUSCRTUS begsr
*
* Create a user space named ListObjects in QTEMP.
*
c movel(p) 'LISTOBJECTS' SpaceName
c movel(p) 'QTEMP' SpaceLib
*
* Create the user space
*
c call(e) 'QUSCRTUS'
c parm UserSpace UserSpaceOut
c parm SpaceAttr
c parm 4096 SpaceLen
c parm SpaceVal
c parm SpaceAuth
c parm SpaceText
c parm SpaceRepl
c parm ERRC0100
*
c endsr
*=================================================
* *Inzsr - One time run House keeping subroutine
*=================================================
c *Inzsr begsr
*
c *entry plist
c parm InLibrary
*
c endsr
*==============================================
OQSYSPRT E HEAD 1
O 28 'Allow Limit User Command'
O E HEAD 1
O 12 'Library'
O 24 'Command'
O E detail 1
O Library B 15
O Object B 27
O E error 1
O Library B 15
O Object B 27
O ERRMSGID B 37
**-- Send completion message:
P SndCmpMsg B
D Pi 10i 0
D PxMsgId 7a Const
D PxMsgFil 10a Const
D PxMsgDta 512a Const Varying
**
D MsgKey s 4a
/Free
SndPgmMsg( PxMsgId
: PxMsgFil + '*LIBL'
: PxMsgDta
: %Len( PxMsgDta )
: '*COMP'
: '*PGMBDY'
: 1
: MsgKey
: ERRC0100
);
If ERRC0100.BytAvl > *Zero;
Return -1;
Else;
Return 0;
EndIf;
/End-Free
P SndCmpMsg E
File : QCMDSRC
Member : PRTLMTCMD
Type : CMD
Usage : CRTCMD CMD(PRTLMTCMD) PGM(PRTLMTCMD)
/* =============================================================== */
/* = Command....... PrtLmtCmd = */
/* = CPP........... PrtLmtCmd = */
/* = Description... Print allow limit user command = */
/* = = */
/* = CrtCmd Cmd( PrtLmtCmd ) = */
/* = Pgm( PrtLmtCmd ) = */
/* = SrcFile( YourSourceFile ) = */
/* = = */
/* =============================================================== */
/* = Date : 2008/07/18 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
Cmd Prompt( 'Print Allow Limit User Command' )
PARM KWD(LIB) TYPE(*CHAR) LEN(10) MIN(1) +
EXPR(*YES) PROMPT('Library')
執行範例:
PRTLMTCMD LIB(QSYS) ==> 若有 ALWLMTUSR(*YES)指令,報表 QSYSPRT 狀態為 RDY
PRTLMTCMD LIB(QGPL) ==> 若無 ALWLMTUSR(*YES)指令,報表 QSYSPRT 狀態為 FIN
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期三, 11月 08, 2023
2008-07-18 如何找出允許限制使用者(ALWLMTUSR)執行的指令?(Command PRTLMTCMD by API QCDRCMDI)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言