1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM Bob : IBM i ユーザープロフィールのパスワードを満了にセットするCLPを作ってください

1
Last updated at Posted at 2026-09-04

(QA) IBM i ユーザーIDの最小パスワード長を12桁に変更したいで紹介したユーザープロフィールのパスワード有効期間を変更するプログラムをIBM Bob で作成します。
image.png

素のIBM Bobでの手順

まずは素のBobに指示してみます。

CLPを作成するプロンプト

ガチ目に指定(^^; 予期しない修正とか逆に面倒なので自己スキルを活用してガチガチにし指定したほうが確実でしょう。

以下を実行するCLPを作成してください。
1.DSPUSRPRF USRPRF(*ALL) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPUSRPRF1)を実行する
2.QTEMP/DSPUSRPRF1 を読取る
3.読み取ったユーザープロフィール名がGで始まるユーザープロフィールの場合、パスワードを満了にセットする。
4.2と3を繰り返し、QTEMP/DSPUSRPRF1を全件処理する

3.は無くてもいいのですが、テストとはいえ全部パスワード切れになると怖いですし(^^;

生成したCLP

image.png

/*-------------------------------------------------------------------*/
/* プログラム名 : EXPGUSRPW                                          */
/* 概要         : Gで始まるユーザープロフィールのパスワードを満了にする */
/* 処理         :                                                     */
/*   1. DSPUSRPRF *ALL をQTEMP/DSPUSRPRF1へ出力                      */
/*   2. QTEMP/DSPUSRPRF1を全件読み取る                                */
/*   3. ユーザー名がGで始まる場合、パスワードを満了にセットする        */
/*-------------------------------------------------------------------*/
PGM

    /* 変数宣言 */
    DCL        VAR(&USRPRF)   TYPE(*CHAR) LEN(10)  /* ユーザープロフィール名 */
    DCL        VAR(&FIRST)    TYPE(*CHAR) LEN(1)   /* ユーザー名先頭1文字   */
    DCL        VAR(&EOF)      TYPE(*LGL)           /* ファイル終端フラグ    */

    /* ファイルオーバーライド:QTEMP/DSPUSRPRF1 を読取用にオーバーライド */
    OVRDBF     FILE(DSPUSRPRF1) TOFILE(QTEMP/DSPUSRPRF1) +
                 OVRSCOPE(*JOB)

    /* STEP1: DSPUSRPRFをアウトファイルへ出力 */
    DSPUSRPRF  USRPRF(*ALL) OUTPUT(*OUTFILE) +
                 OUTFILE(QTEMP/DSPUSRPRF1) +
                 OUTMBR(*FIRST *REPLACE)

    /* ファイルをオープン */
    OPNQRYF    FILE((DSPUSRPRF1)) OPTION(*INP)

    /* STEP2: ループ開始 - 全件処理 */
    CHGVAR     VAR(&EOF) VALUE('0')

LOOP:
    /* 1レコード読み取り */
    RCVF       RCDFMT(QSYDUPRF)

    /* ファイル終端チェック */
    MONMSG     MSGID(CPF0864) EXEC(DO)
        CHGVAR VAR(&EOF) VALUE('1')
        GOTO   CMDLBL(ENDLOOP)
    ENDDO

    /* STEP3: ユーザー名の先頭1文字を取得 */
    CHGVAR     VAR(&USRPRF) VALUE(&UPUPRF)
    CHGVAR     VAR(&FIRST)  VALUE(%SST(&USRPRF 1 1))

    /* Gで始まるユーザープロフィールの場合、パスワードを満了にセット */
    IF         COND(&FIRST *EQ 'G') THEN(DO)
        CHGUSRPRF  USRPRF(&USRPRF) PWDEXP(*YES)
        SNDPGMMSG  MSG('パスワード満了にセットしました: ' *CAT &USRPRF) +
                     MSGTYPE(*DIAG)
    ENDDO

    /* 次のレコードへ */
    GOTO       CMDLBL(LOOP)

ENDLOOP:
    /* ファイルをクローズ */
    CLOF       OPNID(DSPUSRPRF1)

    /* オーバーライドを削除 */
    DLTOVR     FILE(DSPUSRPRF1) LVL(*JOB)

    RETURN

/*-------------------------------------------------------------------*/
/* エラー処理                                                         */
/*-------------------------------------------------------------------*/
ERROR:
    /* オーバーライドをクリーンアップ */
    DLTOVR     FILE(DSPUSRPRF1) LVL(*JOB)
    MONMSG     MSGID(CPF9841)

    RETURN

ENDPGM

うむ問題無いようです。読取り、や、全件処理する、にやや過剰なコーディングしたようにも見えますが(^^;

IBM i のQCLSRC メンバーを作成してコピペ

Bobの作成したプログラムID(ソースメンバー名)をそのまま使用します。IBM i の人ならウム、とうなずく命名です。(わかりにくいですかね(^^;)
image.png

RDIかVSCODEにすればよかったです、つい惰性で(最近5250だけの環境で作業してたので(^^;)5250開いてしまった・・
15~16行単位でしかコピーできません・・面倒ですがやってしまいます。。
image.png

CLPをコンパイル&ソース修正

エラーなしでコンパイルできるかと思いきや2つエラーが出ました T T
image.png

DSPUSRPRF コマンドの出力結果ファイル QTEMP/DSPUSRPRF1 がDCLFされていない、左記のレコード様式名が間違い、の二点が原因でした。

修正したソースはこちら

/*-------------------------------------------------------------------*/
/* プログラム名 : EXPGUSRPW                                          */
/* 概要         : Gで始まるユーザープロフィールのパスワードを満了にする */
/* 処理         :                                                     */
/*   1. DSPUSRPRF *ALL をQTEMP/DSPUSRPRF1へ出力                      */
/*   2. QTEMP/DSPUSRPRF1を全件読み取る                                */
/*   3. ユーザー名がGで始まる場合、パスワードを満了にセットする        */
/*-------------------------------------------------------------------*/
PGM

    /* 変数宣言 */
    DCL        VAR(&USRPRF)   TYPE(*CHAR) LEN(10)  /* ユーザープロフィール名 */
    DCL        VAR(&FIRST)    TYPE(*CHAR) LEN(1)   /* ユーザー名先頭1文字   */
    DCL        VAR(&EOF)      TYPE(*LGL)           /* ファイル終端フラグ    */
    /* ユーザープロフィールの一覧 */
           DCLF       FILE(QTEMP/DSPUSRPRF1)      
           
    /* ファイルオーバーライド:QTEMP/DSPUSRPRF1 を読取用にオーバーライド */
    OVRDBF     FILE(DSPUSRPRF1) TOFILE(QTEMP/DSPUSRPRF1) +
                 OVRSCOPE(*JOB)

    /* STEP1: DSPUSRPRFをアウトファイルへ出力 */
    DSPUSRPRF  USRPRF(*ALL) OUTPUT(*OUTFILE) +
                 OUTFILE(QTEMP/DSPUSRPRF1) +
                 OUTMBR(*FIRST *REPLACE)

    /* ファイルをオープン */
    OPNQRYF    FILE((DSPUSRPRF1)) OPTION(*INP)

    /* STEP2: ループ開始 - 全件処理 */
    CHGVAR     VAR(&EOF) VALUE('0')

LOOP:
    /* 1レコード読み取り */
    RCVF       RCDFMT(QSYDSUPB)

    /* ファイル終端チェック */
    MONMSG     MSGID(CPF0864) EXEC(DO)
        CHGVAR VAR(&EOF) VALUE('1')
        GOTO   CMDLBL(ENDLOOP)
    ENDDO

    /* STEP3: ユーザー名の先頭1文字を取得 */
    CHGVAR     VAR(&USRPRF) VALUE(&UPUPRF)
    CHGVAR     VAR(&FIRST)  VALUE(%SST(&USRPRF 1 1))

    /* Gで始まるユーザープロフィールの場合、パスワードを満了にセット */
    IF         COND(&FIRST *EQ 'G') THEN(DO)
        CHGUSRPRF  USRPRF(&USRPRF) PWDEXP(*YES)
        SNDPGMMSG  MSG('パスワード満了にセットしました: ' *CAT &USRPRF) +
                     MSGTYPE(*DIAG)
    ENDDO

    /* 次のレコードへ */
    GOTO       CMDLBL(LOOP)

ENDLOOP:
    /* ファイルをクローズ */
    CLOF       OPNID(DSPUSRPRF1)

    /* オーバーライドを削除 */
    DLTOVR     FILE(DSPUSRPRF1) LVL(*JOB)

    RETURN

/*-------------------------------------------------------------------*/
/* エラー処理                                                         */
/*-------------------------------------------------------------------*/
ERROR:
    /* オーバーライドをクリーンアップ */
    DLTOVR     FILE(DSPUSRPRF1) LVL(*JOB)
    MONMSG     MSGID(CPF9841)

    RETURN

ENDPGM

PGMを実行してみる

実行前にGxxx のユーザー情報を確認します
image.png

パスワードは満了になっていません。

PGMを実行します。

CALL EXPGUSRPW

実行結果、パスワードが満了にセットされました。(パスワードはコマンドで満了に設定 が*YES)
image.png

次はPPIだとどうなるかも調べてみたいと思います。

1
0
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?