2010-05-04 5 views
4

Quel est le moyen préféré de verrouiller un compte Active Directory?LDAP Activeoy - Verrouiller le compte utilisateur

int val = (int)directoryentry.Properties["userAccountControl"].Value; 
directoryentry.Properties["userAccountControl"].Value = val | 0x0010; 

contre

directoryentry.InvokeSet("IsAccountLocked", true); 

Y at-il une meilleure façon?

+1

+1 J'ai appris la méthode DirectoryEntry.InvokeSet(). Merci! =) –

Répondre

3

Êtes-vous sur .NET 3.5 (ou pouvez-vous mettre à niveau vers elle) ??

Si c'est le cas, consultez le nouvel espace de noms System.DirectoryServices.AccountManagement et tout ce qu'il a à offrir! Excellente intro est le MSDN article Managing Directory Security Principals in the .NET Framework 3.5.

Pour votre cas, vous devez obtenir un UserPrincipal d'une certaine manière, par ex.

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"); 
UserPrincipal me = UserPrincipal.Current; 

et vous avez accès à une pléthore de très facile à utiliser les propriétés et méthodes - par exemple:

bool isLockedOut = me.IsAccountLockedOut(); 

et vous pouvez déverrouiller un compte verrouillé à l'aide:

me.UnlockAccount(); 

BEAUCOUP plus facile que les vieux trucs System.DirectoryServices plaine!

+0

C'est super, merci. – Germ

+0

Quelqu'un s'il vous plaît modifier cette réponse pour supprimer l'exemple de dernier extrait de code indiquant que 'IsAccountLockedOut' est une propriété qui peut être définie. Cette propriété et cette fonctionnalité n'existent pas. – user392139

+0

@ user392139: corrigé - merci d'avoir signalé cette erreur –

1

En fait, vous devez effectuer une opération au niveau du bit pour définir le bit correct à la valeur appropriée. Dans le lien ci-dessous, vous rencontrerez les drapeaux de contrôle de compte d'utilisateur. Vous n'avez donc qu'à exécuter l'opération logique appropriée sur la propriété pour verrouiller ou déverrouiller le compte.

Le lien suivant va vous intéresser, je suppose.

How to (almost) everything in AD

j'ajouter un exemple de code C# code plus tard.

Voici le code suggéré:

public class AdUser { 
    private int _userAccountControl 
    public bool IsLocked { 
     get { 
      return _userAccountControl & UserAccountControls.Lock 
     } set { 
      if(value) 
       _userAccountControl = _userAccountControl | UserAccountControls.Lock 
      else 
       // Must reverse all the bits in the filter when performing an And operation 
       _userAccountControl = _userAccountControl & ~UserAccountControls.Lock 
     } 
    } 
    public enum UserAccountControls { 
     Lock = 0x10 
    } 
} 

S'il vous plaît peut-être envisager d'avoir quelques modifications à apporter à ce code, comme je l'ai pas testé. Mais votre code devrait ressembler ou quelque chose de proche comme pour le verrouillage et le déverrouillage du compte utilisateur. Tôt ou tard, vous devrez aller avec DirectoryEntry.Properties [] pour le mettre à la valeur dans votre classe d'objet.

EDIT

Quelle est la façon preferred pour verrouiller un compte Active Directory?

int val = (int)directoryentry.Properties["userAccountControl"].Value; 
    directoryentry.Properties["userAccountControl"].Value = val | 0x0010; 

contre

directoryentry.InvokeSet("IsAccountLocked", true); 

En réponse à votre question que je mets dans mon édition, je dirais que ce sont le plus simple, au moins que je sais. Je préfère, pour ce qui me concerne, emballer ces fonctionnalités comme je l'ai fait dans mon exemple de code, de sorte que les autres programmeurs ne se soucient pas des opérations au niveau du bit et ainsi de suite. Pour eux, ils manipulent des objets.

Quant à la meilleure façon entre ces deux, je suppose que c'est une question de préférence. Si vous êtes à l'aise avec les opérations logiques, celles-ci sont normalement préférées. Par comparaison cependant, le deuxième choix est plus simple à jouer.

Questions connexes