Получение имени пользователя / пароля вошедшего в систему пользователя в Windows - PullRequest
9 голосов
/ 22 сентября 2008

Существует ли какой-либо API, чтобы получить имя пользователя и пароль для входа в систему в Windows?

Заранее спасибо.

Ответы [ 10 ]

29 голосов
/ 22 сентября 2008

Пароль: Нет, это не сохраняется из соображений безопасности - оно используется, а затем удаляется. Вы можете получить зашифрованный пароль для этого пользователя из реестра, получив достаточные привилегии, а затем расшифровать его, используя что-то вроде радужные таблицы , но это чрезвычайно ресурсоемко и требует много времени с использованием современных методов. Гораздо лучше подсказать пользователю.

В качестве альтернативы, если вы хотите внедрить какую-то систему «единого входа», как это делает Novell, вам следует сделать это либо через GINA (до Vista), либо через поставщик учетных данных (Vista), что приведет к тому, что ваш код учитывая имя пользователя и пароль при входе в систему, единственный раз, когда пароль доступен.

Для имени пользователя получить текущее имя пользователя (того, кто запускает ваш код) очень просто: функция GetUserName в AdvApi32.dll делает именно это для вас.

Если вы работаете в качестве службы, вы должны помнить, что нет ни одного "вошедшего в систему пользователя": в любое время их несколько, например LocalSystem, NetworkService, SYSTEM и другие учетные записи, в дополнение к любым действительным людям , В этой статье приведен пример кода и документация для этого.

4 голосов
/ 25 июля 2015

Для многих комментаторов, которые считают, что невозможно раскрыть пароль текущего пользователя, вошедшего в систему, см. Сброс паролей открытого текста зарегистрированных пользователей (ей) , который показывает, как использовать mimikatz чтобы сделать это:

mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK

mimikatz # sekurlsa::logonPasswords full
...
Utilisateur principal       : user
Domaine d'authentification  : domain
        kerberos :
         * Utilisateur  : user
         * Domaine      : domain
         * Mot de passe : pass
4 голосов
/ 22 сентября 2008

Обратите внимание, как это делается, но инструмент "Восстановление сетевого пароля" из http://www.nirsoft.net/utils/network_password_recovery.html, кажется, получает пароль из некоторого кэша.

4 голосов
/ 22 сентября 2008

Вы не можете получить пароль пользователя, поскольку он зашифрован (не говоря уже о том, что это обычная практика - не хранить пароли в открытом тексте).

Для получения имени пользователя вы можете использовать GetUserName или NPGetUser

3 голосов
/ 22 сентября 2008

Я бы посчитал это огромным недостатком безопасности, если бы это было возможно!

2 голосов
/ 22 сентября 2008

Полную информацию об аутентификации в Windows API можно найти на MSDN: http://msdn.microsoft.com/en-us/library/aa374735(VS.85).aspx

2 голосов
/ 22 сентября 2008

GetUserName даст вам имя, но пароль, который вы не можете получить. Это даже не то, что хранит Windows, AFAIK - только хэш вашего пароля.

В зависимости от того, чего вы пытаетесь достичь (вы можете рассказать нам немного больше ...), вы можете выдать себя за зарегистрированного пользователя и делать что-то от его / ее имени.

1 голос
/ 26 июля 2016

Я не знаю о пароле входа в Windows ... но вы определенно можете получить пароли в виде открытого текста из диспетчера учетных данных. Например, вот программа для получения пароля для TFS. В большинстве случаев это то же самое, что и для входа в Windows.

namespace ShowPassword
{
    using Microsoft.TeamFoundation.Client;
    using System;
    using System.Net;

    class Program
    {
        static void Main(string[] args)
        {
            var tpc = new TfsTeamProjectCollection(new Uri("http://mycompany.com/tfs"));
            var nc = tpc.Credentials as NetworkCredential;
            Console.WriteLine("the password is " + nc.Password);
        }
    }
}

Я скомпилировал это как «консольное» приложение в версии 2015 с пакетом Nuget TeamFoundation ExtendedClient.

0 голосов
/ 22 сентября 2008

re "Восстановление пароля сети"
Windows (до XP) хранит копию passwd с более простым, легко взломанным шифрованием - для подключения к сетевым ресурсам lanmanager более старого стиля. Инструменты обычно пробуют все возможные пароли против этого, используя радужные таблицы (предварительно вычисленные зашифрованные версии словарных слов), ускоряет это.

В XPsp2 / 3 Vista эта функция удалена. Новое шифрование намного сложнее взломать, и ему нужно много часов, чтобы проверить все возможные значения, есть онлайн-сервисы, которые будут запускать его на большом количестве компьютеров, чтобы дать вам быстрый ответ за цену.

Чтобы ответить на оригинальный постер, вы обычно не сохраняете пароль и не сравниваете его с тем, что набрал пользователь. Вы шифруете (фактически хэшируете) введенный пароль и сохраняете его. Чтобы проверить пароль, вы выполняете одно и то же шифрование для всего, что вводил пользователь, и сравниваете его. Обычно невозможно перейти от зашифрованной формы к реальному паролю.

РЕДАКТИРОВАТЬ Я подозреваю, что вы задаете здесь неправильный вопрос - зачем вам пароль, что вы пытаетесь проверить и когда?

0 голосов
/ 22 сентября 2008

Вы можете получить имя пользователя с помощью GetUserName (), но вы не можете получить пароль; это нарушило бы безопасность для чайников 101.

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