передача вывода ADSI в другой сценарий powershell для поиска компьютеров домена - PullRequest
0 голосов
/ 13 февраля 2020

Я перешел в компанию, которая имеет устаревшие серверы и не имеет RSAT, поэтому я не могу использовать модуль AD и должен убедиться, что сценарий соответствует версии 2.

Я написал сценарий обнаружения, чтобы найти все домены в лесу, и я пытаюсь передать его в другой сценарий, чтобы узнать все имена хостов DNS компьютеров в доменах, к которым у меня тоже есть доступ, но продолжаю получать различные ошибки.

Домены в лесу Код:

$Root = [ADSI]"LDAP://RootDSE"
$oForestConfig = $Root.Get("configurationNamingContext")
$oSearchRoot = [ADSI]("LDAP://CN=Partitions," +     $oForestConfig)
$AdSearcher = [adsisearcher]"(&(objectcategory=crossref)    (netbiosname=*))"
$AdSearcher.SearchRoot = $oSearchRoot
$Domains = $AdSearcher.FindAll()
return $Domains|$Domains = "dc=" + $Domains.Name.Replace(".",     ",dc=") |Out-File C:\domains.txt

Код для поиска имен хостов DNS:

$doms = Get-Content C:\domains.txt
foreach ($dom in $doms) {
$AD = (([adsisearcher]"").Searchroot.path)
IF ($AD -notlike "LDAP://*") {$AD ="LDAP://$AD"}
$AD.Filter = "(&(objectCategory=Computer)(name=$item))"
$Computers = $AD.Filter.FindAll()
$ComputerNames = $Computers.Properties.dnshostname
}

Есть идеи?

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете использовать все классы. NET в PowerShell, что может упростить процесс. Фактически, [adsi] и [adsisearcher] являются «ускорителями типа» для классов DirectoryEntry и DirectorySearcher.

Для этого варианта использования вы можно использовать Forest.GetCurrentForest(), чтобы найти лес и прочитать все домены в лесу. Затем для каждого домена найдите все компьютеры.

Вот пример того, как вы это сделаете. Вероятно, он не будет отформатирован так, как вы хотите, но вы можете изменить его так, как хотите.

$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()

foreach ($domain in $forest.Domains) {
    $domain.Name
    $searcher = [adsisearcher]"(objectCategory=Computer)"
    $searcher.SearchRoot = [adsi]"LDAP://$($domain.Name)"
    $searcher.PropertiesToLoad.Add("dNSHostName") | Out-Null

    foreach ($comp in $searcher.FindAll()) {
        $comp.Properties["dnsHostName"][0]
    }
}
...