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

问题描述 投票:1回答:1

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

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

谢谢你的帮助

java windows winapi jna
1个回答
1
投票

LogonUser的文档声明参数lpszDomain

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.