【问题标题】:DirectoryEntry.Children.Remove throws "unspecified error"DirectoryEntry.Children.Remove 抛出“未指定的错误”
【发布时间】:2011-08-24 13:37:06
【问题描述】:

我有一段代码可以从 Active Directory 中删除一个安全组,但是在运行时,我收到了一个带有消息“未指定错误”的 COMException。

代码如下:

public void DeleteGroup(Model.Asset pADSecurityGroup)
{
    using(DirectoryEntry ou = new DirectoryEntry(pADSecurityGroup.Organization.ActiveDirectoryMappings.Single().Identifier))
    using(DirectoryEntry group = new DirectoryEntry("LDAP://" + pADSecurityGroup.ActiveDirectoryMappings.Single().Identifier))
    {
        ou.Children.Remove(group);
        group.CommitChanges();
    }
}

这是 Windows 事件控制台中的消息:

Event code: 3005 
Event message: An unhandled exception has occurred.
Event time: 8/23/2011 11:29:35 AM  
Event time (UTC): 8/23/2011 5:29:35 PM  
Event ID: 67e6356c9ff146c7a0d9024350cbb3a0  
Event sequence: 79  
Event occurrence: 1  
Event detail code: 0

Application information: 
    Application domain: /LM/W3SVC/1/ROOT-2-129585938920392018 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:\inetpub\wwwroot\vo\Web\Portal\ 
    Machine name: TR-2K8-001    Process information: 
    Process ID: 8348 
    Process name: w3wp.exe 
    Account name: VO\treed    Exception information: 
    Exception type: COMException 
    Exception message: Unspecified error

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_IsContainer()
   at System.DirectoryServices.DirectoryEntries.Remove(DirectoryEntry entry)
   at VirtualOffice.DirectoryServices.Impl.DirectoryService.DeleteGroup(ResourcePool pResourcePool) in C:\inetpub\wwwroot\vo\Common Libraries\VirtualOffice.DirectoryServices\Impl\DirectoryService.cs:line 249
   at VirtualOffice.Controllers.ResourcePoolController.Delete(Int32 pServiceProviderId) in C:\inetpub\wwwroot\vo\Common Libraries\VirtualOffice.Controllers\ResourcePoolController.cs:line 171
   at Organization_ResourcePools.rtbResourcePools_OnButtonClick(Object sender, RadToolBarEventArgs e) in c:\inetpub\wwwroot\vo\Web\Portal\Organization\ResourcePools.aspx.cs:line 85
   at Telerik.Web.UI.RadToolBar.OnButtonClick(RadToolBarEventArgs e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    Request information: 
    Request URL: https://localhost:443/Organization/ResourcePools.aspx

    Request path: /Organization/ResourcePools.aspx 
    User host address: ::1 
    User: Portal Admin 
    Is authenticated: True 
    Authentication Type: Federation 
    Thread account name: VO\treed    Thread information: 
    Thread ID: 5 
    Thread account name: VO\treed 
    Is impersonating: False 
    Stack trace:

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_IsContainer()
   at System.DirectoryServices.DirectoryEntries.Remove(DirectoryEntry entry)
   at VirtualOffice.DirectoryServices.Impl.DirectoryService.DeleteGroup(ResourcePool pResourcePool) in C:\inetpub\wwwroot\vo\Common Libraries\VirtualOffice.DirectoryServices\Impl\DirectoryService.cs:line 249
   at VirtualOffice.Controllers.ResourcePoolController.Delete(Int32 pServiceProviderId) in C:\inetpub\wwwroot\vo\Common Libraries\VirtualOffice.Controllers\ResourcePoolController.cs:line 171
   at Organization_ResourcePools.rtbResourcePools_OnButtonClick(Object sender, RadToolBarEventArgs e) in c:\inetpub\wwwroot\vo\Web\Portal\Organization\ResourcePools.aspx.cs:line 85
   at Telerik.Web.UI.RadToolBar.OnButtonClick(RadToolBarEventArgs e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    Custom event details:

【问题讨论】:

  • 你的方法 pResourcePool.Organization.ActiveDirectoryMappings.Single().Identifier 返回什么? LDAP 路径(字符串)还是 LDAP 对象?
  • 抱歉,'pResourcePool' 不是给定代码中的有效引用。我已经修复了代码,因此“pResourcePoo”现在是“pADSecurityGroup”。回答您的问题:它返回一个 FQDN 字符串。

标签: c# active-directory directoryentry


【解决方案1】:

根据 cmets 部分中的问题/答案,我修改了我的答案。 我认为您只是忘记了组织单位的 LDAP 路径的 LDAP 协议标识符。我认为,未指定的错误意味着 LDAP 路径无效。

试试下面的代码:

public void DeleteGroup(Model.Asset pAsset) 
{ 
  using(DirectoryEntry ou = new DirectoryEntry("LDAP://" + pResourcePool.Organization.ActiveDirectoryMappings.Single().Identifier)) 
  {
    using(DirectoryEntry group = new DirectoryEntry("LDAP://" + pResourcePool.ActiveDirectoryMappings.Single().Identifier), username, userpwd) 
    { 
    ou.Children.Remove(group); 
    group.CommitChanges(); 
    } 
  }
} 

同样,请确保 LDAP 协议标识符使用大写字母书写。 希望,这会有所帮助。

【讨论】:

  • IIS 线程池安全上下文确实有权删除 Active Directory 中的用户。
  • 您是否尝试过传递用户名和密码?
  • 能否请您向我们展示您的组织单位和安全组的 LDAP 路径?
  • 安全组: CN=ResourcePool-Testing AD Stuff 2.1-32-29,OU=SolidInstanceInc,OU=SolidInstance,OU=AppSet-Core,OU=PubUsers,DC =vo,DC=sl 组织单位: OU=SolidInstanceInc,OU=SolidInstance,OU=AppSet-Core,OU=PubUsers,DC=vo,DC=sl
【解决方案2】:

只是猜测:也许 DirectoryEntry "ou" 不为空。 MSDN 说:

如果要删除的条目是容器,则容器必须为空。要删除容器及其所有子容器,请使用 DeleteTree 方法。

您也可以尝试捕获 ComException 并收集更多信息,以便分析问题。

【讨论】:

  • 遗憾的是,捕获异常不会产生额外的信息。另外,我不是试图删除 OU,而是位于 OU 中的安全组。安全组为空。 :(
猜你喜欢
  • 2017-01-25
  • 2017-12-25
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2014-05-30
  • 2018-11-15
相关资源
最近更新 更多