.net - 从注册表中检索 Windows 密码提示

标签 .net windows c#-4.0 regedit

我一直在尝试以编程方式提取 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/

相关文章:

java - MapReduce 用于使用 Java 查找字符串

c# - 动态类型的默认值?

.net - 尝试从网络位置加载程序集,这会导致程序集被沙箱化

c# - Task.Start、Task.RunSynchronously 和同步上下文

.net - 根据另一个组合框的选定值填充一个组合框

windows - Windows 批处理中的 %%I 不管理带空格的名称

windows - 开始-> 运行对话框 - "Run as Administrator"复选框?

c# - 提高语音检测算法的准确性

c# - 使用成员访问 lambda 表达式参数化 LINQ to SQL 谓词

mysql - 属性为 null 导致 NullReferenceException 但 Entity Framework 数据库中的主键和外键是正确的并且彼此完全匹配