众所周知, System i 用户简要表( User Profile ,以下简称为用户)有八大特殊权限( Special Authority ),特殊权限用于规定用户能对系统资源执行何种类型的操作。
上图红色方框内的内容是用户可以拥有的特殊权限和其所允许的操作,具体描述如下:
特殊权限 | 描述 | |
1 | *ALLOBJ | 允许用户访问系统中的任何资源,无论该用户是否有私有权限。 |
2 | *SECADM | 允许用户创建、改变和删除用户配置文件。 |
3 | *JOBCTL | 允许用户改变作业和打印的优先级,在作业完成前结束作业,或在打印前删除输出。如果输出队列被指定为OPRCTL(YES),JOBCTL特殊权限还可以让用户访问保密的假脱机文件。 |
4 | *SPLCTL | 允许用户执行所有假脱机文件的控制功能,如修改、删除、显示、保留和释放假脱机文件。 |
5 | *SAVSYS | 允许用户保存、恢复和释放系统上所有对象的存储空间,无论该用户是否有此对象存在的权限。 |
6 | *SERVICE | 允许用户使用STRSST命令启动系统服务工具;允许对程序在只有*USE权限的用户调试程序,并执行显示和改变服务功能;允许用户执行跟踪功能。 |
7 | *AUDIT | 允许用户查看和修改审计特性。 |
8 | *IOSYSCFG | 允许用户修改系统的配置,用户可以添加或删除通信配置信息,与TCP/IP服务一起工作,配置互联网连接服务器(ICS)。大多数配置通信相关的命令都需要具有*IOSYSCFG的特殊权限。 |
表 1. 八种用户特殊权限
用户可以拥有一个或多个特殊权限,也可以同时拥有所有这八个权限,例如最高权限用户 QSECOFR 就拥有这八种权限。
可以用 DSPUSRPRF 命令查看某个用户具有哪些特殊权限,例如 DSPUSRPRF QSECOFR
如上所述,大家可以很容易地通过命令查看用户所具有的特殊权限,那么 CLP 程序是否能够判断用户是否具有某种或某些特殊权限呢?回答是肯定的, System i 提供了 API 函数来查看用户是否具有某种特殊权限,这个 API 函数就是 Check User Special Authorities (QSYCUSRS) API 。
QSYCUSRS API 函数有六个参数,分别是:
1 | Authority indicator | Output | Char(1) | 用户是否具有所查询的特殊权限 |
2 | User profile name | Input | Char(10) | 用户名,可以是当前运行的用户名,也指定某个用户名 |
3 | Special authority | Input | Char(*) | 需要检查的特殊权限,如表1所示。可以填多个,最多8个长度为10的字符 |
4 | Number of authorities | Input | Binary(4) | 特殊权限的个数,可以是1到8之间的数字 |
5 | Call level | Input | Binary(4) | 在程序堆栈中进行权限检查所需后退的调用级别的数量 |
6 | Error code | I/O | Char(*) | 返回错误码 |
更详细的解释可参考 IBM 官方网站 https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/QSYCUSRS.html
/*********************************************************************************************/
/* CHECK USER'S SPECIAL AUTHORITY WITH API QSYCUSRS */
/* */
/* EDITED BY XIAOQING */
/* 202301 */
/*********************************************************************************************/
PGM
DCL VAR(&USER) TYPE(*CHAR) LEN(10)
DCL VAR(&AUTIND) TYPE(*CHAR) LEN(1)
DCL VAR(&AUTNUM) TYPE(*CHAR) LEN(4) +
VALUE(X'00000001')
DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&ERRCOD) TYPE(*CHAR) LEN(4) +
VALUE(X'00000000')
DCL VAR(&CALLVL) TYPE(*CHAR) LEN(4) VALUE(X'00000000')
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
RTVJOBA USER(&USER)
CALL PGM(QSYS/QSYCUSRS) PARM(&AUTIND &USER +
'*ALLOBJ ' &AUTNUM &CALLVL &ERRCOD)
IF COND(&AUTIND *EQ 'N') THEN(DO)
CHGVAR VAR(&MSG) VALUE('USER ' *CAT &USER *TCAT ' +
DID NOT HAVE *ALLOBJ AUT.')
GOTO CMDLBL(SNDMSG)
ENDDO
ELSE DO
CHGVAR VAR(&MSG) VALUE('USER ' *CAT &USER *TCAT ' +
DID HAVE *ALLOBJ AUT.')
GOTO CMDLBL(SNDMSG)
ENDDO
RETURN
ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
ENDPGM
编译这个 CLP 程序,然后查看执行结果。
以 QSECOFR 用户登录系统,大家知道 QSECOFR 拥有八大类特殊权限,其中包括 *ALLOBJ ,然后执行这个程序
CALL XQLIB/CHKAUT
这个程序会在屏幕下方(红色方框内)显示执行结果“ USER QSECOFR DID HAVE ALLOBJ AUT. ”即用户 QSECOFR 拥有 ALLOBJ 特殊权限。
然后用 TEST1 用户登录系统,如下图所示, TEST1 用户不具有 *ALLOBJ 特殊权限。
然后执行 XQLIB/CHKAUT 程序
检查执行结果,如下图所示,“ USER QSECOFR DID NOT HAVE ALLOBJ AUT. ”即用户 QSECOFR 没有ALLOBJ 特殊权限。
仅供参考
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞3
添加新评论2 条评论
2023-08-03 16:35
2023-04-29 19:53