#Alan dot Kaplan at VA dot gov #convert System.DirectoryServices.SearchResult to PSObject #12-16-16 Function ConvertTo-PSObjectFromDirectorySearchResult($oDS){ $outval = New-Object -TypeName PsObject foreach ($DC in $oDS){ foreach ($strProperty in $oDS.PropertiesLoaded){ $val = $DC.Properties[$strProperty] if ($val.GetTypeCode() -eq 'byte'){ $val = ByteToString ($val) }Else{ $val = [string]($val).trim() } Add-Member -InputObject $outval -MemberType NoteProperty ` -Name $strProperty -Value $val -Force } $outval } } Function ByteToString($v){ $ADPropVal='' #Delim character is used to join string of bytes $delim=";" if ($v.count -eq 1) {$v.tostring() }Else{ For ($i = 0; $i -le $v.count-1; $i++) { if ($v.item($i)) { $ADPropVal +=$v.item($i).ToString()+$delim } } } #Cleanup to remove trailing delimter $adpropval.TrimEnd($delim) } Function Get-DomainFromDNString($strADsPath){ $strADsPath.Substring($strADsPath.IndexOf(",DC")).Replace(",DC=",".").Substring(1) } $objForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest() $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $strFilter = "(servicePrincipalName=DNS*)" $root = [ADSI]"GC://$($objForest.Name)" $objSearcher.SearchRoot = $root $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "DNSHostName,Name,DistinguishedName".Split(",") foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i) | Out-Null} $GCRetval = $objSearcher.FindAll() ConvertTo-PSObjectFromDirectorySearchResult $GCRetval | select @{Name="Domain";Expression={Get-DomainFromDNString($_."adsPath")}},Name,DNSHostName,DistinguishedName | sort Domain, name | ogv -Title "DCs in Forest"