# Import the Active Directory module Write-Host "Importing the Active Directory module..." Import-Module ActiveDirectory Write-Host "Active Directory module imported." # Automatically derive the domain's distinguished name Write-Host "Retrieving the current user's domain context..." $domainDN = (Get-ADDomain).DistinguishedName Write-Host "The current user's domain context has been retrieved: $domainDN" # Construct the DN for the MicrosoftDNS zone within the DomainDnsZones partition Write-Host "Constructing the Distinguished Name (DN) for the MicrosoftDNS zone within the DomainDnsZones partition..." $dnsZoneDN = "CN=MicrosoftDNS,DC=DomainDnsZones,$domainDN" Write-Host "The DN for the MicrosoftDNS zone has been constructed: $dnsZoneDN" # Display the query that will be executed Write-Host "Preparing to execute the query to fetch all objects under the MicrosoftDNS zone..." Write-Host "The query will be executed with the following search base: $dnsZoneDN" # Append the current date and time to the file name $dateTime = Get-Date -Format "yyyyMMddHHmmss" $outputPath = "MicrosoftDNSZoneObjects_$dateTime.csv" # Attempt to retrieve and export all objects under the MicrosoftDNS zone to a CSV file try { Write-Host "Executing the query..." $objects = Get-ADObject -SearchBase $dnsZoneDN -Filter * -Properties * if ($objects) { Write-Host "Query executed successfully. Preparing data for export..." $internalHosts = New-Object System.Collections.ArrayList $notInternalHosts = New-Object System.Collections.ArrayList foreach ($object in $objects) { $hostname = "none" # Check for conditions to set the hostname or keep it as "none" if ($object.DistinguishedName -match '^DC=([^,]+),' -and $matches[1] -notmatch '^\@' -and $matches[1] -notmatch '\.') { $hostname = $matches[1] } # Create a custom object to maintain the order and include the new hostname column $customObject = New-Object PSObject -Property @{ Hostname = $hostname DistinguishedName = $object.DistinguishedName } # Add the remaining properties from the original object $object.psobject.properties | Where-Object { $_.Name -notin 'DistinguishedName', 'Hostname' } | ForEach-Object { Add-Member -InputObject $customObject -MemberType NoteProperty -Name $_.Name -Value $_.Value -Force } # Distribute objects into two arrays based on the Hostname value if ($hostname -eq "none") { [void]$notInternalHosts.Add($customObject) } else { [void]$internalHosts.Add($customObject) } } # Define file paths for internal and non-internal hosts $internalHostsPath = "MicrosoftDNSZoneObjects_$dateTime.csv" $notInternalHostsPath = "MicrosoftDNSZoneObjects_NotInternalHosts_$dateTime.csv" Write-Host "Exporting internal hosts to $internalHostsPath..." $internalHosts | Export-Csv -Path $internalHostsPath -NoTypeInformation Write-Host "Exporting non-internal hosts to $notInternalHostsPath..." $notInternalHosts | Export-Csv -Path $notInternalHostsPath -NoTypeInformation Write-Host "Results exported successfully." } else { Write-Host "No objects found in the MicrosoftDNS zone." } } catch { Write-Error "An error occurred while executing the query or exporting the results: $_" }