2016-07-06 1 views
1

Je dois ajouter/supprimer des objets (utilisateurs, groupes) à un groupe local sur un serveur. Je le fais comme ci-dessous et il fonctionne très bien:Impossible d'ajouter/supprimer des objets au groupe en raison de SID orphelins: PrincipalOperationException: une erreur (1332) s'est produite

Principal adObject = Principal.FindByIdentity(domainContext, login); 
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(machineContext, IdentityType.Name, localGroupName); 
groupPrincipal.Members.Add(adObject); 
groupPrincipal.Save(); 

A l'exception des cas où un groupe local contient des orphelins (SIDs utilisateurs Active Directory ou des groupes qui sont déjà supprimés).

Orphaned-SIDs

Dans ce cas, je passer sous la barre exception:

System.DirectoryServices.AccountManagement.PrincipalOperationException: An error (1332) occurred while enumerating the group membership. The member's SID could not be resolved. 

Ce message d'erreur apparaît lorsque je tente d'ajouter, de supprimer et d'énumérer les membres d'un groupe local. En lisant les membres actuels d'un groupe ci-dessous solution fonctionne très bien:

DirectoryEntry group = (DirectoryEntry)groupPrincipal.GetUnderlyingObject(); 
foreach (object member in (IEnumerable)group.Invoke("Members", null)) 
{ 
    ... 
} 

Cependant la conversion GroupPrincipal en DirectoryEntry ne résout pas le problème pour l'ajout et la suppression de nouveaux membres. J'ai essayé trois méthodes ci-dessous et aucun d'entre eux fonctionne:

1) group.Invoke("Add", new object[] {@"WinNT://" + domain + "//" + login + ",user"}); 
2) group.Invoke("Add", new object[] { @"LDAP://" + adObject.DistinguishedName }); 
3) group.Properties["member"].Add(@"LDAP://" + adObject.DistinguishedName); 

Les trois cas ci-dessus donne la même erreur:

System.DirectoryServices.AccountManagement.PrincipalOperationException: An error (1332) occurred while enumerating the group membership. The member's SID could not be resolved. 
at System.DirectoryServices.AccountManagement.SAMMembersSet.IsLocalMember(Byte[] sid) 
at System.DirectoryServices.AccountManagement.SAMMembersSet.MoveNextLocal() 
at System.DirectoryServices.AccountManagement.SAMMembersSet.MoveNext() 
at System.DirectoryServices.AccountManagement.PrincipalCollectionEnumerator.MoveNext() 
at System.DirectoryServices.AccountManagement.PrincipalCollection.ContainsEnumTest(Principal principal) 
at System.DirectoryServices.AccountManagement.PrincipalCollection.Add(Principal principal) 

Je dois pouvoir ajouter et supprimer des utilisateurs au groupe sans supprimer ces SID orphelins. Quelqu'un peut-il s'il vous plaît me suggérer une solution/solution de contournement pour le problème?

Répondre

0

Il semble que je trouve la solution de contournement pour le problème:

DirectoryEntry group = (DirectoryEntry)groupPrincipal.GetUnderlyingObject(); 
IADsGroup nativeGroup = (IADsGroup)group.NativeObject; // https://msdn.microsoft.com/en-us/library/aa706022(v=vs.85).aspx 
nativeGroup.Remove("LDAP://" + adObject.Sid.Value); 
//nativeGroup.Remove(String.Format("WinNT:////{0}//{1}", domain, ID)); 
//nativeGroup.Remove(String.Format("NTDS:////{0}//{1}", domain, ID)); 

Si vous convertissez DirectoryEntry pour objet natif et le jeter aux ActiveDs.IADsGroup - méthodes Add() et Remove() fonctionne très bien