2009-09-09 8 views
0

J'essaie de modifier certaines propriétés pour les utilisateurs de notre répertoire actif. Certaines propriétés que je peux changer et d'autres que je ne peux pas. Je fais l'emprunt d'identité, mais pour certaines propriétés, je reçois toujours l'erreur "General Access denied error" lorsque j'essaie d'appeler CommitChanges().Modification des propriétés Active Directory

Par exemple, cela fonctionnera:

DirectoryEntry deUser = new DirectoryEntry(result.Path); 

if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword)) 
{      
    deUser.Properties["ampPasswordQuestion"].Value = newPasswordQuestion; 
    deUser.Properties["ampPasswordAnswer"].Value = newPasswordAnswer;  
    deUser.CommitChanges(); 
    deUser.Close(); 

    UndoImpersonation(); 
} 

Cela fonctionne probablement parce que nous avons ajouté manuellement les propriétés dans le schéma AD sans restriction d'accès. (Voir ASP.NET 3.5 Sécurité, adhésion et la gestion Rôle avec C# et VB)

Toutefois, si je tente de modifier quelque chose comme la propriété Commentaire d'un dossier comme suit:

DirectoryEntry deUser = new DirectoryEntry(result.Path); 

if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword)) 
{      
    deUser.Properties["comment"].Value = comment; 
    deUser.CommitChanges(); 
    deUser.Close(); 

    UndoImpersonation(); 
} 

Je obtiendra "Erreur accès général refusé".

Vous avez des idées?

Le code Impersionation est de Microsoft à l'adresse: http://support.microsoft.com/kb/306158

Répondre

3

Je crois avoir trouvé le problème. Apparemment, vous devez créer l'entrée d'annuaire qui sera modifiée après L'emprunt d'identité est terminé. Cela semble logique parce que je crois que les droits de l'utilisateur modifiant deviennent effectifs lors de la création de l'entrée à modifier. Quelqu'un peut-il vérifier cela? Je ne l'ai pas vu expliqué de cette façon dans n'importe quelle documentation. J'ai fait un peu plus de tests et j'ai découvert que la première entrée ne nécessite même pas d'emprunt d'identité car ces attributs ne sont pas sécurisés.

Dans le 2ème cas, le code suivant fonctionne:

if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword)) 
{  
    DirectoryEntry deUser = new DirectoryEntry(result.Path);    
    deUser.Properties["comment"].Value = comment; 
    deUser.CommitChanges(); 
    deUser.Close(); 

    UndoImpersonation(); 
} 
+0

Merci, sauvé ma journée ;-) – Gorgsenegger

Questions connexes