System API でユーザーの所有オブジェクトを調べる (V5R4)

あるユーザーの所有オブジェクトを調べたい、という場合があります。

通常は、WRKOBJOWN というコマンドがあるので、それを使って…

↓のような情報が得られます。

目視確認であればこれでいいのですが、定常的にセキュリティや監査などの対応のためにツール化するためには、出力が画面だけでは困ります。(WRKOBJOWN コマンドには画面出力以外の選択肢がありません)

実はこの WRKOBJOWN コマンドで得られる情報は QSYLOBJA という System API を使用することで取得できるんです。

List Objects User Is Authorized to, Owns, or Is Primary Group of (QSYLOBJA) API


  Required Parameter Group:

1 Qualified user space name Input Char(20)
2 Format name Input Char(8)
3 User profile name Input Char(10)
4 Object type Input Char(10)
5 Returned objects Input Char(10)
6 Continuation handle Input Char(20)
7 Error code I/O Char(*)

  Optional Parameter Group:

8 Request list Input Char(*)

  Default Public Authority: *USE

  Threadsafe: Yes

いわゆる”オブジェクト”情報は OBJA0100 というフォーマットで、

OBJA0100 Format

Offset Type Field
Dec Hex
0 0 CHAR(10) Object name
10 0A CHAR(10) Library name
20 14 CHAR(10) Object type
30 1E CHAR(1) Authority holder
31 1F CHAR(1) Ownership
32 20 CHAR(10) ASP device name of library
42 2A CHAR(10) ASP device name of object

IFS オブジェクトは OBJA0110 というフォーマットで、

OBJA0110 Format

Offset Type Field
Dec Hex
0 0 BINARY(4) Offset to path name
4 4 BINARY(4) Length of path name
8 8 CHAR(10) Object type
18 12 CHAR(1) Authority holder
19 13 CHAR(1) Ownership
20 14 CHAR(10) ASP device name of object
    CHAR(*) Path name

それぞれ取得できるようになっています。

コーディング例

今回は力任せの CL プログラムで書いてみてます。

             PGM        PARM(&PUSRPRF)                                          
                                                                                
             DCL        VAR(&PUSRPRF) TYPE(*CHAR) LEN(10)                       
                                                                                
             DCL        VAR(&USRPRF) TYPE(*CHAR) LEN(10)                        
                                                                                
             DCL        VAR(&QTEMP) TYPE(*CHAR) LEN(10) +                       
                          VALUE('QTEMP')                                        
                                                                                
             DCL        VAR(&QUSRSPC) TYPE(*CHAR) LEN(20)                       
                                                                                
             DCL        VAR(&ERRCOD) TYPE(*CHAR) LEN(4)                         
             DCL        VAR(&HCONT) TYPE(*CHAR) LEN(20)                         
                                                                                
                                                                                
             DCL        VAR(&GENHDR) TYPE(*CHAR) LEN(150)                       
             DCL        VAR(&HDRSEC) TYPE(*CHAR) LEN(34)                        
             DCL        VAR(&OBJA0100) TYPE(*CHAR) LEN(52)                      
             DCL        VAR(&OBJA0110) TYPE(*CHAR) LEN(150)                     
                                                                                
             DCL        VAR(&COUNT) TYPE(*DEC) LEN(11) VALUE(0)                 
             DCL        VAR(&COUNT2) TYPE(*DEC) LEN(11) VALUE(0)                
                                                                                
             DCL        VAR(&TOTOBJOWN) TYPE(*DEC) LEN(11) VALUE(0)             
             DCL        VAR(&TOTOBJOWN2) TYPE(*DEC) LEN(11) VALUE(0)            
                                                                                
             DCL        VAR(&NBRLSTE) TYPE(*DEC) LEN(7)                         
             DCL        VAR(&ENTSIZE) TYPE(*DEC) LEN(7)                         
             DCL        VAR(&INFSTS) TYPE(*CHAR) LEN(1)                         
             DCL        VAR(&OFFSHDR) TYPE(*CHAR) LEN(4)                        
             DCL        VAR(&OFFSENT) TYPE(*CHAR) LEN(4)                        
             DCL        VAR(&OFFSPAT) TYPE(*INT) STG(*DEFINED) +                
                          LEN(4) DEFVAR(&OBJA0110 1)                            
             DCL        VAR(&LENPATH) TYPE(*INT) STG(*DEFINED) +                
                          LEN(4) DEFVAR(&OBJA0110 5)                            
             DCL        VAR(&PATH) TYPE(*CHAR) LEN(1000)                        
             DCL        VAR(&IFS) TYPE(*CHAR) LEN(1000)                         
             DCL        VAR(&PATHLEN) TYPE(*INT) STG(*DEFINED) +                
                          LEN(4) DEFVAR(&PATH 17)                               
             DCL        VAR(&OBJNAME) TYPE(*CHAR) LEN(10)                       
             DCL        VAR(&OBJLIB ) TYPE(*CHAR) LEN(10)                       
             DCL        VAR(&OBJTYPE) TYPE(*CHAR) LEN(10)                       
                                                                                
                                                                                
             CHGVAR     VAR(&USRPRF) VALUE(&PUSRPRF)                            
             CHGVAR     VAR(&HCONT) VALUE(' ') /* Continuation +                
                          Handle */                                             
             CHGVAR     VAR(&QUSRSPC) VALUE('LSTOBJOWN ' || &QTEMP)             
                                                                                
             CALL       PGM(QUSCRTUS) PARM(&QUSRSPC 'LSTOBJOWN ' +              
                          X'00004000' X'00' '*ALL      ' 'LSTOBJOWN +           
                          Temporary User Space' '*YES      ' +                  
                          X'0000000000000000')                                  
                                                                                
OBJECTS:                                                                        
             CALL       PGM(QSYLOBJA) PARM(&QUSRSPC 'OBJA0100' +                
                          &USRPRF '*ALL      ' '*OBJOWN   ' &HCONT +            
                          X'0000000000000000')                                  
                                                                                
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC X'00000001' +               
                          X'00000096' &GENHDR)                                  
                                                                                
             CHGVAR     VAR(&NBRLSTE) VALUE(%BIN(&GENHDR 133 4))                
             CHGVAR     VAR(&ENTSIZE) VALUE(%BIN(&GENHDR 137 4))                
             CHGVAR     VAR(&INFSTS) VALUE(%SST(&GENHDR 104 1))                 
             CHGVAR     VAR(&OFFSHDR) VALUE(%SST(&GENHDR 117 4))                
             CHGVAR     VAR(&OFFSENT) VALUE(%SST(&GENHDR 125 4))                
                                                                                
             CHGVAR     VAR(%BIN(&OFFSHDR)) VALUE(%BIN(&OFFSHDR) + 1)           
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC &OFFSHDR +                  
                          X'00000022' &HDRSEC)                                  
                                                                                
             CHGVAR     VAR(&HCONT) VALUE(%SST(&HDRSEC 11 20))                  
                                                                                
             IF         COND(&NBRLSTE *EQ 0) THEN(DO)                           
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No +               
                          objects listed')                                      
             GOTO       CMDLBL(EXIT)                                            
             ENDDO                                                              
                                                                                
             CHGVAR     VAR(&TOTOBJOWN) VALUE(&TOTOBJOWN + &NBRLSTE)            
             CHGVAR     VAR(%BIN(&OFFSENT)) VALUE(%BIN(&OFFSENT) + 1)           
                                                                                
LOOP1:                                                                          
             IF         COND(&COUNT = &TOTOBJOWN) THEN(GOTO +                   
                          CMDLBL(NEXT))                                         
             CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)                           
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC &OFFSENT +                  
                          &ENTSIZE &OBJA0100)                                   
             CHGVAR     VAR(&OBJNAME) VALUE(%SST(&OBJA0100 1 10))               
             CHGVAR     VAR(&OBJLIB ) VALUE(%SST(&OBJA0100 11 10))              
             CHGVAR     VAR(&OBJTYPE) VALUE(%SST(&OBJA0100 21 10))              
             CHGVAR     VAR(%BIN(&OFFSENT)) VALUE(%BIN(&OFFSENT) + +            
                          &ENTSIZE)                                             
             GOTO       CMDLBL(LOOP1)                                           
                                                                                
NEXT:                                                                           
             IF         COND(&INFSTS *EQ 'P') THEN(DO)                          
             GOTO       CMDLBL(OBJECTS)                                         
             ENDDO                                                              
                                                                                
     /* IFS SECTION */                                                          
             CHGVAR     VAR(&HCONT) VALUE(' ')                                  
                                                                                
IFS:                                                                            
                                                                                
             CALL       PGM(QSYLOBJA) PARM(&QUSRSPC 'OBJA0110' +                
                          &USRPRF '*ALL      ' '*OBJOWN   ' &HCONT +            
                          X'0000000000000000')                                  
                                                                                
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC X'00000001' +               
                          X'00000096' &GENHDR)                                  
                                                                                
             CHGVAR     VAR(&NBRLSTE) VALUE(%BIN(&GENHDR 133 4))                
             CHGVAR     VAR(&ENTSIZE) VALUE(%BIN(&GENHDR 137 4))                
             CHGVAR     VAR(&INFSTS) VALUE(%SST(&GENHDR 104 1))                 
             CHGVAR     VAR(&OFFSENT) VALUE(%SST(&GENHDR 125 4))                
                                                                                
             IF         COND(&NBRLSTE *EQ 0) THEN(DO)                           
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('No IFS +           
                          objects listed')                                      
             GOTO       CMDLBL(EXIT)                                            
             ENDDO                                                              
                                                                                
             CHGVAR     VAR(&TOTOBJOWN2) VALUE(&TOTOBJOWN2 + &NBRLSTE)          
             CHGVAR     VAR(%BIN(&OFFSENT)) VALUE(%BIN(&OFFSENT) + 1)           
                                                                                
LOOP2:                                                                          
             IF         COND(&COUNT2 = &TOTOBJOWN2) THEN(GOTO +                 
                          CMDLBL(EXIT))                                         
             CHGVAR     VAR(&COUNT2) VALUE(&COUNT2 + 1)                         
                                                                                
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC &OFFSENT +                  
                          &ENTSIZE &OBJA0110)                                   
                                                                                
             CHGVAR     VAR(&OFFSPAT) VALUE(&OFFSPAT + 1)                       
             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC &OFFSPAT +                  
                          X'000003E8' &PATH)                                    
             CHGVAR     VAR(&IFS) VALUE(%SST(&PATH 33 512))                     
             CHGVAR     VAR(&IFS) VALUE(%SST(&IFS 1 &PATHLEN))                  
                                                                                
             CHGVAR     VAR(%BIN(&OFFSENT)) VALUE(%BIN(&OFFSENT) + +            
                          &ENTSIZE)                                             
             CHGVAR     VAR(%BIN(&OFFSENT)) VALUE(%BIN(&OFFSENT) + +            
                          &LENPATH)                                             
             GOTO       CMDLBL(LOOP2)                                           
                                                                                
             IF         COND(&INFSTS *EQ 'P') THEN(DO)                          
             GOTO       CMDLBL(IFS)                                             
             ENDDO                                                              
                                                                                
EXIT:                                                                           
             RETURN                                                             
             ENDPGM                                                             

おおまかな手順

まず最初に General Header の情報を参照する必要があります。

             CHGVAR     VAR(&NBRLSTE) VALUE(%BIN(&GENHDR 133 4))                
             CHGVAR     VAR(&ENTSIZE) VALUE(%BIN(&GENHDR 137 4))                
             CHGVAR     VAR(&INFSTS) VALUE(%SST(&GENHDR 104 1))                 
             CHGVAR     VAR(&OFFSHDR) VALUE(%SST(&GENHDR 117 4))                
             CHGVAR     VAR(&OFFSENT) VALUE(%SST(&GENHDR 125 4))                
Offset Type Field
Dec Hex
0 0 CHAR(64) User area
64 40 BINARY(4) Size of generic header
68 44 CHAR(4) Structure's release and level
72 48 CHAR(8) Format name
80 50 CHAR(10) API used
90 5A CHAR(13) Date and time created
103 67 CHAR(1) Information status
104 68 BINARY(4) Size of user space used
108 6C BINARY(4) Offset to input parameter section
112 70 BINARY(4) Size of input parameter section
116 74 BINARY(4) Offset to header section
120 78 BINARY(4) Size of header section
124 7C BINARY(4) Offset to list data section
128 80 BINARY(4) Size of list data section
132 84 BINARY(4) Number of list entries
136 88 BINARY(4) Size of each entry
140 8C BINARY(4) CCSID of data in the list entries
144 90 CHAR(2) Country or region ID
146 92 CHAR(3) Language ID
149 95 CHAR(1) Subsetted list indicator
150 96 CHAR(42) Reserved

さらに Header Section を参照し、

             CALL       PGM(QUSRTVUS) PARM(&QUSRSPC &OFFSHDR +                  
                          X'00000022' &HDRSEC)                                  
                                                                                
             CHGVAR     VAR(&HCONT) VALUE(%SST(&HDRSEC 11 20))                  

Header Section

Offset Type Field
Dec Hex
0 0 CHAR(10) User profile name
10 0A CHAR(20) Continuation handle
30 1E BINARY(4) Reason code

場合に応じて、先述の OBJA0100/OBJA0110 の情報を取得するような流れになっています。

実行例

実際の実行例です。

今回のプログラムは(も?)、API を呼び出すところまでのシンプルなもの(ファイルに書いたり、画面に出したり、はしていません)なので、デバッガでちゃんとフィールドに値が入っているかどうかを見てみましょう。

ちゃんと”オブジェクト”の情報が取れています。

オブジェクト・タイプなども取得できます。

IFS オブジェクトの情報も取得可能です。

ちゃんと情報が取れているのがわかりますね。

[Top Pageに戻る]

Ads by TOK2