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()

2番目のスローを引き起こしている可能性があるものについて何か考えはありますか? 呼び出しの直前に、ADSIEdit を使用して所定の場所に crossRef オブジェクトを表示できます。

4

1 に答える 1

0

Microsoft との問題 (PSS ケース #112072417632086) を解決した後、ConfigurationSet クラスはキャッシュを保持しており、変更を行った場合は更新する必要があることが判明しました。あまり明白ではありませんが、私は知っています... 2番目のパーティションの存在チェック呼び出しの前に、次のように更新します。

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