私は、個人がコンピューター名を提供できるようにする廃止措置アプリケーションを構築しています。ユーティリティは、さまざまな場所からコンピューターレコードを削除します。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