2012-04-27 2 views
1

Я создаю приложение для снятия с эксплуатации, которое позволит персоналу предоставить имя компьютера, и утилита выйдет и очистит компьютерную запись из разных мест. При попытке удалить учетную запись компьютера из Active Directory возникает проблема. Я выдаю себя за учетную запись службы, которая имеет права только на «Удалить все дочерние объекты» в рамках определенной структуры подразделения. Код ниже работает, если я запускаю его с учетной записью администратора домена; однако не работает с «Access Denied», когда я запускаю его с помощью персонализированной учетной записи службы. Я проверял, что разрешения правильны в AD, поскольку я могу запускать Active Directory - пользователи и компьютеры с помощью «runas» и предоставления учетных данных учетной записи службы, и я могу прекрасно удалять объекты компьютеров.ASP.NET - Удаление учетных записей компьютеров в AD

Удивительно, если кто-то столкнулся с этим раньше или имеет другой способ кодировать это, все еще используя мои текущие разрешения OU. Моя кишка говорит мне, что метод DeleteTree делает больше, чем просто удаляет объект.

Любая помощь будет оценена по достоинству.

Sub Main() 
    Dim strAsset As String = "computer9002" 
    Dim strADUsername As String = "[email protected]" 
    Dim strADPassword As String = "password" 
    Dim strADDomainController As String = "domaincontroller.domain.com" 

    Dim objDirectoryEntry As New System.DirectoryServices.DirectoryEntry 
    Dim objDirectorySearcher As New System.DirectoryServices.DirectorySearcher(objDirectoryEntry) 
    Dim Result As System.DirectoryServices.SearchResult 
    Dim strLDAPPath As String = "" 

    Try 
     objDirectoryEntry.Path = "LDAP://" & strADDomainController 

     objDirectoryEntry.Username = strADUsername 
     objDirectoryEntry.Password = strADPassword 

     objDirectorySearcher.SearchScope = DirectoryServices.SearchScope.Subtree 
     objDirectorySearcher.Filter = "(&(ObjectClass=Computer)(CN=" & strAsset & "))" 

     Dim intRecords As Integer = 0 

     For Each Result In objDirectorySearcher.FindAll 
      Console.WriteLine(Result.Path) 
      Diagnostics.Debug.WriteLine("DN: " & Result.Path) 
      Dim objComputer As System.DirectoryServices.DirectoryEntry = Result.GetDirectoryEntry() 
      objComputer.DeleteTree() 
      objComputer.CommitChanges() 
      intRecords += 1 
     Next 

     If intRecords = 0 Then 
      Console.WriteLine("No Hosts Found") 
     End If 

    Catch e As System.Exception 
     Console.WriteLine("RESULT: " & e.Message) 
    End Try 
End Sub 

ответ

2

Если вы на .NET 3.5 и выше, вы должны проверить System.DirectoryServices.AccountManagement (S.DS.AM) пространства имен. Читайте об этом здесь:

В принципе, вы можете определить контекст домена и легко найти пользователей и/или групп в AD:

' set up domain context 
Dim ctx As New PrincipalContext(ContextType.Domain, "DOMAIN", strADUsername, strADPassword) 

' find a computer 
Dim computerToDelete As ComputerPrincipal = ComputerPrincipal.FindByIdentity(ctx, strAsset) 

If computerToDelete IsNot Nothing Then 
    ' delete the computer, if found 
    computerToDelete.Delete() 
End If 

новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD!

+0

Perfect. Да, я использую 4.0, чтобы работать так, как ожидалось. Большое спасибо за Вашу помощь. –

0

Удалить Дерево отличается от удаления. Для этого вам понадобится разрешение Delete Subtree на объектах дочернего компьютера.

+0

Делает смысл. благодаря –

Смежные вопросы