API LogonUser не работает правильно с доменом с рабочей станции - PullRequest
0 голосов
/ 08 мая 2019

Для теста я настроил простой домен и добавил несколько пользователей. У меня есть рабочие станции 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

1 Ответ

0 голосов
/ 08 мая 2019

LogonUser() требует, чтобы текущий пользователь имел привилегию «Действовать как часть операционной системы». По умолчанию он не предоставляется никому, даже администраторам.

РЕДАКТИРОВАТЬ: до LogonUser, вам нужно позвонить AdjustTokenPrivileges() - добавить привилегию SE_TCB_NAME для текущего пользователя.

РЕДАКТИРОВАТЬ: мне придется проверить, но я не думаю, что LogonUser предназначался для аутентификации пользователей от ненадежных органов (например, доменов, на которых текущий компьютер не включен).

Подумайте о создании фиктивного общего ресурса на одном из компьютеров домена (может быть, контроллера домена) и вызове против него WNetAddConnection2().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...