![]() | |
Sun™ Identity Manager 8.0 リソースリファレンス |
第 3 章
リソースへのアクションの追加この章では、リソースアダプタのアクションを作成および実装する方法について説明します。アダプタでのこれらのアクションのサポートを確認するには、各アダプタのマニュアルを参照してください。
アクションとはアクションとは、スクリプトアクションのネイティブサポートが存在する場合に、管理するリソースのコンテキスト内で実行するスクリプトです。たとえば、UNIX オペレーティングシステムによるシステムでは、アクションは一連の UNIX シェルコマンドです。Microsoft Windows 環境では、アクションは CMD コンソール内で実行可能な DOS 形式のコンソールコマンドになります。アクションは Identity Manager リポジトリ内にオブジェクトとして存在します。メインフレーム環境では、アクションは、メインフレームとの間でキーストロークやコマンドを送受信できる Javascript スクリプトです。Oracle ERP では、アクションは、JDBC 接続を使用して Oracle データベースの追加カスタムフィールドを管理する Javascript または Beanshell スクリプトです。このアダプタの詳細については、「Oracle ERP」を参照してください。
アクションは、リソースアカウントオブジェクトに対して直接実行される作業ではなく、そのリソースアカウントの作成、更新、または削除の前またはあとに実行される作業を行う場合に使用します。リソースアクションでは、ユーザーを作成したあとの、新規ユーザーのディレクトリへのファイルのコピーや、そのユーザーに関する UNIX の SUDOers ファイルの更新などのネイティブアクティビティーがサポートされます。このタイプの作業は、カスタムリソースアダプタを使用することにより実行できます。ただし、カスタムリソースアダプタを配備するよりも、アクションを追加したリソースアダプタを配備するほうが簡単です。
アクションには次の 3 種類の結果メッセージが関連付けられます。
サポートされるプロセス次のプロセスで、前アクションと後アクションがサポートされます。
アクションの定義アクションは、次の構造を持っています。
<ResourceAction name="Name">
<ResTypeAction restype="ResourceType" actionType="Language" timeout="Milliseconds">
<act>
...
</act>
</ResTypeAction>
</ResourceAction>各表記の意味は次のとおりです。
<act> 要素によって、アクションが定義されます。この要素には、リソース上で実行されるコードが含まれます。たとえば、次の XML は Solaris リソースのアクションを定義しています。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Waveset PUBLIC 'waveset.dtd' 'waveset.dtd'>
<Waveset>
<ResourceAction name='after-create'>
<ResTypeAction restype='Solaris' timeout='60000'>
<act>
#!/bin/ksh
echo "$WSUSER_accountId says Hello World!"
# exit $DISPLAY_INFO_CODE if there is not a failure, but you want
# the output to be propagated to the UI
#exit 0
exit $DISPLAY_INFO_CODE
</act>
</ResTypeAction>
</ResourceAction>
</Waveset>
環境変数の使用
環境変数はエクスポートされ、アクションで利用できるようになります。これらの環境変数は、ユーザーに関する値 (リソーススキーママップの「アイデンティティーシステム リソース属性」列で定義される) を持つ、スキーマにマップされたすべての属性を、先頭に WSUSER_ を付加して構成します。たとえば、前述の例では、Solaris リソーススキーママップで定義された AccountId 属性の先頭に WSUSER_ を付加して構成された環境変数 WSUSER_AccountIdが使用されています。これらの変数は、それぞれのシェル内で環境変数として認識されるようにするため、Solaris では、変数名の前に $ (ドル記号) が付加されます。
後アクションの実装
Identity Manager は更新の際に、変更された属性だけをリソースにプッシュします。アクションが、変更されていない属性にアクセスすることはできません。変更されていない可能性のある属性が必要な後アクションを記述する場合は、次の回避方法を検討してください。
- リソースのスキーママップに、アクセスする必要のあるアカウント属性を模倣する余分な属性を追加します。たとえば、fullname アカウント属性にアクセスする必要がある場合は、shadow_fullname という名前の属性を作成できます。この新しい属性がアダプタによって使用されないようにするために、スキーママップの「リソースユーザー属性」列に、この属性の値 IGNORE_ATTR を追加します。
- この属性に入力されるように、値をユーザーフォームに設定します。
<Field name='accounts[ResourceName].shadow_fullname'>
<Expansion>
<ref>accounts[ResourceName].fullname</ref>
</Expansion>
</Field>- アクション内で %WSUSER_shadow_fullname% を参照して、値を取得できるようにします。
Identity Manager は、IGNORE_ATTR に設定されている属性を取得しません。その結果、Identity Manager は shadow_fullname などの属性の内容を新しい値と見なします。この属性は常にアダプタにプッシュされ、後アクションに使用できます。
アクションファイルの作成
アクションファイルを作成するときは、次に示す事項に留意してください。
Identity Manager へのアクションファイルの読み込み
アクションを Identity Manager にインポートするには、次の手順に従います。
アクションの実装アクションの定義が完了したら、次の手順に従ってそのアクションを実装します。
手順 1: Identity Manager ユーザーフォームフィールドを定義する
ユーザー操作の前またはあとに実行するアクションを割り当てるユーザーフォームフィールドを作成します。
次の例では、ユーザー作成操作のあとに実行する after-create というアクションを定義しています。
<Field name='global.create after action'>
<Expansion>
<s>after-create</s>
</Expansion>
</Field>フィールド名の形式は次のとおりです。
{create|update|delete} {before|after} action
Identity Manager のフォームの操作の詳細については、『Identity Manager ワークフロー、フォーム、およびビュー』を参照してください。
手順 2: スキーママップエントリを追加する
アクションを実行するリソースのスキーママップにエントリを追加します。次の手順で実行します。
Active Directory の例ここでは、リソースアダプタで次の操作が実行されたあとに Active Directory リソースで実行できるアクションの例を示します。
例 1: ユーザーの作成後のアクション
この手順では、Active Directory リソースで新規ユーザーの作成後に実行するアクションを含める方法を示します。
- リソースのスキーママップの「Identity Manager ユーザー属性」列に、「create after action」と入力します。
- 「属性タイプ」列で、「string」を選択します。
- 「リソース ユーザー属性」列に、「IGNORE_ATTR」と入力します。「必須」、「監査」、「読み取り専用」、および「書き込み専用」の各列は、チェックマークを外したままにします。
- ユーザーの作成または編集に使用するユーザーフォームに次のコードを追加します。
<Field name='resourceAccounts.currentResourceAccounts[AD].attributes.
create after action'>
<Expansion>
<s>AfterDelete</s>
</Expansion>
</Field>- 次の XML ファイルを作成し、Identity Manager にインポートします。ファイルのパスは、環境に合わせて変更してください。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Waveset PUBLIC 'waveset.dtd' 'waveset.dtd'>
<Waveset>
<ResourceAction name='AfterCreate'>
<ResTypeAction restype='Windows Active Directory' timeout='6000'>
<act>
echo create >> C:¥Temp¥%WSUSER_accountId%.txt
exit
</act>
</ResTypeAction>
</ResourceAction>
</Waveset>例 2: ユーザーアカウントの更新または編集後のアクション
この手順では、Active Directory リソースでユーザーの更新または編集後に実行するアクションを含める方法を示します。
- Active Directory スキーママップの「Identity Manager ユーザー属性」列に、「update after action」と入力します。
- 「属性タイプ」列で、「string」を選択します。
- 「リソース ユーザー属性」列に、「IGNORE_ATTR」と入力します。「必須」、「監査」、「読み取り専用」、および「書き込み専用」の各列は、チェックマークを外したままにします。
- ユーザーの作成および編集に使用するユーザーフォームに次のフィールドを追加します。
<Field name='resourceAccounts.currentResourceAccounts[AD].
attributes.update after action'>
<Expansion>
<s>AfterUpdate</s>
</Expansion>
</Field>- 次の XML ファイルを作成し、Identity Manager にインポートします。ファイルのパスは、環境に合わせて変更してください。
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Waveset PUBLIC 'waveset.dtd' 'waveset.dtd'>
<Waveset>
<ResourceAction name='AfterUpdate'>
<ResTypeAction restype='Windows Active Directory' timeout='6000'>
<act>
echo update >> C:¥Temp¥%WSUSER_accountId%.txt
exit
</act>
</ResTypeAction>
</ResourceAction>
</Waveset>例 3: ユーザーの削除後のアクション
この手順では、Active Directory リソースでユーザーの削除後に実行するアクションを含める方法を示します。
- リソースのスキーママップの「Identity Manager ユーザー属性」列に、「delete after action」と入力します。
- 「属性タイプ」列で、「string」を選択します。
- 「リソース ユーザー属性」列に、「IGNORE_ATTR」と入力します。「必須」、「監査」、「読み取り専用」、および「書き込み専用」の各列は、チェックマークを外したままにします。
- 「Deprovision Form」ユーザーフォームの </Include> タグのあとに次のフィールドを追加します。
<Field name='resourceAccounts.currentResourceAccounts[AD].attributes.
delete after action'>
<Expansion>
<s>AfterDelete</s>
</Expansion>
</Field>- 次の XML ファイルを作成し、Identity Manager にインポートします。ファイルのパスは、環境に合わせて変更してください。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE Waveset PUBLIC 'waveset.dtd' 'waveset.dtd'>
<Waveset>
<ResourceAction name='AfterDelete'>
<ResTypeAction restype='Windows Active Directory' timeout='6000'>
<act>
echo delete >> C:¥Temp¥%WSUSER_accountId%.txt
exit
</act>
</ResTypeAction>
</ResourceAction>
</Waveset>- Active Directory リソースの XML を編集し、「delete after action」スキーママッピングに情報を追加します。新しく追加する部分を含む、このリソースの完全なスキーママッピングの例を次に示します。ここでは、ビュー関連の情報を追加します。
<AccountAttributeType id='12' name='delete after action' syntax='string' mapName='IGNORE_ATTR' mapType='string'>
<Views>
<String>Delete</String>
</Views>
</AccountAttributeType>
Domino の例Domino リソースでは、前アクションと後アクションがサポートされます。
現在は、LotusScript と cmd シェルの 2 種類のアクションがサポートされています。どの操作アクションにも、実行される任意の数のアクションを実装できます。
次の例は、LotusScript および cmd シェルのリソースアクションの使用方法を示しています。
LotusScript の例
<ResourceAction name='iterateAttributes' createDate='1083868010032'>
<ResTypeAction restype='Domino Gateway' actionType='lotusscript'>
<act>
Sub Initialize
Main
End Sub
Sub Main
Dim session As New NotesSession
Dim doc As NotesDocument
Set doc = session.DocumentContext
Forall i In doc.Items
Dim attrVal As Variant
attrVal = doc.GetItemValue(i.Name)
End Forall
End Sub
</act>
</ResTypeAction>
</ResourceAction>cmd シェルの例
<ResourceAction name='getDirectoryContents' createDate='1083868010032'>
<ResTypeAction restype='Domino Gateway'>
<act>dir</act>
</ResTypeAction>
</ResourceAction>
LotusScript の実行
Domino では、LotusScript の実行はデータベースに接続されたエージェントによって処理されます。Domino アダプタは、次のいずれかの方法で LotusScript を実行します。
入力
結果
agentName
エージェントを実行します。
agentName およびスクリプト
スクリプトを用いてエージェントを更新し、そのエージェントを実行します。
agentName、agentCreate、およびスクリプト
スクリプトを用いてエージェントを作成し、そのエージェントを実行します。
次に示すカスタマイズされたアカウント属性は、LotusScript で使用できます。これらの属性のいずれかを使用する場合は、その属性を Domino ゲートウェイスキーママップに追加します。「リソース ユーザー属性」列には値として「IGNORE_ATTR」を指定します。
- agentName - 実行するエージェントの名前。この属性は必ず指定します。そうしないと、エラーが返されます。
- agentServer - エージェントがインストールされている、エージェントを実行するデータベースの場所。この属性が存在しない場合は、「登録サーバー コンピュータ」リソースパラメータ (REG_SERVER) に指定された値がデフォルトとして使用されます。
- agentDBName - エージェントを検索できるデータベースの名前。この属性では、リソースの「名前データベース」リソースパラメータ (NAB) で指定された値がデフォルトとして使用されます。
- agentCreate - 指定されたエージェントが見つからない場合にアダプタが新しいエージェントを作成するべきかどうかを示すフラグ。この属性のデフォルト値は false です。NULL 以外の値にすると、このフラグは有効になります。
LotusScript への引数
エージェントの引数は、バックエンド NotesSession クラスからの専用プロパティーを介して、LotusScript へのノートハンドルで指定されます。これは次のように定義できます。
NotesDocument = NotesSession.DocumentContext
アクションスクリプトルーチンによって NotesDocument をインスタンス化し、そのフィールド値を LotusScript サブルーチンへのパラメータとして読み取ることができます。
ドキュメントに定義された任意の引数の名前と値を取得する LotusScript の例を次に示します。
Dim session As New NotesSession
Dim doc As NotesDocument
Set doc = session.DocumentContext
Forall i In doc.Items
Dim attrVal As Variant
attrVal = doc.GetItemValue(i.Name)
Print(" Attribute Name: " + i.Name + " Value: " + attrVal(0))
End ForallNT アクションの場合と同じように、アクションの呼び出し中に定義された属性はすべて、先頭に WSUSER_ が付加された NotesDocument に配置されます。
cmd シェルの実行
アクションは、拡張機能を有効にした Windows コマンドインタプリタ cmd.exe を使用して実行されます。ユーザー操作の前に実行するアクションでは、ゼロの値を返す必要があります。そうしないと、操作はエラー終了となります。
cmd シェルへの引数
NT/ADSI cmd アクションと同様に、環境変数はエクスポートされ、アクションで利用できるようになります。これらの環境変数は、ユーザーに関する値 (リソーススキーママップの「Identity Manager ユーザー属性」列で定義される) を持つ、スキーマにマップされたすべての属性を、先頭に WSUSER_ を付加して構成します。
複数値属性は、次のようなパイプ区切りリストで構成されます。
WSUSER_groups=staff|admin|users
メインフレームの例ACF2、RACF、および Top Secret アダプタには、login および logoff リソースアクションが必要になります。login アクションは、認証されたセッションに関してメインフレームとネゴシエーションを行います。logoff アクションは、そのセッションが不要になったときに接続を解除します。
thin クライアントのホストアクセス 3270 エミュレータは、スクリプトセッション内のコマンドの実行を簡素化するために、リソースアダプタによるリソースアクションのコンテキストに提供されます。このエミュレータは、com.waveset.object.HostAccess クラスで定義されます。リソースアクションに渡される hostAccess オブジェクトで使用可能なメソッドに関する詳細については、HostAccess に関する JavaDoc を参照してください。
リソースアクションのコンテキスト
スクリプトアクションのコンテキスト内で、いくつかのグローバル変数が必要とされることがあります。
SendKeys メソッドのニーモニックキーワード
次の表では、英数字以外の値のキー入力をシミュレートする 3270 エミュレータを通して実行される可能性がある特殊機能について説明します。
サンプルリソースアクション
次のコーディング例は、メインフレームのリソース上で一般に実行されるアクションを示しています。
Login アクション
次のコードは、login リソースアクションと logoff リソースアクションのサンプル一式です。このサンプルは、Top Secret リソースを使用する、ある特定の顧客の環境に合わせた内容になっています。したがって、コマンド、プロンプト、コマンドシーケンスなどのテキストは、配備環境によって異なる可能性があります。これらのリソースアクションは、XML 内の Javascript をラップします。
<ResourceAction name='ACME Logoff Action'>
<50ResTypeAction restype='TopSecret'>
<act>
var TSO_MORE = " ***";
var TSO_PROMPT = " READY";
var TS_PROMPT = " ?";
hostAccess.waitForString("ENTER YOUR APPLICATION NAME");
hostAccess.sendKeys("tso[enter]");
hostAccess.waitForString("ENTER USERID ");
hostAccess.sendKeys(user + "[enter]");
hostAccess.waitForString("TSO/E LOGON");
hostAccess.sendKeys("S");
hostAccess.sendKeys("[enter]");
var pos = hostAccess.searchText(" -Nomail", false);
if (pos != 0) {
hostAccess.setCursorPos(pos);
hostAccess.sendKeys("S");
}
pos = hostAccess.searchText(" -Nonotice", false);
if (pos != 0) {
hostAccess.setCursorPos(pos);
hostAccess.sendKeys("S");
}
hostAccess.sendKeys("[enter]");
hostAccess.waitForStringAndInput(TSO_MORE);
hostAccess.sendKeys("[enter]");
hostAccess.waitForStringAndInput(TSO_MORE);
hostAccess.sendKeys("[enter]");
hostAccess.waitForStringAndInput("ISPF");
hostAccess.sendKeys("=x[enter]");
hostAccess.waitForString(TSO_PROMPT);
var resp =hostAccess.doCmd("PROFILE NOPROMPT MSGID NOINTERCOM NOPAUSE NOWTPMSG PLANGUAGE(ENU) SLANGUAGE(ENU) NOPREFIX[enter]", TSO_PROMPT, TSO_MORE);
hostAccess.waitForStringAndInput("ENTER LOGON:");
hostAccess.sendKeys(system + "[enter]");
hostAccess.waitForStringAndInput("USER-ID.....");
hostAccess.sendKeys(user + "[enter]");
hostAccess.sendKeys("[enter]");
var stringsToHide = new java.util.ArrayList();
stringsToHide.add(password.decryptToString());
hostAccess.waitForString("==>", stringsToHide);
hostAccess.waitForInput();
hostAccess.sendKeys("[pf6]");
hostAccess.waitForInput();
</act>
</ResTypeAction>
</ResourceAction>logoff アクション
<ResourceAction name='ACME Logoff Action'>
<50ResTypeAction restype='TopSecret'>
<act>
var TSO_PROMPT = " READY";
hostAccess.sendKeys("[clear]end[enter]");
hostAccess.waitForString(TSO_PROMPT);
hostAccess.sendKeys("logoff[enter]");
</act>
</ResTypeAction>
</ResourceAction>RACF データセット規則のアクション
RACF リソースパラメータのページで「データセット規則の作成および削除」パラメータが選択されている場合は、Identity Manager によってデータセット規則が直接管理されます。ユーザー独自のデータセット規則を設定するには、次のようなアクションを定義します。
<ResourceAction name='create after action'>
<ResTypeAction restype='RACF'>
<act>
var TSO_PROMPT = " READY";
var TSO_MORE = " ***";
var cmd1 = "addsd '"+identity+".test1.**' owner('"+identity+"')[enter]";
var result1 = hostAccess.doCmd(cmd1, TSO_PROMPT, TSO_MORE);
</act>
</ResTypeAction>
</ResourceAction>
ビューの拡張ビューに属性を追加できます。属性はすべて登録されている必要があります。
Identity Manager でのさまざまなプロビジョニングアクティビティーにおいて利用できるユーザー属性は、そのアクションを完了するために必要な属性に限定されます。たとえば、ユーザーを編集する場合には、割り当てられたリソースの中で更新可能と定義されているユーザー属性のみが利用できます。一方、パスワードの変更プロセスでは、要求を実行するための属性のサブセットのみを必要とします。
属性の登録
属性は、次の 2 つの場所のどちらかに登録できます。
Location
属性をここに登録する条件
リソース内の AccountAttributeType 定義
... ... 更新する属性が、そのタイプのすべてのリソースではなく、特定のリソースに固有の属性である場合。
System Configuration オブジェクト
特定タイプのすべてのリソースに対してグローバルに登録する場合。これらの登録は XML 形式で行ってください。
ビューごとに異なる属性を登録できます。たとえば、lock 属性をパスワードビューに登録したり、firstname 属性を名前の変更ビューに登録したり、リソースアクションを有効化ビュー、無効化ビュー、またはプロビジョニング解除ビューに登録したりできます。
注
前アクションと後アクションの場合は、作成または更新のユーザープロセスを除くすべてのプロセスのビューを拡張してください。ビューの拡張については、「Identity Manager Views」を参照してください。
グローバル登録
グローバル登録を行うには、次のパスを持つ System Configuration オブジェクトに属性を追加します。
updatableAttributes.ViewName.ResourceTypeName
ここで、ViewName は Password、Reset、Enable、Disable、Rename、または Delete のいずれかで、ResourceTypeName はリソースタイプの名前です。all というタイプ名は、すべてのリソースに適用される登録用に予約されています。
この属性の値には、<String> のリストを指定します。各文字列は、更新する属性の名前です。次の例では、delete before action という名前の属性を、すべてのリソース用のプロビジョニング解除ビューに登録します。
<Attribute name='updatableAttributes'>
<オブジェクト>
<Attribute name='Delete'>
<オブジェクト>
<Attribute name='all'>
<List>
<String>delete before action</String>
</List>
</Attribute>
</Object>
</Attribute>
<Attribute name='Enable'>
<オブジェクト>
<Attribute name='all'>
<List>
<String>enable before action</String>
</List></Attribute>
</Object>
</Attribute>
</Object>
</Attribute>リソース別登録
リソース別登録を行うには、そのリソースオブジェクトを Identity Manager デバッグページで変更し、AccountAttributeType 要素内に <Views> サブ要素を挿入します。<Views> には、この属性を更新できるビューの名前を示す文字列値のリストを含めます。
<AccountAttributeType name='lastname' mapName='sn' mapType='string'>
<Views>
<String>Rename</String>
</Views>
</AccountAttributeType>このビューでは、変更する文字列が次のオブジェクト内に配置されます。
resourceAccounts.currentResourceAccounts[ResourceTypeName].attributes
例:
<Field name= 'resourceAccounts.currentResourceAccounts[OS400ResourceName].attrib utes.delete before action' hidden='true'>
<Expansion>
<s>os400BeforeDeleteAction</s>
</Expansion>
</Field>