2012-07-24 72 views
3

正在關注the guidance posted on MSDN as to how to create an application partition我在刪除剛創建的分區時遇到異常。下面的示例是針對我的用戶帳戶具有完全管理權限的AD LDS實例運行的。有趣的是,如果在使用測試夾具之前存在分區,它就會首次運行。刪除應用程序分區會拋出異常,該對象不存在

var connectionString = new Uri("LDAPS://localhost/DC=integrationtests,DC=contoso,DC=com"); 
var baseContainerName = connectionString.PathAndQuery.TrimStart('/'); 
var hostName = IPGlobalProperties.GetIPGlobalProperties().HostName; 
var directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer, hostName); 
var configurationSet = ConfigurationSet.GetConfigurationSet(directoryContext); 

var existingPartition = 
       configurationSet.ApplicationPartitions.Cast<ApplicationPartition>().FirstOrDefault(
        partition => baseContainerName.Equals(partition.Name, StringComparison.OrdinalIgnoreCase)); 
if (existingPartition != null) 
{ 
    existingPartition.Delete(); 
} 

// DirectoryEntry requires that the scheme is uppercase (LDAP not ldap) 
var authenticationOptions = AuthenticationTypes.FastBind | AuthenticationTypes.Delegation | AuthenticationTypes.Secure; 
var ldapConnectionString = String.Format(CultureInfo.InvariantCulture, "LDAP://{0}", hostName); 
if (connectionString.Scheme.Equals("LDAPS", StringComparison.OrdinalIgnoreCase)) 
{ 
    authenticationOptions = authenticationOptions | AuthenticationTypes.SecureSocketsLayer; 
    ldapConnectionString = ldapConnectionString + ":" + (connectionString.Port <= 0 ? "636" : connectionString.Port.ToString(CultureInfo.InvariantCulture)); 
} 
using (var parent = new DirectoryEntry(ldapConnectionString, null, null, authenticationOptions)) 
{ 
    var partition = parent.Children.Add(baseContainerName, "domainDns"); 
    partition.Properties["instanceType"].Value = 5; 
    partition.Properties["description"].Value = Assembly.GetExecutingAssembly().GetName().Name; 
    partition.CommitChanges(); 
} 

var existingPartition2 = 
       configurationSet.ApplicationPartitions.Cast<ApplicationPartition>().FirstOrDefault(
        partition => baseContainerName.Equals(partition.Name, StringComparison.OrdinalIgnoreCase)); 
if (existingPartition2 != null) 
{ 
    // Throws here 
    existingPartition2.Delete(); 
} 

到existingPartition2.Delete(呼叫)拋出:

System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException was unhandled 
HResult=-2146233088 
Message=There is no such object on the server. 

Source=System.DirectoryServices 
ErrorCode=-2147016656 
StackTrace: 
     at System.DirectoryServices.ActiveDirectory.ApplicationPartition.Delete() 
     at LdapTest.Program.Main(String[] args) in d:\Projects\LdapTest\LdapTest\Program.cs:line 58 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
InnerException: System.DirectoryServices.DirectoryServicesCOMException 
     HResult=-2147016656 
     Message=There is no such object on the server. 

     Source=System.DirectoryServices 
     ErrorCode=-2147016656 
     ExtendedError=8333 
     ExtendedErrorMessage=0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of: 
    'CN=Partitions,CN=Configuration,CN={CB88D356-F030-4598-BD59-F810587A2C72}' 

     StackTrace: 
      at System.DirectoryServices.DirectoryEntries.Remove(DirectoryEntry entry) 
      at System.DirectoryServices.ActiveDirectory.ApplicationPartition.Delete() 

任何想法,以什麼可能會導致第二扔?我可以在調用之前使用ADSIEdit來查看crossRef對象。

回答

0

解決了Microsoft(PSS案例#112072417632086)的問題後,事實證明,ConfigurationSet類維護一個緩存,並且需要在您進行更改時進行刷新。不是很明顯,我知道...在第二個分區存在之前檢查呼叫刷新它:

configurationSet = ConfigurationSet.GetConfigurationSet(directoryContext.Value);