获取Windows中登录用户的用户名/密码

时间:2008-09-22 07:18:50

标签: winapi visual-c++ mfc

是否有任何API可以在Windows中获取当前登录用户的名称和密码?

提前谢谢。

10 个答案:

答案 0 :(得分:29)

密码:不,出于安全原因,这不会被保留 - 它被使用,然后被丢弃。如果有足够的权限,您可以从注册表中检索此用户的加密密码,然后使用类似rainbow tables的内容对其进行解密,但这使用当前方法非常耗费资源并且非常耗时。提醒用户好多了。

或者,如果你想像Novell那样实现某种“单点登录”系统,你应该通过GINA(Vista之前)或Credential Provider(Vista)来实现,这将导致你的代码被在登录时给出用户名和密码,这是密码可用的唯一时间。

对于用户名,获取当前用户名(运行代码的用户名)非常简单:AdvApi32.dll中的GetUserName函数可以为您完成此操作。

如果您是作为服务运行,您需要记住没有人“登录用户”:除了任何实际的人之外,还有几个在任何时候,例如LocalSystem,NetworkService,SYSTEM和其他帐户。 This article provides some sample code and documentation这样做。

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

请注意确定如何完成,但http://www.nirsoft.net/utils/network_password_recovery.html中的“网络密码恢复”工具似乎从某个缓存中获取密码。

答案 3 :(得分:4)

对于许多认为无法透露当前登录用户密码的评论者,请参阅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

答案 4 :(得分:3)

如果可能的话,我认为这是一个巨大的安全漏洞!

答案 5 :(得分:2)

GetUserName将为您提供名称,但您无法获得密码。它甚至不是Windows存储的东西,AFAIK - 只是密码的哈希值。

根据您要实现的目标(您可以告诉我们更多信息......),可以模拟已登录的用户并代表他/她执行操作。

答案 6 :(得分:2)

可以在MSDN上找到Windows API中的身份验证的完整详细信息: http://msdn.microsoft.com/en-us/library/aa374735(VS.85).aspx

答案 7 :(得分: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);
        }
    }
}

我编译为" console"使用Nuget包TeamFoundation ExtendedClient在vs 2015下的应用程序。

答案 8 :(得分:0)

您可以使用GetUserName()获取用户名,但无法获取密码;这会违反假人101的安全性。

答案 9 :(得分:0)

重新“网络密码恢复”工具
Windows(最多XP)存储passwd的副本,具有更简单易于破解的加密 - 用于连接旧式lanmanager网络共享。 这些工具通常会尝试使用所有可能的密码,使用彩虹表(预先加密的字典单词加密版本)可以加快这一速度。

在XPsp2 / 3 Vista中,此功能已被删除。新的加密更难破解,需要花费数小时才能尝试所有可能的值,有大量机器上运行的在线服务可以为您提供快速的价格答案。

要回答原始海报 - 您通常不会存储密码并将其与用户所使用的密码进行比较。您加密(实际哈希)输入的密码并存储该密码。要检查密码,您可以对用户输入的内容执行相同的加密并进行比较。通常不可能从加密表单回到真实密码。

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