0

这是我的场景,我有 MS Access DB(MDB 文件)和工作组安全文件。我有拥有所有许可的凭据(管理员用户)。这个 DB 和 MDW 文件是在其他计算机上创建的,我现在正在我的计算机上使用它。到目前为止,我能做的是,我可以使用数据库中存在的不同用户名和密码登录数据库。通过使用正确的用户名和错误的密码来验证这一点它给出了错误,但它登录的凭据正确。现在我需要在 Java 中为基本功能创建一个接口。1.更改当前登录用户的密码。

更改当前用户的密码

以下是我更改密码的代码

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database = "jdbc:odbc:"+"mdbTEST";
// mdbTEST is created in System DNS which uses SECURED.MDW file and 
// ExtendedAnsiSQL is set to 1
conn = DriverManager.getConnection(database, "administrator", "hello");

String q = "ALTER USER "+uname+" PASSWORD "+newPass+" '"+oldPass+"'";
stmt = conn.createStatement();
stmt.execute(q); 

它返回成功。但是当我尝试使用用户名和新密码登录时,它说密码错误,甚至旧密码也停止工作。

此外,我尝试使用一些第三方软件读取 WorkGroup 文件中的所有用户名和密码,它显示新密码在 MDW 文件中正确更新。

我在 Windows XP 32 位上使用 JDK 1.7。可能是什么问题?我在这里做错了吗?提前致谢。

4

1 回答 1

0

如果要在密码值周围加上引号以容纳包含空格的密码,则应将它们括在双引号 ( ") 中。如果将它们括在单引号 ( ') 中,则单引号字符将成为密码的一部分。例如,在执行我的测试代码后......

import java.sql.*;

public class ulsTest {
    public static void main( String args[] )
    {
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection conn = DriverManager.getConnection(
                    "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" + 
                    "DBQ=C:\\Users\\Public\\uls\\ulsTest.mdb;" +
                    "SystemDB=C:\\Users\\Public\\uls\\Security.mdw;" +
                    "Uid=Gord;" +
                    "Pwd=obfuscated;" +
                    "ExtendedAnsiSQL=1;");

            String UID = "Tim";
            String oldPWD = "oldpassword";
            String newPWD = "I like Java";

            Statement s = conn.createStatement();
            s.execute("ALTER USER " + UID + " PASSWORD \"" + newPWD + "\" \"" + oldPWD + "\""); 
            //  ALTER USER Tim PASSWORD "I like Java" "oldpassword"

            System.out.println("User updated.");

            s.close();
            conn.close();
        }
        catch( Exception e ) {
            e.printStackTrace();
        }
    }
}

...蒂姆能够使用新密码登录

I like Java

但是,如果我将代码更改为...

s.execute("ALTER USER " + UID + " PASSWORD '" + newPWD + "' '" + oldPWD + "'"); 
//  ALTER USER Tim PASSWORD 'I like Java' 'oldpassword'

...然后单引号成为新密码的一部分,蒂姆必须输入密码...

'I like Java'

...(包括单引号)登录。

旁注:我希望参数化查询可以避免混淆字符串引用,但不幸的是代码......

PreparedStatement s = conn.prepareStatement("ALTER USER ? PASSWORD ? ?");
s.setString(1, UID);
s.setString(2, newPWD);
s.setString(3, oldPWD);
s.execute();

...失败并出现错误:

[Microsoft][ODBC Microsoft Access Driver] SQL 语句无效;预期为“DELETE”、“INSERT”、“PROCEDURE”、“SELECT”或“UPDATE”。

于 2013-05-22T07:56:01.333 回答