我一直在尝试以编程方式提取 Windows 7 的 Windows 登录密码提示,我发现可以从注册表中的以下位置检索它HKLM\SAM\SAM\Domains\Account\Users\"用户密钥"\UserPasswordHint但是,我不知道有什么办法可以找到userkey
以编程方式为当前登录的用户?
如果您可以获得当前用户名,则非常容易,使用相同的注册表树。
看看HKLM\SAM\SAM\Domains\Account\Users\Names\{username}
。条目的价值将与适当的userkey
.
当然记住提示可能不存在。
EDIT
哈!搞定了!
正如您在评论中所说,包含正确值的不是节点的值,而是该节点的默认条目的类型。使用 C# 获得这种类型即使不是不可能,也是很困难的,因为这种类型不是标准的。我对这种方法有困难,所以我改变了它。
您调用的十六进制值userkey
事实上,是用户SID的最后一部分(这部分称为RID)。据我所知,每个管理员的RID = 500,每个访客= 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
)有帮助,但它更改了当前用户,并且程序失败。因此,您需要自己研究如何为感兴趣的用户运行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)