JDBC MS Access Workgroup (MDW) Java中已存在的密码设置错误



这是我的场景我有MS访问数据库(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。有什么问题吗?我做错什么了吗?

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

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();
        }
    }
}

…Tim可以使用新密码

登录。
I like Java

但是,如果我把代码改成…

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

…然后单引号成为新密码的一部分,Tim必须输入密码…

'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"。

最新更新