3

按照MSDN 上发布的关于如何创建应用程序分区的指导,我在删除刚刚创建的分区时遇到了异常。下面的示例针对我的用户帐户具有完全管理员权限的 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 对象。

4

1 回答 1

0

在与 Microsoft(PSS 案例 #112072417632086)一起解决问题后,结果发现 ConfigurationSet 类维护一个缓存,如果您进行了更改,则需要刷新。不是很明显,我知道......在第二个分区存在检查调用之前通过以下方式刷新它:

configurationSet = ConfigurationSet.GetConfigurationSet(directoryContext.Value);
于 2012-08-09T18:02:37.517 回答