Creating a new UserPrincipal or GroupPrincipal for existing object when saved causes object to be deleted
We have been encountered a number of issues regarding the System.DirectoryService.Accountmanagement namespace over the past few weeks. One of these issues is the following:
PROBLEM:
=========
Suppose you want to create a new principal, pick one: userprincipal or groupprincipal, and that principal already exists in your specified context.
If you use the new operator with the principal, then call the Save method, you will receive the following exception:
"System.DirectoryServices.AccountManagement.PrincipalExistsException: The object already
exists."
As a bonus, the namespace will delete the existing object from the Active directory.
RESOLUTION:
===========
This is a known issue with the System.DirctoryServices.AccountManagment namespace and will be addressed in a future update/release to the .Net framework.
WORK AROUND:
============
The simple work around is to test to see if the object exists in the Active Directory before calling the New operator to attempt to create a UserPrincipal or GroupPrincipal associated with it.
Or just use the System.DirectoryServices namespace to create either the user or the group.
Steps To Reproduce:
====================
The example is using the GroupPrincipal class. The same issue can be reproduced with using the UserPrincipal class.
1. Create a simple VB.Net console application and add the following code to the main function:
Dim newGroupPrincipal As GroupPrincipal
Using ouPrincipalContext As PrincipalContext = New PrincipalContext(ContextType.Domain,
"MyDomain.Com", "OU=My Group,DC=MyDomain,DC=Com")
Try
newGroupPrincipal = New GroupPrincipal(ouPrincipalContext)
With newGroupPrincipal
.Name = "test group that will be deleted"
.IsSecurityGroup = True
.GroupScope = GroupScope.Global
.SamAccountName = "test group that will be deleted"
.Save()
End With
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Using
2. Run this code twice. The second time around you will receive the
"System.DirectoryServices.AccountManagement.PrincipalExistsException" and you will notice that the principal has been deleted.
3. Run it a third time and the principal will be created anew.
Stack Trace:
System.DirectoryServices.AccountManagement.PrincipalExistsException: The object already exists. (Exception from
HRESULT: 0x80071392) ---> System.DirectoryServices.DirectoryServicesCOMException (0x80071392): The object already exists. (Exception from HRESULT: 0x80071392)
at System.DirectoryServices.DirectoryEntry.CommitChanges()
....
Comments
Anonymous
September 12, 2008
PingBack from http://hoursfunnywallpaper.cn/?p=5945Anonymous
September 12, 2008
I've been helping out my old colleagues on the identity team these past few weeks (so that people couldAnonymous
September 28, 2010
Just ran into this one. Artical posted in 2008; Its now 2010 and it still happens.Anonymous
May 27, 2011
How is it possible that this isn't fixed?Anonymous
June 06, 2013
The comment has been removedAnonymous
May 16, 2014
The comment has been removed