有没有办法使用SQL在IBM System i(aka iSeries/AS400)上更改用户密码?

Tim*_*ver 7 c# sql passwords db2 ibm-midrange

我有一个C#.NET应用程序,必须能够更改IBM System i(iSeries/AS400)计算机上的用户密码.我目前正在使用以下代码使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但迫使我(以及应用程序的所有用户)对cwbx.dll采取专有依赖.我想消除这种依赖.

有没有办法使用类似于MS SQL Server alter login机制的SQL更改密码?

我知道我可以使用IBM.Data.DB2.iSeries .NET数据提供程序通过使用以下代码从SQL 集成DB2通用数据库for iSeries与iSeries与Microsoft ADO .NET调用程序来实现此目的.

/// <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;
}
Run Code Online (Sandbox Code Playgroud)

这种技术的问题是我必须先有一个连接才能尝试更改密码.不幸的是,如果用户的密码已过期,则无法连接到数据库(iDB2CommErrorException),因此无法更改其密码.

有没有办法在没有cwbx.dll的情况下实现这个目标?

Tim*_*ver 4

要从 .NET 应用程序以编程方式更改 IBM i(又名 System i/iSeries/AS400)上的过期密码,而不依赖于本地安装的IBM i Access for Windows(对于 cwbx.dll),请考虑以下选项之一。

  • 以编程方式建立与 IBM i 的 Telnet 连接,并传输模仿执行更改密码操作所需的用户输入的字符序列。*请注意,如果没有进一步配置,这是不安全的。

  • IBM Toolbox for Java 包含一个 OS/400 或 i5/OS Java 类,可在 Java 程序中使用该类来更改密码。该类的 Java 帮助可在 iSeries 信息中心和以下 Web 站点中找到:http://publib.boulder.ibm.com/pubs/html/as400/v5r1/ic2924/index.htm

    以下示例演示如何使用IBM Toolbox for Java对过期密码执行更改密码操作。这可以从 C# 程序调用System.Diagnostics.Process.Start("java ChangeIBMiPassword hostname username oldpw newpw");(假设有适当的类路径)。另请注意,可以通过IKVM.NET 库直接从 .NET 使用 Java API 。

import com.ibm.as400.access.AS400;

public class ChangeIBMiPassword {
    public static void main(String[] args) {
        if (args.length < 4)
            System.exit(-1);

        String host = args[0];
        String user = args[1];
        String oldpw = args[2];
        String newpw = args[3];

        AS400 sys = new AS400(host, user);  
        try {
            sys.changePassword(oldpw, newpw);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 编写在 IBM i 上运行的安全 Web 服务。该网络服务将接受用户名、当前密码和新密码的参数。当用户调用此Web服务时,它将代表调用程序执行更改密码操作。

  • 编写不在 IBM i 上运行的安全 Web 服务。该网络服务将接受用户名、当前密码和新密码的参数。当用户调用此 Web 服务时,它将使用 cwbx 库代表调用程序执行更改密码操作。这并没有完全消除对 cwbx.dll 的依赖,但它将其降低到单个系统。

http://www-01.ibm.com/support/docview.wss?uid=nas10043a8b0e0544f1386256ba100659bcd