none
PowerShell аналог net use для проверки логина и пароля пользователя RRS feed

  • Вопрос

  • Добрый день!

    Написал программку на PowerShell которая из AD выгружает ветки и подбирает пароли к учетным записям (проверка на простые пароли, т.к. в организации не включена соответствующая политика).

    Читая книгу выяснил что самый быстрый способ для перебора это по протоколу SMB. Что оказалось куда удобней, чем предыдущий метод, поскольку здесь по мимо активных учетных записей, подбирается пароль и к учеткам отключенным и к тем чей пароль истек.

    Делал подбор при помощи $result = net use \\server1 /user:domain\user password_user.

    Результат при верном пароле: Команда выполнена успешно.

    В случае если пароль не верен выводится следующее сообщение:

    net.exe : Системная ошибка 1326.
    C:\...\...\Desktop\test.ps1:1 знак:4
    + net <<<<  use \\server1 /user:domain\user password_user
        + CategoryInfo          : NotSpecified: (Системная ошибка 1326.:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
     
    Вход в систему не произведен: имя пользователя или пароль не опознаны.

    По сути все выполнилось верно (Вход в систему не произведен: имя пользователя или пароль не опознаны.)

    Но в случае если пароль введен не верно или учетная запись заблокирована, программа об этом сообщает, но я не могу перехватить это сообщение!

    Как можно перехватить это сообщение?

    Буду рад любой помощи!

    18 июля 2013 г. 14:58

Ответы

  • Test-ADCredentials by Mike Pfeiffer

    Function Test-ADCredentials { Param($username, $password, $domain) Add-Type -AssemblyName System.DirectoryServices.AccountManagement $ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain $pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ct, $domain) $pc.ValidateCredentials($username, $password)

    }

    Test-ADCredentials kazun "password" contoso.com

    • Помечено в качестве ответа KaRaKuRt86 19 июля 2013 г. 8:16
    19 июля 2013 г. 6:43
    Отвечающий

Все ответы

  • Добрый день!

    Переношу Ваш вопрос в раздел Windows Scripting


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение".

    19 июля 2013 г. 6:19
    Модератор
  • Test-ADCredentials by Mike Pfeiffer

    Function Test-ADCredentials { Param($username, $password, $domain) Add-Type -AssemblyName System.DirectoryServices.AccountManagement $ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain $pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext($ct, $domain) $pc.ValidateCredentials($username, $password)

    }

    Test-ADCredentials kazun "password" contoso.com

    • Помечено в качестве ответа KaRaKuRt86 19 июля 2013 г. 8:16
    19 июля 2013 г. 6:43
    Отвечающий
  • Криво косо сделал. Результат не устраивает ... Скорость упала просто в разу ... Бедных 100 паролей перебирает 13 секунд. Может конечно, я перемудрил ..., но в итоге получилась вот такая функция:

        $FullFileName = ".\password.txt" 
        #Открываем файл при помощи
        $f = [System.IO.File]::OpenText($FullFileName)
        #Построчно читаем файл в цикле
        while (!$f.EndOfStream) {
        $pass = $f.ReadLine()
        $result = $null    
        $path = "\\XXX"
        $user = $ObjectConnection.sAMAccountName
        $error.Clear()
        $result = net use $path $pass /USER:$user 2>null
        $res = $Error[0].Exception.Message
        $result = $res.trim()
        if (($result -eq "Logon failure: unknown user name or bad password.") -or ($result -eq ""))
        {$result = "Access Denied"; $d= "[NO SUCCESS]"; $password = $Null}
        else
        {$d= "[SUCCESS]"; Break}}
    
        if ($result -eq "The command completed successfully.") 
        {$msg = "Логин: "+$user+" Пароль: "+$pass+" Доступ: $d"+$result; Write-host $msg -foregroundcolor Green; net use $path /d /y 2>&1>null;}
        else
        {$msg = "Логин: "+$user+" Пароль: "+" Доступ: $d "+$result; Write-host $msg -foregroundcolor Red}

    При другой реализации (через LDAP) это занимает 2 сек, но как было сказано выше не подбирает пароли к заблокированным учеткам и учетным записям с истекшим паролем. Вот кусок кода, из концовки убрал запись в БД:

    $FullFileName = ".\password.txt" 
        #Открываем файл при помощи
        $f = [System.IO.File]::OpenText($FullFileName)
        #Построчно читаем файл в цикле
        while (!$f.EndOfStream) {
        $password = $f.ReadLine()
    
        # Пробуем произвести подключение
        $Domain = "LDAP://DC=XXX,DC=XXX"
        $ds = New-Object System.DirectoryServices.DirectoryEntry($Domain,$ObjectConnection.sAMAccountName,$Password)
            
        if ($ds.name) {
            $d = "Access Success"
            Break
        }
        else {
            $d = "Access Denied"
            $password = $Null
        }}}
        if ($d -eq $null) {$d = "Account is disabled"}
    
        if ($d -eq "Access Success") {
        $msg = $objADCRes.AbsolutePosition.ToString() + " Логин: " + $ObjectConnection.sAMAccountName + "    ФИО: " + $ObjectConnection.displayName + "    Должность: " + $ObjectConnection.title + "    Доступ: " + $d}
        elseif ($d -eq "Access Denied")
        {$msg = $objADCRes.AbsolutePosition.ToString() + " Логин: " + $ObjectConnection.sAMAccountName + "    ФИО: " + $ObjectConnection.displayName + "    Должность: " + $ObjectConnection.title + "    Доступ: " + $d} 
        elseif ($d -eq "Account is disabled")
        {$msg = $objADCRes.AbsolutePosition.ToString() + " Логин: " + $ObjectConnection.sAMAccountName + "    ФИО: " + $ObjectConnection.displayName + "    Должность: " + $ObjectConnection.title + "    " + $d} 
        if ($d -eq "Access Success") { write-host $msg -foregroundcolor Green} else {write-host $msg -foregroundcolor Red}

    Может есть у кого нибудь идеи, как при помощи LDAP определять, что пароль подобран, но просрочен; пароль подобран, но учетная запись заблокирована. Или как ускорить процесс при помощи net use.

    Жду предложений.

    19 июля 2013 г. 6:54
  • Благодарю за оперативность! То что нужно!
    19 июля 2013 г. 8:16