技術解説とヒント
<<今月の目次>>
●SCAN CL コマンドの作成
●借用権限が伝搬されないようにする
●自由形式での /COPY の使用
●システム日付の代わりにジョブ日付を使用する
●ホスト・サーバーのヒント
●オブジェクト所有権の変更

SCAN CL コマンドの作成
ストリング・パターンのスキャン (QCLSCAN) API は、ストリングが指定のパターンを含んでいるかどうか調べる文字ストリングのスキャンに使用されます。この機能は、SEU でサポートされる、DSPSPLF コマンドの表示に出力されるスキャン機能と類似しています。さらに、QCLSCAN API を使用すると、検索対象ストリング内の任意の文字にマッチングする 1 バイト文字をパターンに指定でき、開始位置を指定して同じストリングを複数回検索することもできます。

QCLSCAN API は CL プログラム内で容易に呼び出すことができますが、必須パラメーターが多いためコードが大きくなります。そこで、作業を簡単にするコマンド・インターフェースを作成しました。また、コマンド・インターフェースは、ヘルプ・テキスト・パネル・グループの形式でオンライン・ドキュメンテーションに対応しているので、コマンドとパラメーターの使用法を容易に調べることができます。

SCAN CL コマンドは、次の 3 つのソースで構成されています。

CBX606 CLP スキャン・ストリング - CPP
CBX606H PNLGRP スキャン・ストリング - ヘルプ
CBX606X CMD スキャン・ストリング

ソースをコンパイルするには、ソース・ヘッダーにある指示のとおりに行うだけです。また、SCAN コマンドの使用法の例をいくつか示す、小さなテスト・プログラムも組み込んであります。

CBX606T CLP スキャン・ストリング - テスト

図 1 に、そのプログラムからの抜粋を示します。

さまざまなパラメーター設定を使用したときの QCLSCAN API の動作については、publib.boulder .ibm.com/infocenter/iseries/v5r4/topic/apiref/apiexscapat.htm にアクセスしてください。QCLSCAN API に関する初期の資料は、「System/38 Environment Programming」マニュアル (publib.boulder.ibm.com/iseries/v5r2/ic2924/books/c4137350.pdf) にあります。また、
『Scan for String Pattern (QCLSCAN) API』(publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/apis/qclscan.htm) も参照してください。


↑このページのトップへ


借用権限が伝搬されないようにする

借用権限は、ジョブの権限を一時的に強化して、ユーザーがアクセスすることを通常は許可されていないオブジェクトまたはデータへのジョブ・アクセスを可能にする、強力な方式です。借用権限は常にプログラム・オブジェクトとプログラム所有権に基づいており、QSYS.LIB ファイル・システム内でのみサポートされています。

一般に、プログラムは、現在そのプログラムを実行しているユーザー・プロファイル以外のソースから権限を借用できます。次の 2 とおりの方法があります。

1.プログラム・オブジェクトは、*USER または *OWNER のどちらかの値に USRPRF 属性を設定できます。*USER に設定すると、現在ジョブを実行しているユーザー・プロファイルのみを対象に、実行時権限が検査されます。*OWNER に設定すると、現在ジョブを実行しているユーザー・プロファイルの権限が指定のアクションに対して不足している場合に、プログラムを所有するユーザー・プロファイルの権限が、不足している権限の検索に使用されます。

2.プログラムの USRPRF 属性が *OWNER に設定されていない場合は、呼び出しスタック内で上位にあるプログラムから借用権限を継承できます。ただしこれは、現行プログラムの借用権限の使用 (USEADPAUT) 属性が *YES に設定されている場合に限られます。この設定を行うには、CHGPGM コマンドを使用する必要があります。プログラムの作成時には、USEADPAUT は最初に *NO に設定されます。システム値 QUSEADPAUT を使用して、プログラムを USEADPAUT(*YES) に変更することの許可を制御するための権限リストを指定できます。

借用権限は、特定の関連するアクティビティーを実行するために適した権限の取得に便利ですが、使用の際には注意してください。例えば、強力なユーザー・プロファイルから権限を借用するプログラムが別のプログラムまたはコマンドを呼び出し、そのプログラムまたはコマンドがユーザーにコマンド行を表示すると、そのユーザーは強力なユーザーの借用権限を使用してコマンドを実行できるようになります。

それにもかかわらず、現行呼び出しレベルの借用属性を次の呼び出しレベルで使用可能にする (権限の伝搬とも呼ばれる) かどうか制御するプログラム属性は存在しません。ただし、ILE MI 組み込みの呼び出し権限変更属性 ('_MODINVAU') は、すべての ILE コンパイラーに備わっており、この組み込み機能はプログラムの現行呼び出しに対して権限伝搬属性を設定できます。プログラム・オブジェクトに永続的な影響はありません。

伝搬される借用属性に MODINVAU 機能がどのような影響を与えるか例示する、小さなテスト・プログラムを作成しました。ソース・ヘッダーにある指示に慎重に従って、CBX605 プログラムをコンパイルして変更してください。このセットアップには、QSECOFR ユーザー・プロファイルへのアクセス権限が必要です。次に、テスト・プログラムを呼び出したときの一連のイベントを示します。

1. MODINVAU 機能は借用権限の伝搬をブロックし、QCMD が呼び出されます。

2.コマンド WRKUSRPRF *ALL を実行すると、コマンドを実行するユーザー・プロファイルが権限を持つユーザー・プロファイルのみが表示されます。F3 を押して続行します。

3.MODINVAU 機能は借用権限の伝搬を復元し、QCMD が呼び出されます。

4.コマンド WRKUSRPRF *ALL を再度実行すると、リストされたユーザー・プロファイルに対してコマンドを実行するユーザー・プロファイルが持つ権限に関係なく、すべてのユーザー・プロファイルが表示されるようになります。F3 を押して、テスト・プログラムを終了します。

このテストが動作するためには、テスト・プログラムを実行するユーザー・プロファイルに LMTCPB(*NO) が指定されている必要があります。借用権限は、このユーザー・プロファイル属性をオーバーライドしません。また、権限を借用している ILE プログラムが存在し、プログラム・スタックに残っているために、他のプログラムに意図せず借用権限を伝搬している場合は、前述のテスト・プログラムで使用されている MODINVAU MI 機能をコピーすれば、この問題を解消できます。_MODINVAU 組み込み機能については、publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/rzatk/MODINVAU.htm に説明があります。



↑このページのトップへ


自由形式での /COPY の使用
自由形式 RPG ブロックで /Copy (または /Include) を使おうとして、コンパイラー・エラー「RNF0257 Form-Type entry not valid or out of sequence (Form-Type 項目が無効か順序が間違っています)」が発生したことがあるかもしれません。

自由形式でコーディングしている場合、このエラー・メッセージはたいてい、コンパイラーが自由形式ブロック内で固定形式の構文を検出したことを示しています。/Copy ステートメントをコードの自由形式ブロック内でコーディングしていても、/Copy メンバーは固定形式構文と見なされます。/Copy メンバーに自由形式構文が含まれている場合は、/Copy メンバー内の自由形式コードのみを /Free と /End-free の区切りで囲む必要があります。

1 次ソース・メンバー内では、次のように、/Copy ディレクティブをコーディングする前に /End-free をコーディングする必要はありません。

/Free
... (自由形式コード)
/Copy library/srcfile, member
... (さらに別の自由形式コード)
/End-free

また、/Copy ディレクティブは必要に応じてインデントでき、列 7 から始めなくても構いません。自由形式構文では、列 6 から 7 をブランクにする必要があるので注意してください。筆者は、自由形式では常に /Copy ディレクティブをインデントするようにしています。(自由形式構文なのに特定の列をブランクにする必要があるのはどうかと思いますが、IBM にはこの皮肉が通じないようです。)

ちなみに、条件付きコンパイル・ディレクティブ (/Define、/Undefine、/If、/Elseif、/Else、/Endif、および /Eof) も自由形式構文で使用できます。また、IBM の説明とは異なりますが、自由形式構文でもこれらのディレクティブはインデントできます。


↑このページのトップへ


システム日付の代わりにジョブ日付を使用する
デフォルトでは、%DATE 組み込み関数は現在のシステム日付を返します。

currDate = %date();

一方、次のように *DATE を指定すると、ジョブ日付を返すことができます。

currDate = %date( *date );

システム日付の代わりにジョブ日付を使用すると、特定の日付にとても簡単にプログラムを再実行できます。CHGJOB コマンドまたは SBMJOB コマンドのジョブ日付パラメーター (DATE) に、必要な日付を指定するだけです。


↑このページのトップへ


ホスト・サーバーのヒント
System i は、一連のホスト・サーバー・プログラムを使用して、TCP/IP 機能と iSeries Access 機能をサポートします。ホスト・サーバーのいずれかが非アクティブになると、そのサーバーによって提供されていたホスト・リソースがクライアント・システムに提供されなくなります。iSeries Access をインストールした場合 (していない場合も)、ホスト・サーバーの状況を検査する最も便利な方法は、cwbping コマンドを実行することです。このコマンドにパラメーターはありません。このコマンドは、System i ホスト・サーバーをすべてリストし、その状況を表示します。


↑このページのトップへ



オブジェクト所有権の変更

オブジェクトの所有権を変更することは簡単で、CHGOBJOWN コマンドを実行すれば済みます。ただ、ライブラリー内にあるものすべての所有権を変更したい場合や、オブジェクトを OLD_OWN の所有から NEW_OWN の所有に変更しながら、OLD_OWN プロファイルは削除したくない場合には、どうすればよいでしょうか。このヒントでは、両方の状況について解決策を示します。

ライブラリー内のオブジェクトをすべて変更するには、ディレクトリー、またはディレクトリー内のオブジェクトの所有権を変更するために使うコマンドを使用します。次のコマンドは、CAROL ライブラリー内のオブジェクトすべての権限を、新しい所有者 CJW に変更します。(CAROL は、ご使用のライブラリーの名前に置き換えてください。)

CHGOWN OBJ('/QSYS.LIB/CAROL.LIB/*.*')
NEWOWN(CJW)


'*.*' シンボルは、すべてのオブジェクトを変更するように指示します。プログラムのみを変更する場合は、次のように指定します。

CHGOWN OBJ('/QSYS.LIB/CAROL.LIB/*.PGM')
NEWOWN(CJW)


あるお客様の現場にいたときに、特定のプロファイルが多数のオブジェクトを所有していることが分かりましたが、新しいセキュリティー体系の実装中だったために、これらのオブジェクトの所有者を別のユーザーにする必要がありました。オリジナルの所有者のプロファイルを削除する予定ならば、DLTUSRPRF コマンドを実行するときに、そのプロファイルが所有しているオブジェクトをすべて別のユーザーに転送するように指定できました。しかし、現行プロファイルは使用中なので削除できませんでした。

オリジナルの所有者を削除せずに所有権の変更を実現するために、なかなか目に付きづらいところにある i5/OS 機能を使用し、意図された使用法とは少し違う方法で利用してみました。警告: この手順のとおり正確に 行う必要があります。そうしなければ、オリジナルのプロファイルが削除される結果になります。

1. i5/OS コマンド行から、WRKUSRPRF *ALL と入力して Enter を押します。これにより、「Work with User Profiles (ユーザー・プロファイルの処理)」画面または「Work with User Enrollment (ユーザー登録の処理)」画面が表示されます。

2.「Work with User Enrollment (ユーザー登録の処理)」画面で作業する必要があります。この画面が表示されていない場合は、F21 (操作援助レベルの選択) を押し、1 (基本) を選択します。

3.現在オブジェクトを所有しているプロファイルを見つけます。4 (そのプロファイルの次を削除) を入力して、Enter を押します。

4.「Remove User (ユーザーの除去)」画面が表示されます。この画面で、オプション 2 (このユーザーが所有する特定オブジェクトの所有者を削除または変更) を選択して、Enter を押します。

5.図 2 のように、「New owner (新規所有者)」フィールドにカーソルが置かれます。ここで、オブジェクトを所有させたいプロファイルの名前を入力し (この例では、プロファイルの名前は NEW)、F2 (すべて変更) を押します。

6.「Confirm Change of Object Owner (オブジェクト所有者の変更の確認)」画面で、Enter を押します。

7.これで、前はオリジナルの所有者が所有していたすべてのオブジェクトを新しい所有者が所有するようになり、目的は達成されました。警告: Enter は押さないでください。F12 (取り消し) または F3 (終了) を押す必要があります。そうしなければ、前の所有者のプロファイルが削除されます。




↑このページのトップへ

TOPPAGE

BELLDATA, Inc. Copyright reserved.