2010-07-08 3 views
2

J'ai écrit un programme qui ouvre une connexion à un serveur Windows distant afin de gérer les comptes locaux (pas de répertoire actif). Le programme exécute les étapes suivantes:Gestion des utilisateurs sur un serveur Windows distant utilisant C# System.DirectoryServices

  • Création d'un utilisateur
  • Ajouter l'utilisateur à un groupe

Les deux méthodes utilisent System.DirectoryServices.AccountManagement, ici les deux fonctions:

public void CreateUser() 
    { 
     PrincipalContext pc = new PrincipalContext(ContextType.Machine, 
      "host_ip", 
      "adminaccount", 
      "adminpassword"); 
     UserPrincipal up = new UserPrincipal(pc); 

     up.Name = "user"; 
     up.DisplayName = "user"; 
     up.SetPassword("user"); 
     up.Description = "user"; 
     up.UserCannotChangePassword = true; 
     up.PasswordNeverExpires = true; 
     try 
     { 
      up.Save(); 
     } 
     catch (Exception ex) 
     { 
     } 
     try 
     { 
      AddToGroup(pc, up); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    private void AddToGroup(PrincipalContext pc, UserPrincipal u) 
    { 
     string group = "Remote Desktop Users"; 

     GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(pc, group); 
     if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName)) //error occurs here 
     { 
      return; 
     } 
     groupPrincipal.Members.Add(u); 
     try 
     { 
      groupPrincipal.Save(); 
     } 
     catch (Exception e) 
     { 
     } 
    } 

Cela a fonctionné depuis ce matin, la création de l'utilisateur réussit toujours mais je reçois cette erreur à la ligne:

  • si (groupPrincipal.Members.Contains (pc, IdentityType.SamAccountName, u.SamAccountName))

Une erreur (1332) a eu lieu alors que les membres de l'énumération groupe. Le SID du membre n'a pas pu être résolu.

Merci pour vous réponses

Répondre

3

Je ne sais pas si cela va aider, mais d'après ce rapport sur Microsoft Connect, cela pourrait être lié:

La version actuelle du groupe System.DirectoryServices.AccountManagement l'énumération exige que tous les objets du groupe soient accessibles ou qu'une exception soit levée. Ce que vous voyez est un objet répertorié dans le groupe local qui n'existe plus dans ActiveDirectory. Puisque le système ne supprimera pas automatiquement ces liens, à chaque fois que ce groupe est énuméré, il échouera. Pour éviter cet incident, supprimez le lien vers l'objet dans ActiveDirectory qui n'existe plus. Nous étudions la possibilité d'apporter une modification à l'API dans une prochaine version qui rendrait les scénarios de ce type plus faciles à gérer.

+1

Merci Matt, vous pourriez avoir raison, je ne peux pas trouver une autre origine. Il existe un moyen de résoudre ce problème selon MS: "Supprimer (en utilisant l'interface graphique) le mauvais SID du groupe résout le problème." Une idée de comment identifier le mauvais SID? – adun

Questions connexes