2012-04-27 11 views
1

私は、個人がコンピュータ名を提供することを可能にする廃止措置アプリケーションを構築しています。このユーティリティは外出し、さまざまな場所からコンピュータレコードをパージします。私はActive Directoryからコンピュータアカウントを削除しようとすると問題に遭遇しています。特定のOU構造内の「すべての子オブジェクトを削除する」権限しか持たないサービスアカウントを偽装しています。ドメイン管理者アカウントで実行すると、以下のコードが動作します。ただし、偽装されたサービスアカウントで実行すると「アクセスが拒否されました」というエラーが表示されます。 "runas"を使用してActive Directoryユーザーとコンピュータを起動し、サービスアカウントの資格情報を提供し、コンピュータオブジェクトを完全に細かく削除できるため、AD内のアクセス許可が正しいことを確認しました。AD内のコンピュータアカウントを削除する

誰かがこれまでに遭遇したことがあるかどうか、または私の現在のOU権限を引き続き利用している間にこれをコードする別の方法があるかどうかわかりません。私の腸は私に、 "DeleteTree"メソッドがオブジェクトを単に削除するよりもやっていると伝えます。

ご協力いただければ幸いです。

Sub Main() 
    Dim strAsset As String = "computer9002" 
    Dim strADUsername As String = "service[email protected].com" 
    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

パーフェクト。はい、私は4.0を使用しているので、期待どおりに動作します。助けてくれてありがとう。 –

0

削除ツリーは削除と異なります。これが機能するには、子コンピュータオブジェクトに対して[サブツリーの削除]権限が必要です。

+0

意味があります。ありがとう –

関連する問題