10

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

先感谢您。

4

10 回答 10

30

密码:不,出于安全原因,它不会保留 - 它被使用,然后被丢弃。您可以从注册表中检索该用户的加密密码,获得足够的权限,然后使用类似Rainbow tables的东西对其进行解密,但使用当前方法非常耗费资源且非常耗时。更好地提示用户。

或者,如果您想像 Novell 那样实现某种“单点登录”系统,您应该通过 GINA(Vista 之前)或凭据提供程序(Vista)来实现,这将导致您的代码被赋予用户名和登录时的密码,这是密码可用的唯一时间。

对于用户名,获取当前用户名(运行代码的用户)很容易:AdvApi32.dll 中的 GetUserName 函数正是为您完成了这项工作。

如果你作为服务运行,你需要记住没有一个“登录用户”:除了任何实际的人之外,任何时候都有几个,例如 LocalSystem、NetworkService、SYSTEM 和其他帐户。本文提供了一些示例代码和文档

于 2008-09-22T07:29:41.427 回答
5

对于许多认为不可能泄露当前登录用户的密码的评论者,请参阅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
于 2015-07-25T19:39:20.400 回答
4

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

于 2008-09-22T07:21:25.923 回答
4

您无法获取用户的密码,因为它已加密(更不用说不以明文形式存储密码的标准做法)。

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

于 2008-09-22T07:22:16.903 回答
4

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

于 2008-09-22T07:29:43.063 回答
2

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

根据您要实现的目标(您可以告诉我们更多......),可以模拟登录用户并代表他/她做事。

于 2008-09-22T07:22:01.427 回答
2

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

于 2008-09-22T07:30:43.763 回答
2

我不知道 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);
        }
    }
}

我使用 Nuget 包 TeamFoundation ExtendedClient 将其编译为 vs 2015 下的“控制台”应用程序。

于 2016-07-26T20:25:38.913 回答
0

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

于 2008-09-22T07:23:07.540 回答
0

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

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

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

编辑我怀疑您在这里问错了问题-您为什么要密码,您要验证什么以及何时验证?

于 2008-09-22T15:58:53.340 回答