我尝试使用某些凭据实现某个应用程序的功能。为此,我检查是否可以使用凭据登录。
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操作系统上运行它。我的密码包含一些特殊的字符,如!
和&
。用户命名为:
谢谢你的帮助
LogonUser的文档声明参数lpszDomain
:
指向以null结尾的字符串的指针,该字符串指定其帐户数据库包含lpszUsername帐户的域或服务器的名称。如果此参数为NULL,则必须以UPN格式指定用户名。如果此参数为“。”,则该函数仅使用本地帐户数据库验证帐户。
由于您使用的是"."
,因此您只能对本地用户数据库进行验证。这适用于本地计算机上的sysadmin
帐户(NB3DE2730054)。但是,您正在尝试验证域用户de313e
,因此您必须指定域MASTDOM
。
作为替代方案,您可以将域设置为null
并将域包含在用户:de313e@MASTDOM
中。或者,正如您在评论中指出的那样,如果您使用logonType LOGON32_LOGON_NEW_CREDENTIALS
和logonProvider LOGON32_PROVIDER_WINNT50
,"."
将起作用。