1

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

誰かが以前にこれに遭遇したことがあるか、または現在のOU権限を利用しながらこれをコーディングする別の方法があるかどうか疑問に思います。私の腸は、「DeleteTree」メソッドがオブジェクトを削除するだけではないことを教えてくれます。

どんな援助もいただければ幸いです。

Sub Main()
    Dim strAsset As String = "computer9002"
    Dim strADUsername As String = "serviceaccount@domain.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
4

2 に答える 2

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のユーザーやグループを簡単に操作できます。

于 2012-04-27T15:26:34.187 に答える
0

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

于 2012-04-27T17:24:13.210 に答える