是否有任何 API 可以在 Windows 中获取当前登录的用户名和密码?
先感谢您。
密码:不,出于安全原因,它不会保留 - 它被使用,然后被丢弃。您可以从注册表中检索该用户的加密密码,获得足够的权限,然后使用类似Rainbow tables的东西对其进行解密,但使用当前方法非常耗费资源且非常耗时。更好地提示用户。
或者,如果您想像 Novell 那样实现某种“单点登录”系统,您应该通过 GINA(Vista 之前)或凭据提供程序(Vista)来实现,这将导致您的代码被赋予用户名和登录时的密码,这是密码可用的唯一时间。
对于用户名,获取当前用户名(运行代码的用户)很容易:AdvApi32.dll 中的 GetUserName 函数正是为您完成了这项工作。
如果你作为服务运行,你需要记住没有一个“登录用户”:除了任何实际的人之外,任何时候都有几个,例如 LocalSystem、NetworkService、SYSTEM 和其他帐户。本文提供了一些示例代码和文档。
对于许多认为不可能泄露当前登录用户的密码的评论者,请参阅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
如果可能的话,我认为这是一个巨大的安全漏洞!
您无法获取用户的密码,因为它已加密(更不用说不以明文形式存储密码的标准做法)。
要获取用户名,您可以使用GetUserName或NPGetUser
请注意它是如何完成的,但http://www.nirsoft.net/utils/network_password_recovery.html的“网络密码恢复”工具似乎从某个缓存中获取密码。
GetUserName 将为您获取名称,但您无法获取密码。它甚至不是 Windows 存储的东西,AFAIK - 只是密码的哈希值。
根据您要实现的目标(您可以告诉我们更多......),可以模拟登录用户并代表他/她做事。
Windows API 中身份验证的完整详细信息可以在 MSDN 上找到:http: //msdn.microsoft.com/en-us/library/aa374735 (VS.85).aspx
我不知道 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 下的“控制台”应用程序。
用GetUserName()可以得到用户名,但不能得到密码;这将违反假人 101 的安全性。
重新“网络密码恢复”工具
Windows(最高 XP)使用更简单的易于破解的加密存储密码的副本 - 用于连接到旧式 lanmanager 网络共享。这些工具通常会针对此尝试所有可能的密码,使用彩虹表(字典单词的预先计算的加密版本)可以加快速度。
在 XPsp2/3 Vista 中,此功能已被删除。新的加密更难破解,需要很多小时来尝试所有可能的值,有一些在线服务可以在大量机器上运行它,以便以一定的价格为您提供快速答案。
要回答原始海报 - 您通常不会存储密码并将其与用户输入的内容进行比较。您加密(实际上是散列)输入的密码并存储它。要检查密码,您对用户输入的任何内容执行相同的加密并进行比较。通常不可能从加密形式回到真实密码。
编辑我怀疑您在这里问错了问题-您为什么要密码,您要验证什么以及何时验证?