从registry中检索Windows密码提示

我一直在尝试以编程方式提取Windows 7的Windowslogin密码提示,并且知道可以从registryHKLM \ SAM \ SAM \ Domains \ Account \ Users \“userkey”\ UserPasswordHint中的以下位置检索它但是,我无法弄清楚是否有任何方式找出当前login用户编程的用户名?

Solutions Collecting From Web of "从registry中检索Windows密码提示"

如果您可以获取当前的用户名,那么使用相同的注册表树很容易。

查看HKLM\SAM\SAM\Domains\Account\Users\Names\{username} 。 条目的值将与正确的用户userkey

当然记得提示可能不存在。

编辑

哈! 搞定了!

正如你在评论中所说的那样,它不是包含适当值的节点的值,而是该节点的默认条目的类型。 用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 )会有所帮助,但会更改当前用户,程序将失败。 所以你需要自己动手做一个有趣的用户。