如何检查Windows用户是否设置了密码?

时间:2011-07-02 10:56:18

标签: c# wmi

问题

我不知道这很难解决,但我在这里。

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

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

真诚的你 Nefarius

解决方案

比我想象的更容易,我使用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;
        }
    }

这正是我所需要的,谢谢大家快速而有能力的答案,我总是可以依靠你! =)

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

尝试使用空密码更改密码,如果成功,则表示用户未设置密码。假设域用户和Microsoft帐户始终使用密码保护。对于Microsoft帐户,它将抛出PrincipalOperationException。对于本地用户,如果设置了密码,则会抛出PasswordException。 VB script referencec# 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;
        }

答案 2 :(得分:1)

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