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

提前谢谢。

有帮助吗?

解决方案

密码:不,出于安全原因,这不会被保留 - 它被使用,然后被丢弃。如果有足够的权限,您可以从注册表中检索此用户的加密密码,然后使用彩虹表等解密密码,但使用当前方法,这是非常耗费资源和耗时的。提醒用户好多了。

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

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

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

其他提示

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

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

要获取用户名,您可以使用 GetUserName 或< a href =“http://msdn.microsoft.com/en-us/library/aa378803(VS.85).aspx”rel =“nofollow noreferrer”> NPGetUser

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

对于认为无法透露当前登录用户密码的众多评论者,请参阅转储登录用户的明文密码,其中显示了如何使用 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

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

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

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

我不知道windows登录密码...但你绝对可以从Credentials Manager中提取明文密码。例如,这是一个拉取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下的应用程序。

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top