CL

33.仮想ログイン・ユーザー環境を作成するには?

いくつかの API を使用すると任意のユーザー環境から、別のユーザー環境を仮想的に
セットアップすることができる。
例えば CGI は、すべて QTMHHTTP というユーザー・プロフィールの下で動作するが、
ログインしたユーザー・プロフィールとして動作させたい場合などに応用することができる。

【 仮想ログイン 】

API: QSYGETPH によってユーザー,パスワードを指定して、
API: QWTSETP によって仮想ユーザー環境を開始する。

【 仮想ログオフ 】

仮想ログインした環境から元の環境に戻すには、チョッとしたコツが要る。
API : QSYRLSPH = ユーザー・ハンドルの解放 を呼び出しただけではログオフ
されないのである。
これは QSYGETPH で取得したハンドルを解放するだけであって、ログオフを意味して
いるわけではない。

であれば、QTMHHTTP に戻すのであれば QSYGETPH によってハンドルを取得
してから QWTSETPH で戻せば良いのであるが QTMHHTTP にはパスワードが
登録されていない。
もちろん API: QSYGETPH のIBM の解説によれば *NOPWD を指定すれば
ハンドルを取得できることになっているが、どういうわけかパスワードのない *NOPWD では、
ハンドルを取得しようとするとエラーになってしまう。
そこで仮想ログインのときに *CURRENT でのハンドルを取得しておいて、ログオフのときに
保存しておいた *CURRENT のハンドルに戻す作業が必要となってくる。

【 LOGIN: 仮想ログイン 】
             PGM        PARM(&USER &PASSWRD &PRFHND &CURHND)            
/*---------------------------------------------------------*/           
/*   LOGIN       :   仮想ログイン                          */           
/*---------------------------------------------------------*/           
             DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                   
             DCL        VAR(&USER) TYPE(*CHAR) LEN(10)                  
             DCL        VAR(&PASSWRD) TYPE(*CHAR) LEN(48)               
             DCL        VAR(&CURHND) TYPE(*CHAR) LEN(12)                
             DCL        VAR(&PRFHND) TYPE(*CHAR) LEN(12)                
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
                                                                        
  /*( 現在のユーザーでのハンドルを保存 )*/                              
             CALL       PGM(QSYS/QSYGETPH) PARM('*CURRENT  ' +          
                          &PASSWRD &CURHND)                             
  /*( 新しいユーザーでのハンドルを取得してセッションを開始 )*/          
             CALL       PGM(QSYS/QSYGETPH) PARM(&USER &PASSWRD &PRFHND) 
             CALL       PGM(QSYS/QWTSETP) PARM(&PRFHND)                 
             RETURN                                                     
                                                                        
 ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                              
 SNDMSG:     SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)
             ENDPGM
【 LOGOFF: 仮想ログオフ 】
             PGM        PARM(&PRFHND &CURHND)                    
/*---------------------------------------------------------*/    
/*   LOGOFF      :   仮想ログオフ                          */    
/*---------------------------------------------------------*/    
             DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)            
             DCL        VAR(&PRFHND) TYPE(*CHAR) LEN(12)         
             DCL        VAR(&CURHND) TYPE(*CHAR) LEN(12)         
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))  
                                                                 
  /*( 仮想ログイン・ユーザーのハンドルを解放 )*/                 
             CALL       PGM(QSYS/QSYRLSPH) PARM(&PRFHND)         
  /*( 元のユーザーでのハンドルを取得してセッションを再開 )*/     
             CALL       PGM(QSYS/QSYSETH) PARM(&CURHND)          
             RETURN                                              
                                                                 
 ERROR:      RCVMSG     RMV(*NO) MSG(&MSG)                       
 SNDMSG:     SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                 
             ENDPGM