いくつかの 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