使用JNA的LogonUser导致“未知的用户名或错误的密码”

时间:2019-02-07 06:55:08

标签: java windows winapi jna

我尝试实现一种功能,以使用某些凭据执行某些应用程序。为此,我检查是否可以使用凭据登录。

import com.sun.jna.LastErrorException;
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinNT;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class TestHarness {

    public static void main(String[] args) throws UnknownHostException {

        WinNT.HANDLEByReference phUser = new WinNT.HANDLEByReference();
        System.out.println(InetAddress.getLocalHost().getHostName());
        if (!Advapi32.INSTANCE.LogonUser("de313e", ".",
                "password", WinBase.LOGON32_LOGON_NETWORK, WinBase.LOGON32_PROVIDER_DEFAULT, phUser)) {
            throw new LastErrorException(Kernel32.INSTANCE.GetLastError());
        }
    }
}

不幸的是,这给了我

com.sun.jna.LastErrorException: GetLastError() returned 1326

提供的用户名是我当前的用户名。有谁知道为什么这行不通?

我正在Windows 10操作系统上运行它。我的密码包含一些特殊字符,例如!&。用户的命名位置:

enter image description here

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

LogonUser的文档说明了参数lpszDomain

  

指向以空字符结尾的字符串的指针,该字符串指定字符串的名称   其帐户数据库包含lpszUsername的域或服务器   帐户。如果此参数为NULL,则必须在以下位置指定用户名   UPN格式。如果此参数为“。”,则该函数将验证   仅使用本地帐户数据库来登录帐户。

由于您使用的是".",因此仅针对本地用户数据库进行验证。这将适用于本地计算机(NB3DE2730054)上的sysadmin帐户。但是,您正在尝试验证域用户de313e,因此必须指定域MASTDOM

作为替代方案,您可以将域设置为null,并将该域包含在用户de313e@MASTDOM中。或者,正如您在评论中所指出的那样,如果您使用logonType LOGON32_LOGON_NEW_CREDENTIALS和logonProvider LOGON32_PROVIDER_WINNT50,则"."将起作用。