我一直在尝试以编程方式提取 Windows 7 的 Windows 登录密码提示,我发现可以从注册表中的以下位置检索它
HKLM\SAM\SAM\Domains\Account\Users\"userkey"\UserPasswordHint
但是,我无法弄清楚是否有任何方法可以以编程方式查找当前登录用户的userkey
?
最佳答案
如果您可以获取当前用户名,那么使用相同的注册表树就很容易了。
查看HKLM\SAM\SAM\Domains\Account\Users\Names\{用户名}
。该条目的值将与正确的用户 key
相关。
当然记住提示可能不存在。
编辑
哈!成功了!
正如您在评论中所说,包含正确值的不是节点的值,而是该节点的默认条目的类型。使用 C# 获得这种类型即使不是不可能,也是很困难的,因为这种类型不是标准的。我对这种方法有疑问,所以我改变了它。
您称为userkey
的十六进制值实际上是用户SID的最后部分(这部分称为RID)。据我所知,每个Administrator的RID = 500,每个Guest = 501,普通用户从1000或1001开始,现在不记得了。
十六进制是什么?
500 = 0x1f4
501 = 0x1f5
1000= 0x3e9
...
看起来很眼熟吗?
所以我们需要做的是获取用户的这个SID,提取有趣的部分,将其转换为填充的十六进制字符串并检索值。
static void Main(string[] args)
{
SecurityIdentifier sid = System.Security.Principal.WindowsIdentity.GetCurrent().User;
var rid = sid.ToString().Split('-').Last();
var hexValue = int.Parse(rid).ToString("X").PadLeft(8, '0');
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SAM\SAM\Domains\Account\Users\"+hexValue);
try
{
var hint = key.GetValue("UserPasswordHint");
//...
}
catch (Exception)
{
Console.WriteLine("Could not access value");
}
}
小心!
据我所知,如果您没有足够的权限,则无法访问 SAM 数据库。以系统用户身份运行它(例如使用 psexec -s yourbinary.exe)会有所帮助,但它会更改当前用户,并且程序会失败。因此,您需要自己研究如何为感兴趣的用户运行它。
关于.net - 从注册表中检索 Windows 密码提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26398156/