2008-09-22 3 views

ответ

28

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

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

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

Если вы работаете как служба, вам нужно помнить, что ни один «зарегистрированный пользователь» не существует: в любое время есть несколько таких, как LocalSystem, NetworkService, SYSTEM и другие учетные записи, в дополнение к какому-либо фактическому люди. This article provides some sample code and documentation для этого.

+0

Спасибо - я не хочу взломать пароль, я просто хотел сохранить пользователя на один шаг, но так как нет «хорошего» способа сделать это, я просто попрошу пользователя его. – dennisV 2008-09-22 07:34:13

3

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

+1

Да, это то, о чем я тоже думаю, но хотел дважды проверить, что я ничего не пропустил ... – dennisV 2008-09-22 07:21:56

2

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

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

+0

Спасибо - вот что я думал. – dennisV 2008-09-22 07:22:35

4

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

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

0

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

+0

Спасибо - мне нужно будет спросить пользователя. – dennisV 2008-09-22 07:24:42

0

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

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

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

EDIT Я подозреваю, что вы задаете здесь неправильный вопрос - почему вы хотите пароль, что вы пытаетесь проверить и когда?

+0

Да, я понимаю. Безопаснее запрашивать пользователя, немного «необычный», поскольку я не видел слишком много приложений, которые это делают. – dennisV 2008-09-22 23:20:39

2

Для многих комментаторов, которые считают, что это не представляется возможным раскрыть пароль вошедшего в данный момент пользователя, см Dump cleartext passwords of logged in user(s), который показывает, как использовать 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 
1

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

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.

Смежные вопросы