LogonUser API无法与Workstation中的Domain一起正常使用

时间:2019-05-08 18:18:24

标签: windows api dns workgroup

为了进行测试,我设置了一个简单的域并添加了一些用户。我的Win10工作站也未加入该域。我可以通过提供域用户名和密码通过Window的资源管理器查看文件共享,而从工作站访问DC都没有问题。我什至可以使用vb.net上的LDAP来验证DC帐户。

我正在尝试使用LOGONUSER API(尝试所有方式),以尝试从未加入该域的工作站验证域帐户(本地帐户验证确定)。无论我使用什么标志/组合,它总是返回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

2 个答案:

答案 0 :(得分:0)

LogonUser()要求当前用户具有“充当操作系统的一部分”特权。默认情况下,不授予任何人,甚至不授予管理员。

编辑:在LogonUser之前,您需要调用AdjustTokenPrivileges()-向当前用户添加SE_TCB_NAME特权。

编辑:我必须检查一下,但我不认为LogonUser是用于对来自不受信任的机构(例如,当前计算机未打开的域)中的用户进行身份验证的。

请考虑在其中一台域计算机(可能是域控制器)上创建虚拟共享,并对其调用WNetAddConnection2()

答案 1 :(得分:0)

我解决了Windows 10(1607)上未通过以下方式连接到域的问题: -使用“。”作为域 -LOGON32_LOGON_INTERACTIVE -LOGON32_PROVIDER_DEFAULT

只是让你知道。

以下帖子使我步入正轨:LogonUser() not authenticating user for invalid domain when computer is not on a domain