DirectoryEntry для изменения пароля: различное поведение между Vista / Server2008 - PullRequest
6 голосов
/ 11 апреля 2010

На компьютере с операционной системой Vista я успешно использовал этот код для смены пароля пользователя «Администратор»:

directoryEntry.Invoke("SetPassword", "new");

Когда я переместил его на мой компьютер с Server 2008, этот код не работал, и я был вынужден использовать следующий код:

directoryEntry.Invoke("ChangePassword", new object[] { "old", "new" });

Мой вопрос, почему?

В обоих случаях я создал свой объект DirectoryEntry следующим образом:

DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username));

Спасибо! 8)

Если вы, ребята, сочтете это полезным, вот настоящий код.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.DirectoryServices;
using System.Security.Principal;

namespace AccountMod
{
   class Program
   {
        static void Main()
        {
           Console.WriteLine("Attempting reset...\n");
           try
           {
               String machineNameAndUser =    WindowsIdentity.GetCurrent().Name.ToString();
               String machineName =    WindowsIdentity.GetCurrent().Name.ToString().Substring(0,    machineNameAndUser.IndexOf('\\'));
            Console.WriteLine("Computer's name: " + machineName);
            ResetPassword(machineName, "Administrator", "new");
            //ChangePassword("Administrator", "current", "new");                      Console.WriteLine("Finished...");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine(e.InnerException);
            }
            Console.ReadKey();

        }

        public static void ResetPassword(string computerName, string username, string newPassword)
        {
            DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username));
            directoryEntry.Invoke("SetPassword", newPassword);
            //directoryEntry.Invoke("ChangePassword", new object[] { "current", "new" });
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 11 апреля 2010

Вы (или не могли бы вы перейти на) .NET 3.5? Интеграция AD для пользователей, групп, компьютеров была значительно улучшена в .NET 3.5 - подробности см. В статье MSDN Управление принципами безопасности каталогов в .NET Framework 3.5 .

В вашем случае вы можете сделать что-то вроде:

// establish context for local machine
PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

// find the "Administrator" account
UserPrincipal admin = UserPrincipal.FindByIdentity(ctx, "Administrator");

// set the password to a new value
admin.SetPassword("new-top-secret-password");
admin.Save();

и все готово! Поставщик WinNT: очень ограничен в своих возможностях, и его следует избегать, если это возможно.

0 голосов
/ 01 февраля 2013

Проверьте свойства пользователя, для которого вы хотите установить пароль, если

пользователь не может сменить пароль

свойство проверяется, затем вы не можете установить пароль с помощью directoryEntry.Invoke("SetPassword", "new"); Использовать учетные данные администратора при создании объекта DirectoryEntry или снимите флажок "пользователь не может изменить пароль"

...