为了测试,我设置了一个简单的域并添加了一些用户。我也有未加入该域的 Win10 工作站。通过提供域用户名和密码以通过 Window 的资源管理器查看文件共享,我可以毫无问题地从工作站访问 DC。我什至可以使用来自 vb.net 的 LDAP 来验证 DC 帐户。
我正在尝试使用 LOGONUSER API(尝试所有风格)来尝试从未加入该域的工作站验证域帐户(本地帐户验证 OK)。无论我使用什么标志/组合,它总是返回 false(登录失败)。我唯一成功的时候是使用标志 NEW_CREDENTIALS 但即使使用无效凭据,默认情况下也应该返回真值。显然,通过阅读与从工作站计算机到域控制器使用 LogonUser API 相关的其他帖子,似乎没有人可以让它工作。我什至在我们公司试过。没有运气的域。但是,如果我将我编写的程序(从多个来源借来/尝试过的代码)放在任何已经加入域的计算机上,它就可以正常工作,它甚至可以跨域之间进行完全信任的身份验证。它只是无法从非域工作站到域。需要做些什么来完成这项工作?我找不到任何说它不起作用的官方文件,如果我能找到它们存在那就太好了。谢谢你的时间..
<DllImport("advapi32.dll", SetLastError:=True)> _
Private Shared Function LogonUser(ByVal lpszUsername As String, ByVal lpszDomain As String, ByVal lpszPassword As String,
ByVal dwLogonType As LogonType, ByVal dwLogonProvider As LogonProvider, ByRef phToken As IntPtr) As Boolean
End Function
Enum LogonType As Integer
LOGON32_LOGON_INTERACTIVE = 2
LOGON32_LOGON_NETWORK = 3
LOGON32_LOGON_BATCH = 4
LOGON32_LOGON_SERVICE = 5
LOGON32_LOGON_UNLOCK = 7
LOGON32_LOGON_NETWORK_CLEARTEXT = 8
LOGON32_LOGON_NEW_CREDENTIALS = 9
End Enum
Enum LogonProvider As Integer
LOGON32_PROVIDER_DEFAULT = 0
LOGON32_PROVIDER_WINNT35 = 1
LOGON32_PROVIDER_WINNT40 = 2
LOGON32_PROVIDER_WINNT50 = 3
End Enum
public sub TryLogon()
Dim token As New IntPtr
Dim Username as string = "myuser",domain as string = "mydomain.local",password as string = "password"
Dim retVal = LogonUser(Username, domain, Password, LogonType.LOGON32_LOGON_NETWORK, LogonProvider.LOGON32_PROVIDER_DEFAULT, token)
If retVal = False Then
Dim errMsg = New System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).Message
MsgBox(errMsg, MsgBoxStyle.Critical, "Logon")
End If
end sub