2 Stimmen

Beim Versuch, einen neuen Active Directory-Benutzer zu erstellen, wird bei Invoke("SetPassword",pwd) die Meldung "The RPC server is unavailable" ausgegeben.

Ich versuche, einen neuen Benutzer auf meiner Entwicklung Active Directory Server mit .NET System.DirectoryServices-Namespace zu erstellen.

Ich versuche es mit folgendem Code:

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();

Ich habe auch versucht, mit

newUser.CommitChanges();

bevor ich Invoke aufrufe, um das Kennwort festzulegen. Ich erhalte immer eine TargetInvocationException Wrapping:

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

Die Ausnahme wird immer nur dann ausgelöst, wenn ich die

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

Wenn ich newUser.CommitChanges() aufrufe, bevor ich versuche, Invoke mit SetPassword aufzurufen, wird der neue Benutzer in der Domäne erstellt. Ich kann dann manuell zum AD-Rechner gehen und das gleiche Kennwort ohne Probleme festlegen (es ist also kein Problem mit der Kennwortzeichenfolge, die gegen die Regeln verstößt). Ich habe im Internet viele Beiträge zu diesem Thema gelesen, aber keine Lösung gefunden.

Ich denke, es könnte etwas damit zu tun haben, dass der Rechner, auf dem der Code ausgeführt wird, kein Mitglied der Domäne ist. Obwohl der Benutzer TESTDOM \Administrator ist Mitglied der Gruppen: Administratoren, Domänenadministratoren, Schemaadministratoren und Unternehmensadministratoren in der TESTDOM-Domäne.

Beachten Sie, dass ich nicht System.DirectoryServices.AccountManagement Namespace verwenden können, wie ich mit .NET 2 arbeiten Haben Sie eine Idee, was ich tun kann, um dieses Problem zu lösen? Ich bin verzweifelt

1voto

Raymund Punkte 7399

Ich vermute, dass Sie den Benutzer zuerst erstellen müssen, bevor Sie ihm Eigenschaften zuweisen können, ich mache das normalerweise mit

/// <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;
}

dann alle benötigten Eigenschaften einstellen

/// <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();
        }
    }
}

dann das Passwort festlegen

/// <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;
    }

}

Und schließlich aktivieren Sie das Konto

/// <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();
}

Eine vollständige Umsetzung können Sie hier sehen -> http://anyrest.wordpress.com/2010/02/01/active-directory-objects-and-c/

1voto

polo Punkte 1173

OK, ich habe es zum Laufen gebracht:

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

ldapPath sollte den vollständigen DN des Benutzers enthalten, den wir zu ändern versuchen, also sollte er etwa so aussehen:

string ldapPath = "LDAP://ad.domain.com:389/CN=username,OU=Users,DC=ad,DC=domain,DC=com"

0voto

Remko Punkte 6724

Sie haben Recht, dass Sie zuerst das Konto erstellen und dann SetPassword aufrufen müssen. Sie können versuchen, Invoke SetInfo anstelle von CommitChanges und dann SetPassword zu verwenden.

Wenn das nicht funktioniert, ist meine Vermutung, dass Sie eine erforderliche Eigenschaft wie displayName nicht einstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X