アプリケーション パーティションの作成方法について 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 オブジェクトを表示できます。