Searching for Deleted Objects using Powershell

 

This question popped in my mailbox – how can you use a script to search for deleted objects in the Active Directory, just as described here - http://support.microsoft.com/kb/258310.

Well, obviously you can’t script ldp.exe, so the second option was to use ADSI objects. The problem with those is that I couldn’t find anyway of using server controls which are required in our case (OID

1.2.840.113556.1.4.417 is required to return deleted objects).

So I ended up using the System.DirectoryServices.Protocols namespace in Powershell in order to get the job done. So here it is:

 [Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.Protocols")
$rootDSE = [adsi]"LDAP://RootDSE"

$LDAPConnection = New-Object System.DirectoryServices.Protocols.LDAPConnection($rootDSE.dnsHostName)
$request = New-Object System.directoryServices.Protocols.SearchRequest($rootDSE.Properties["defaultNamingContext"].Value.ToString(), "(isDeleted=TRUE)", "Subtree")

$control = New-Object System.DirectoryServices.Protocols.ShowDeletedControl

$request.Controls.Add($control)

$response = $LDAPConnection.SendRequest($request)

$response.Entries | %{

$_.distinguishedName; 

if($_.attributes.samaccountname -ne $null)
{
 write-host "SamAccountName:" $_.attributes.samaccountname[0]}
}

-Michael