Неизвестная ошибка (0x80005000) при попытке установить пароль учетной записи локального компьютера - PullRequest
3 голосов
/ 09 марта 2012

Я пишу приложение csharp для Windows Form, которое пытается проверить наличие локальной учетной записи и, если найден, установить пароль для нее. Пара ключевых моментов:

  • Я делаю это для локальных учетных записей, а не для учетных записей Active Directory. Машины не являются членами домена Windows AD.

  • Я ДОЛЖЕН использовать setpassword, а не changepassword, поскольку для изменения пароля требуется, чтобы вы знали предыдущий пароль, чего в некоторых случаях я не знаю. Setpassword должен позволять вам выбрать новый пароль без необходимости знать старый

  • Приложение будет запускаться примерно 50 пользователями, использующими различные ОС от Windows XP до Windows Server 2008 R2. Поскольку я не могу предсказать, какая операционная система и версия .net будут доступны, я установил целевую платформу как .net 2.0.

  • В настоящее время я ожидаю, что мой пользователь будет работать от имени администратора, поэтому я не считаю, что разрешения - это проблема. Я могу создавать приложения просто отлично, я просто не могу установить пароль для существующей учетной записи.

Вот мой код:

    public void VerifiyAccount()
    {
        String username = "specialaccount";
        String password = "SuperSecretPassw0rd!";

        if (CheckIfAccountExists(username))
        {
            MessageBox.Show("User Account all ready exists.");
            SetUserPassword(password);

        }
        else
        {
            MessageBox.Show("User Account does not exist");
            CreateUserAccount(username, password);
        }
    }

    public void SetUserPassword(string newPassword)
    {
        try
        {
            DirectoryEntry hostMachineDirectory = new DirectoryEntry("WinNT://" + Environment.MachineName + ", specialaccount");
            hostMachineDirectory.Invoke("SetPassword", newPassword);
            hostMachineDirectory.CommitChanges();
            hostMachineDirectory.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }

Вот ошибка, которую я получаю:


Неизвестная ошибка (0x80005000)

OK

Я не могу понять, почему я получаю вышеуказанную ошибку, и, несмотря на поиск в Google и поиск переполнения стека, я не могу найти никакого объяснения. Большинство примеров, которые я могу найти, связаны с подключением к Active Directory, а не с локальными учетными записями. Или используете новые возможности .net 4.0. Я должен верить, что если я смогу создать учетную запись, я смогу установить пароль для учетной записи. Любые идеи или предложения о том, что я могу делать не так?

Спасибо Бред

1 Ответ

2 голосов
/ 09 марта 2012

Я столкнулся с подобными запутанными ошибками при использовании библиотек ActiveDirectory.То, что я нашел очень полезным, - это использование Microsoft Network Monitor для отслеживания сообщений, отправляемых в / из LDAP.Обычно сообщение об ошибке, отправляемое обратно, содержит гораздо больше подробностей.

РЕДАКТИРОВАТЬ : я бы порекомендовал следующее, чтобы помочь отладить проблемы со связью:

  • Установите точку остановаи запустите ваше приложение там, где вы CommitChanges
  • запустите сетевой монитор Microsoft (запустите захват)
  • выполните CommitChanges строку
  • остановите текущий захватв Microsoft Network Monitor

На этом этапе вы можете прокручивать сообщения, чтобы увидеть, где произошли ваши звонки.

EDIT2 : Вот ссылка на DirectoryEntry.Path .Он показывает форматирование WinNT для подключения к пользователю в виде:

WinNT: // <имя домена> / <имя компьютера> / <имя пользователя>

...