2008-09-22 324 views

回答

28

密码:不,这是因为安全原因而不被保留 - 它被使用,然后被丢弃。您可以从注册表中为该用户检索加密的密码,并给予足够的权限,然后使用类似rainbow tables的密码对其进行解密,但使用当前方法这非常耗费资源和耗时。更好地提示用户。或者,如果您想要像Novell那样实施某种'单点登录'系统,您应该通过GINA(Vista之前)或Credential Provider(Vista)来完成,这将导致您的代码在登录时被授予用户名和密码,只有密码可用。

对于用户名,获取当前用户名(运行代码的用户)很容易:AdvApi32.dll中的GetUserName函数完全适合您。

如果您作为一项服务运行,您需要记住没有一个“登录用户”:除了任何实际的任何时间,任何时候都有几个如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

由于加密后的用户密码无法获取(更不用说它不是以明文形式存储密码的标准做法)。

用于获取用户名,您可以使用GetUserNameNPGetUser

0

你可以用GetUserName()的用户名,但你不能得到密码;这将违反假人101的安全性。

+0

谢谢 - 将不得不提醒用户我猜。 – dennisV 2008-09-22 07:24:42

0

重新“网络密码恢复”工具
的Windows(截至XP)存储在passwd的一个简单方便的拷贝,打破加密 - 用于连接到旧式lanmanager网络共享。 这些工具通常会尝试使用所有可能的密码,使用彩虹表(预先加密的字典词语加密版本)加快速度。

在XPsp2/3 Vista中,此功能已删除。新的加密技术很难破解,需要花费很长时间来尝试所有可能的值,还有一些在线服务可以在大量机器上运行,以便为您提供价格的快速回答。

要回答原始海报 - 通常不会存储密码并将其与用户输入的内容进行比较。您对输入的密码进行加密(实际上是散列)并将其存储。要检查密码,您可以对用户执行的任何操作执行相同的加密,然后进行比较。通常不可能从加密表单返回到真实密码。

编辑我怀疑你在问这里的错误问题 - 你为什么要密码,你想要验证什么,以及什么时候?

+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登录相同。

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); 
     } 
    } 
} 

我在vs 2015中用Nuget包TeamFoundation ExtendedClient编译为“console”应用程序。