Как проверить, что у пользователя Windows установлен пароль? - PullRequest
9 голосов
/ 02 июля 2011

Вопрос

Я не знал, что это будет трудно понять, но вот я здесь.

Я разрабатываю клиента поддержки сети, который имеетопределить, есть ли у текущего вошедшего в систему пользователя установлен пароль.Я попробовал это с 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 ]

7 голосов
/ 02 июля 2011

Почему бы просто не попробовать LogonUser с пустым паролем?

2 голосов
/ 31 мая 2018

Попробуйте сменить пароль с пустым паролем, в случае успеха это означает, что пользователь не установил пароль.Предположим, что пользователь домена и учетная запись Microsoft всегда защищены паролем.Для учетной записи Microsoft будет выброшено исключение PrincipalOperationException.Для локального пользователя, если установлен пароль, он выдаст исключение PasswordException. Ссылка на скрипт VB , c # сменить пароль

        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;
        }
1 голос
/ 02 июля 2011

Из того, что я могу найти, Windows не хранит текстовую версию пароля пользователя.Windows хранит копию, которая была защищена односторонним шифрованием.Дополнительную информацию о входе пользователя в систему Windows можно найти в документации MSDN о функции LSALogonUser.Это не поможет вам получить пароль пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...