Для теста я настроил простой домен и добавил несколько пользователей. У меня есть рабочие станции Win10, которые НЕ подключены к этому домену. Я могу получить доступ к DC с рабочих станций без проблем, предоставив имя пользователя и пароль домена для просмотра общих файлов через проводник Windows. Я даже могу использовать LDAP от vb.net для аутентификации учетных записей DC.
Я пытаюсь использовать LOGONUSER API (все варианты) в попытке подтвердить учетную запись домена (локальные учетные записи проверяются OK) с рабочей станции, НЕ присоединенной к этому домену. Какой бы флаг / комбо я ни использовал, он всегда возвращает false (неудачный вход в систему). Единственный раз, когда я добиваюсь успеха, это когда использую флаг NEW_CREDENTIALS, но он предположительно возвращает истинное значение по умолчанию даже с неверными учетными данными. Очевидно, что при чтении других сообщений, связанных с использованием API LogonUser с компьютера рабочей станции, на контроллере домена никто не может заставить его работать. Я даже попробовал это на нашей корпорации. домены без удачи. Тем не менее, программа, которую я написал (заимствовал / попробовал код из нескольких источников), работает нормально, если я помещаю его на любой компьютер, уже присоединенный к домену, и он даже будет аутентифицироваться в доменах, которые имеют полное доверие между ними. Это просто не будет работать с не доменной рабочей станции в домен. Что нужно сделать, чтобы сделать эту работу? Я не могу найти никаких официальных документов, в которых говорится, что это не сработает, и было бы здорово, если бы я мог найти, что они существуют. Спасибо за ваше время ..
<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