【问题标题】:How to check if windows user has a password set?如何检查windows用户是否设置了密码?
【发布时间】:2011-07-02 10:56:17
【问题描述】:

问题

我不知道要弄清楚会这么难,但我在这里。

我正在开发一个网络支持客户端,它必须检测当前登录的用户是否设置了密码。我尝试使用 WMI 检查Win32_UserAccount 类中的PasswordRequired 属性,但即使我的帐户密码保护,它也会返回false。我没有想法......

(背景:我需要此信息来告诉用户他必须设置一个,以便我可以通过远程桌面连接到他,如果帐户“不受保护”,这不是很高兴。如果有办法获得围绕这个我也接受不同的解决方案。)

此致
奈法瑞斯

解决方案

比我想象的要容易,我使用 WinAPI 函数 LogonUser 管理它,并为您提供这个简单的包装代码:

    private bool PasswordRequired
    {
        get
        {
            IntPtr phToken;

            // http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html
            bool loggedIn = LogonUser(Environment.UserName,
                null,
                "",
                (int)LogonType.LOGON32_LOGON_INTERACTIVE,
                (int)LogonProvider.LOGON32_PROVIDER_DEFAULT,
                out phToken);

            int error = Marshal.GetLastWin32Error();

            if (phToken != IntPtr.Zero)
                // http://www.pinvoke.net/default.aspx/kernel32/CloseHandle.html
                CloseHandle(phToken);

            // 1327 = empty password
            if (loggedIn || error == 1327)
                return false;
            else
                return true;
        }
    }

这正是我所需要的,感谢大家快速而有能力的回答,我永远可以信赖你们! =)

【问题讨论】:

  • 嗨 Nefarius,我认为这将是一种奇怪的解决问题的方法。也许您可以简单地检测帐户是否处于活动状态(例如未禁用) - 但确定密码是否设置确实是不可能的,这将允许其他人获取密码信息......您可能还想检查任何密码策略系统...
  • 这是针对您自己的域/工作网络的吗?
  • 是的,是的。我会将我的工具以存档文件的形式发送给有问题的人,他只需启动它,它就会为传入的终端服务器连接请求做好系统准备。
  • 1327 is ERROR_ACCOUNT_RESTRICTION, documented as "帐户限制阻止此用户登录。例如:不允许使用空白密码、限制登录时间或已受到政策限制强制执行。”似乎除了空白密码之外还有其他情况会产生此错误代码,但很难知道它们是什么。

标签: c# wmi


【解决方案1】:

为什么不尝试使用空密码登录用户?

【讨论】:

  • 我选择了这个并在我的第一篇文章中发布了解决方案,再次感谢您!
【解决方案2】:

尝试使用空密码更改密码,如果成功,则表示用户未设置密码。假设域用户和 Microsoft 帐户始终受密码保护。对于 Microsoft 帐户,它会抛出 PrincipalOperationException。对于本地用户,如果设置了密码,则会抛出 PasswordException。 VB script reference, c# change password

        try
        {
            using (var context = new PrincipalContext(ContextType.Machine))
            {
                var user = UserPrincipal.FindByIdentity(context, userName);
                if (null == user)
                {
                    //not local user, password required
                    passwordRequired = true;
                }
                else
                {
                    user.ChangePassword("", "");
                }
            }
        }
        catch (PasswordException)
        {
            //local user password required
            passwordRequired = true;
        }
        catch (PrincipalOperationException)
        {
            //for Microsoft account, password required
            passwordRequired = true;
        }

【讨论】:

    【解决方案3】:

    据我所知,Windows 不存储用户密码的明文版本。 Windows 存储已使用单向加密保护的副本。您可以在 LSALogonUser 函数的MSDN documentation 中找到有关将用户登录到 Windows 的更多信息。它不能帮助您获取用户密码

    【讨论】:

    • 我知道,我不需要/不需要明文密码,只需检查是否设置了。
    • 抱歉,当我发布答案时,我意识到这对其他人来说是一个很好的参考,并且 LogonUser 很可能会完成您正在寻找的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2011-04-23
    • 2011-10-28
    • 2011-04-17
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多