Получение имени пользователя/пароля вошедшего в систему пользователя в Windows

StackOverflow https://stackoverflow.com/questions/113592

  •  02-07-2019
  •  | 
  •  

Вопрос

Есть ли какой-либо API для получения имени и пароля текущего пользователя в Windows?

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

Чтобы получить имя пользователя, вы можете использовать Получить имя пользователя или НПГетусер

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

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

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

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

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

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

Я не знаю пароля для входа в 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.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top