Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Как проверить правильность связки логин-пароль? Добавлено: 29.12.08 23:34  

Автор вопроса:  Cooller
Здраствуйте!
Возникла проблемма...
На форме есть 2 listbox`а
В одном выбирается логин, в другом пароль...
Подскажите как проверить правильность связки логин-пароль?

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #1 Добавлено: 30.12.08 00:20
Хм... странный вопрос. Все зависит от того, как ты криптуешь/хешируешь пароль.
На мой взгляд - лучше использовать хеш - он не поддается обратной расшифровке.
Предположим, в БД у тебя уже хранятся Логин и Пароль.
Просто тупо сверяешь их с введенными.

Ответить

Номер ответа: 2
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #2 Добавлено: 30.12.08 00:27
я имел введу сравнение логина(учётной записи винды) и пароля...
Есть пару идей, но не получается реализовать...
1) Заюзать active DS
2) Использовать api CreateProcessAsUser или CreateProcessWithLogon и в случае если запуститься вторая прога(check.exe) значит pass=true...

Ответить

Номер ответа: 3
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #3 Добавлено: 30.12.08 08:25
Cooller пишет:
учётной записи винды

вот с этого и надо было начинать. :-D
1. получается тогда прога работать будет только под AD? ;-)

Ответить

Номер ответа: 4
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #4 Добавлено: 30.12.08 08:34
блин... недописал...
2. это как-то слишком с "подвыподвертом"
есть такая функция еще: VerifyScreenSavePwd, не знаю правда, прокатит или нет... :)

Ответить

Номер ответа: 5
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #5 Добавлено: 30.12.08 08:37
1. получается тогда прога работать будет только под AD? ;-)

В первом случае - да. Есть идеи как сделать без AD?
Если использовать AD, почему функция CheckUser всегда возвращает true?

Private Function CheckUser(MyDomain As String, UserName As String, Password As String) As Boolean
    Dim dso As IADsOpenDSObject
    Dim obj
    CheckUser = False
    Set dso = GetObject("WinNT:";)
    On Error Resume Next
    Set obj = dso.OpenDSObject("WinNT://" & MyDomain, UserName, Password, ADS_SECURE_AUTHENTICATION)
    If Err.Number <> 0 Or obj Is Nothing Then
        Err.Clear
        Exit Function
    End If
    CheckUser = True
    Set obj = Nothing
    Set dso = Nothing
End Function
Private Sub 123_Click()

Dim a As Boolean
a = False
a =checkUser "Workgroup/my_Comp", "Cooller", "1";)
If a = True Then MsgBox ("asdasd";)
end sub

Ответить

Номер ответа: 6
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #6 Добавлено: 30.12.08 08:49
есть такая функция еще: VerifyScreenSavePwd, не знаю правда, прокатит или нет... :)

нет. насколько я понял она просто вызывает мастдайное окно для проверки....:(

Ответить

Номер ответа: 7
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #7 Добавлено: 30.12.08 08:51
нашел. :)
на форму - 2 текстбокса и батон.
  1. Option Explicit
  2.  
  3. Private Declare Function LogonUser Lib "Advapi32" Alias "LogonUserA" (ByVal lpszUsername As String, ByVal lpszDomain As Any, ByVal lpszPassword As String, ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, phToken As Long) As Long
  4. Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  5. Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
  6. Private Declare Function NetUserChangePassword Lib "netapi32.dll" (ByVal sDomain As String, ByVal sUserName As String, ByVal sOldPassword As String, ByVal sNewPassword As String) As Long
  7.  
  8. 'Purpose   :    Checks if a the NT password for a user is correct.
  9. 'Inputs    :    UserName                The username
  10. '               Password                The password
  11. '               [Domain]                If DOMAIN is omitted uses the local account database.
  12. 'Outputs   :    Returns True if the password and user name are valid.
  13. 'Notes     :    Windows NT and 2000 ONLY. Will work on any machine.
  14. '               Slower than the UserCheckPassword function, but more reliable.
  15.  
  16. Function UserValidate(sUserName As String, sPassword As String, Optional sDomain As String) As Boolean
  17.     Dim lReturn As Long
  18.     Const NERR_BASE = 2100
  19.     Const NERR_PasswordCantChange = NERR_BASE + 143
  20.     Const NERR_PasswordHistConflict = NERR_BASE + 144
  21.     Const NERR_PasswordTooShort = NERR_BASE + 145
  22.     Const NERR_PasswordTooRecent = NERR_BASE + 146
  23.     
  24.     If Len(sDomain) = 0 Then
  25.         sDomain = Environ$("USERDOMAIN")
  26.     End If
  27.     
  28.     'Call API to check password.
  29.     lReturn = NetUserChangePassword(StrConv(sDomain, vbUnicode), StrConv(sUserName, vbUnicode), StrConv(sPassword, vbUnicode), StrConv(sPassword, vbUnicode))
  30.     
  31.     'Test return value.
  32.     Select Case lReturn
  33.     Case 0, NERR_PasswordCantChange, NERR_PasswordHistConflict, NERR_PasswordTooShort, NERR_PasswordTooRecent
  34.         UserValidate = True
  35.     Case Else
  36.         UserValidate = False
  37.     End Select
  38. End Function
  39.  
  40.  
  41. 'Purpose   :    Checks if a the NT password for a user is correct.
  42. 'Inputs    :    UserName                The username
  43. '               Password                The password
  44. '               [Domain]                If DOMAIN is omitted uses the local account database.
  45. 'Outputs   :    Returns True if the password and user name are valid.
  46. 'Notes     :    Windows NT and 2000 ONLY. Requires correct permissions to run (must have
  47. '               the SE_TCB_NAME privilege. In User Manager, this is the "Act as part of the
  48. '               Operating System" right).
  49.  
  50. Function UserCheckPassword(ByVal Username As String, ByVal Password As String, Optional ByVal Domain As String = vbNullString) As Boolean
  51.     Dim lRet As Long, hToken As Long
  52.     
  53.     Const LOGON32_LOGON_NETWORK = 3&            'Intended for high performance servers to authenticate clear text passwords
  54.     Const LOGON32_LOGON_INTERACTIVE = 2&        'Intended for users who will be interactively using the machine, such as a user being logged on by a terminal server
  55.     Const LOGON32_LOGON_BATCH = 4&
  56.     
  57.     Const LOGON32_PROVIDER_DEFAULT = 0&         'Use the standard logon provider for the system
  58.     Const LOGON32_PROVIDER_WINNT40 = 2&         'Use the Windows NT 4.0 logon provider
  59.     Const LOGON32_PROVIDER_WINNT35 = 1&         'Use the Windows NT 3.5 logon provider
  60.     Const LOGON32_PROVIDER_WINNT50 = 3&         'Use the Windows 2000 logon provider.
  61.     
  62.     'Check the username and password
  63.     lRet = LogonUser(Username, Domain, Password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, hToken)
  64.     
  65.     If lRet Then
  66.         'Password correct
  67.         UserCheckPassword = True
  68.         CloseHandle hToken
  69.     Else
  70.         'Failed:
  71.         Debug.Print "Error: " & DLLErrorText(Err.LastDllError)
  72.     End If
  73. End Function
  74.  
  75.  
  76. 'Purpose     :  Return the error message associated with LastDLLError
  77. 'Inputs      :  lLastDLLError               The error number of the last DLL error (from Err.LastDllError)
  78. 'Outputs     :  Returns the error message associated with the DLL error number
  79. 'Notes       :
  80. 'Revisions   :
  81.  
  82. Public Function DLLErrorText(ByVal lLastDLLError As Long) As String
  83.     Dim sBuff As String * 256
  84.     Dim lCount As Long
  85.     Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100, FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
  86.     Const FORMAT_MESSAGE_FROM_HMODULE = &H800, FORMAT_MESSAGE_FROM_STRING = &H400
  87.     Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000, FORMAT_MESSAGE_IGNORE_INSERTS = &H200
  88.     Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF
  89.     
  90.     lCount = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0, lLastDLLError, 0&, sBuff, Len(sBuff), ByVal 0)
  91.     If lCount Then
  92.         DLLErrorText = Left$(sBuff, lCount - 2)    'Remove line feeds
  93.     End If
  94.     
  95. End Function
  96.  
  97. Private Sub Command1_Click()
  98.     'Check if password is valid
  99.     Debug.Print "Password valid, method 1: " & UserCheckPassword(Text1.Text, Text2.Text)
  100.     Debug.Print "Password valid method 2: " & UserValidate(Text1.Text, Text2.Text)
  101. End Sub

Ответить

Номер ответа: 8
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #8 Добавлено: 30.12.08 08:52
Без AD работает. :)

Ответить

Номер ответа: 9
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #9 Добавлено: 30.12.08 09:03
Пасибо, всё работает :)
и всё-таки вопрос по AD

код почему-то не работает :(
Dim fso As IADsGroup
Set fso = GetObject("WinNT://Workgroup/cooller-9969fed/Пользователи";)
Dim u As IADsUser
For Each u In fso.Members
MsgBox u.Name
Next
Хотя если изменить группу Пользователи на Администраторы все ок...

реализовал через netuserenum, но имхо через AD проще...

Ответить

Номер ответа: 10
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #10 Добавлено: 30.12.08 09:57
А в верхнем примере тебе АД не заюзать? ;-)

Ответить

Номер ответа: 11
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #11 Добавлено: 31.12.08 00:07
Как?

Ответить

Номер ответа: 12
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #12 Добавлено: 31.12.08 01:46
Arseny, а как узнать если учётная запись без пароля?

Ответить

Номер ответа: 13
Автор ответа:
 Cooller



Вопросов: 11
Ответов: 32
 Профиль | | #13 Добавлено: 31.12.08 08:03
Спасибо! Всё сделал, до утра сидел...:) тему можно закрыть.

Ответить

Номер ответа: 14
Автор ответа:
 Arseny



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #14 Добавлено: 31.12.08 08:32
:-D Так выложи, в назидание потомкам. :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам