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