IBM System i (iSeries / AS400) マシンでユーザー パスワードを変更できる必要がある C#.NET アプリケーションがあります。現在、次のコードを使用して、IBM 独自のcwbx.dllを使用してこの操作を実行しています。
using cwbx;
public void ChangePassword(string system, string user, string currentPassword, string newPassword)
{
AS400System as400 = new AS400System();
as400.Define(system);
try
{
as400.ChangePassword(user, currentPassword, newPassword);
}
finally
{
as400.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
}
}
これは十分に機能しますが、私 (およびアプリケーションのすべてのユーザー) はcwbx.dllに独自の依存関係を持たなければなりません。この依存関係を解消したいと考えています。
MS SQL Server のalter login
メカニズムと同様に、SQL を使用してパスワードを変更する方法はありますか?
IBM.Data.DB2.iSeries .NET データ プロバイダーを使用して、 DB2 Universal Universal Database for iSeries と for iSeries と Microsoft ADO .NET の統合の次のコードを使用して SQL からプログラムを呼び出すことにより、これを実現できることを私は知っています。
/// <summary>
/// Call a program directly on the iSeries with parameters
/// </summary>
public string CallPgm(string cmdtext)
{
string rc = " ";
// Construct a string which contains the call to QCMDEXC.
// Because QCMDEXC uses single quote characters, we must
// delimit single quote characters in the command text
// with an extra single quote.
string pgmParm = "CALL QSYS/QCMDEXC('"
+ cmdtext.Replace("'", "''")
+ "', "
+ cmdtext.Length.ToString("0000000000.00000")
+ ")";
// Create a command to execute the program or command.
iDB2Command cmd = new iDB2Command(pgmParm, _connection);
try
{
cmd.ExecuteNonQuery();
}
catch (iDB2Exception ex)
{
rc = ex.Message;
}
// Dispose the command since we're done with it.
cmd.Dispose();
// Return the success or failure of the call.
return rc;
}
この手法の問題点は、パスワードを変更しようとする前に既存の接続が必要なことです。残念ながら、ユーザーのパスワードの有効期限が切れている場合、ユーザーはデータベース ( iDB2CommErrorException
) に接続できず、その結果、パスワードを変更できません。
cwbx.dll なしでこれを達成する方法はありますか?