7
votes

Déterminer le contrôleur de domaine actuel par programme

Je dois interroger le contrôleur de domaine actuel, probablement primaire pour modifier le mot de passe de l'utilisateur.

(p) Nom CC doit être complètement qualifié, c'est-à-dire qualifié, c'est-à-dire dc = pdc, dc = exemple, dc = com (Comment nommer correctement cette notation?)

Comment peut-il être fait en utilisant c #?


0 commentaires

4 Réponses :


2
votes

(nécessite system.directoryservices.accountmanagement.dll): xxx


1 commentaires

Cela ne fonctionnera pas pour une situation croisée (par exemple, votre machine ne fait pas partie du domaine où le contrôleur de domaine existe). Voir ma réponse pour une telle solution.



0
votes

Si vous souhaitez interagir l'Active Directory, vous ne devriez pas avoir à savoir où FSMO Les rôles sont pour la plupart. Si vous souhaitez modifier la topologie de votre programme de votre programme (je ne le ferais pas), regardez le domaineController classe.

Si vous souhaitez modifier un mot de passe de l'utilisateur, vous pouvez appeler ces actions sur l'objet utilisateur et Active Directory s'assurera que les modifications sont correctement. répliqué.

copié de http: // www.rootsilver.com/2007/08/how-to-change-a-user-password xxx


1 commentaires

Comment pensez-vous, puis-je changer mon mot de passe actuel en utilisant mon propre nom d'utilisateur et mon mot de passe actuel?



2
votes

Nous utilisons quelque chose comme ceci pour nos applications internes.

devrait renvoyer quelque chose comme dc = d, dc = r, dc = abc, dc = com code> p>

public static string RetrieveRootDseDefaultNamingContext()
{
    String RootDsePath = "LDAP://RootDSE";
    const string DefaultNamingContextPropertyName = "defaultNamingContext";

    DirectoryEntry rootDse = new DirectoryEntry(RootDsePath)
    {
        AuthenticationType = AuthenticationTypes.Secure;
    };
    object propertyValue = rootDse.Properties[DefaultNamingContextPropertyName].Value;

    return propertyValue != null ? propertyValue.ToString() : null;
}


3 commentaires

Oui tu as raison. Nous avons normalement un code de journalisation personnalisé dans la déclaration de capture, mais je l'ai sorti pour cet exemple.


@ABATISHCHEV: Cette déclaration est erronée - appeler juste lancer réserve la trace de la pile; créer une nouvelle exception ou faire lancer ex; enfreindrait la pile d'appel; Voir: weblogs.asp.net/fmarguerie/archive/2008/01/02/...


@marc_s: Oui, tu as raison, j'avais tort (en expression sur la trace de la pile). de toute façon cela n'a aucun sens jusqu'à la journalisation, etc. comme @Lareau a dit



6
votes

Pour récupérer les informations lorsque le DomainController code> existe dans un domaine dans lequel votre machine n'appartient pas, vous avez besoin de quelque chose de plus.

  DirectoryContext domainContext =  new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword");

  var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext);
  var controller = domain.FindDomainController();


3 commentaires

Je ne veux pas passer le nom d'utilisateur et le mot de passe.


Malheureusement, si vous traversez des domaines, vous devez. Votre identité existante ne sera pas reconnue autrement. Même avec le "nouveau" 3.5 system.directoryservices.accountmanagement Espace de noms, vous devez inclure un nom d'utilisateur / mot de passe valide sur le domaine externe .


Cela ne fonctionne pas car votre ordinateur local ne sera pas en mesure de trouver un CC pour ce domaine.