При попытке создать нового пользователя Active Directory Invoke («SetPassword», pwd) выдает «Сервер RPC недоступен» - PullRequest
2 голосов
/ 17 октября 2010

Я пытаюсь создать нового пользователя на своем сервере активных каталогов разработки, используя пространство имен .NET System.DirectoryServices.

Я пытаюсь использовать следующий код:

DirectoryEntry dirEntry = new DirectoryEntry(path, "TESTDOM\\Administrator", "2109password", AuthenticationTypes.Secure | AuthenticationTypes.ServerBind);

object o = dirEntry.NativeObject;
DirectoryEntry newUser = dirEntry.Children.Add("CN=NewUser4", "user");
newUser.Properties["samAccountName"].Value = "NewUser4";
newUser.Properties["Description"].Add("User Description");

newUser.Invoke("SetPassword",  new object[] {"2109password"} );
newUser.CommitChanges();

Я такжепопытался совершить, используя

newUser.CommitChanges();

, прежде чем я вызову Invoke для установки пароля.Я всегда получаю обертку TargetInvocationException:

InnerException {"The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)"} System.Exception {System.Runtime.InteropServices.COMException}

Исключение всегда выдается, только когда я вызываю

newUser.Invoke("SetPassword",  new object[] {"2109password"} );

Если я вызываю newUser.CommitChanges (), прежде чем пытаться вызвать Invoke с SetPassword, новый пользователь создан в домене.Затем я могу вручную перейти к машине AD и установить тот же пароль без проблем (так что это не проблема, если строка пароля противоречит правилам).Я заметил много сообщений в Интернете об этом, но не нашел решения.

Я думаю, что это может быть связано с тем фактом, что машина, на которой выполняется код, не является членом домена.Хотя пользователь TESTDOM \ Administrator является членом групп: администраторы, администраторы домена, администраторы схемы и администраторы предприятия в домене TESTDOM.

Обратите внимание, что я не могу использовать пространство имен System.DirectoryServices.AccountManagement в качестве I 'я работаю с .NET 2 Любые идеи о том, что я могу сделать, чтобы решить эту проблему?Я в отчаянии

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Полагаю, вам нужно сначала создать пользователя, прежде чем настраивать для него свойства, обычно я делаю это

/// <summary>
/// This Method will Create a new User Directory Object based on a Username and LDAP Domain
/// </summary>
/// <param name="sUserName">The Username of the New User</param>
/// <param name="sLDAPDomain">The LDAP Domain for the New User</param>
/// <returns></returns>
public DirectoryEntry CreateNewUser(string sUserName, string sLDAPDomain)
{
    //Set the LDAP qualification so that the user will be Created under the Users Container
    string LDAPDomain = "/CN=Users," + sLDAPDomain;
    oDE = new DirectoryEntry("LDAP://" + sADServer + "/" + sLDAPDomain, sADUser, sADPassword, AuthenticationTypes.Secure);

    oDEC = oDE.Children.Add("CN=" + sUserName, "user");
    oDE.Close();
    return oDEC;
}

затем установите любые свойства, которые мне нужны

/// <summary>
/// This will Set the Property of the Directory Entry Object
/// </summary>
/// <param name="oDE">The Directory Object to Set to</param>
/// <param name="sPropertyName">The Property Name</param>
/// <param name="sPropertyValue">The Property Value</param>
public void SetProperty(DirectoryEntry oDE, string sPropertyName, string sPropertyValue)
{
    //Check if the Value is Valid
    if (sPropertyValue != string.Empty)
    {
        //Check if the Property Exists
        if (oDE.Properties.Contains(sPropertyName))
        {
            oDE.Properties[sPropertyName].Value = sPropertyValue;
            oDE.CommitChanges();
            oDE.Close();
        }
        else
        {
            oDE.Properties[sPropertyName].Add(sPropertyValue);
            oDE.CommitChanges();
            oDE.Close();
        }
    }
}

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

/// <summary>
/// This Method will set the Users Password based on Directory Entry Object
/// </summary>
/// <param name="oDE">The Directory Entry to Set the New Password</param>
/// <param name="sPassword">The New Password</param>
/// <param name="sMessage">Any Messages catched by the Exception</param>
public void SetUserPassword(DirectoryEntry oDE, string sPassword, out string sMessage)
{
    try
    {
        //Set The new Password
        oDE.Invoke("SetPassword", new Object[] { sPassword });
        sMessage = "";

        oDE.CommitChanges();
        oDE.Close();
    }
    catch (Exception ex)
    {
        sMessage = ex.InnerException.Message;
    }

}

И, наконец, включить учетную запись

/// <summary>
/// This Method will Enable a User Account Based on the Directory Entry Object
/// </summary>
/// <param name="oDE">The Directoy Entry Object of the Account to Enable</param>
public void EnableUserAccount(DirectoryEntry oDE)
{
    oDE.Properties["userAccountControl"][0] = ADMethods.ADAccountOptions.UF_NORMAL_ACCOUNT;
    oDE.CommitChanges();
    oDE.Close();
}

Для полной реализации вы можете перейти сюда -> http://anyrest.wordpress.com/2010/02/01/active-directory-objects-and-c/

1 голос
/ 21 декабря 2010

ОК, у меня все заработало:

 dirEntry = new DirectoryEntry(ldapPath, domainAdminUser, domainAdminPassword);
    dirEntry.Invoke("SetPassword", new object[] { newPassword });
    dirEntry.Properties["LockOutTime"].Value = 0; //unlock account

ldapPath должен включать полный DN пользователя, которого мы пытаемся изменить, поэтому он должен выглядеть примерно так:

string ldapPath = "LDAP://ad.domain.com:389/CN=username,OU=Users,DC=ad,DC=domain,DC=com"
0 голосов
/ 17 октября 2010

Вы правы, что вам нужно сначала создать учетную запись, а затем вызвать SetPassword.Вы можете попробовать использовать Invoke SetInfo вместо CommitChanges, а затем SetPassword.

Если это не сработает, я предполагаю, что вы не устанавливаете обязательное свойство, такое как displayName.

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