Jak za pomocą PowerShell wygenerować listę wszystkich stacji roboczych z domeny z ich adresami IP?
Jak za pomocą PowerShell wygenerować listę wszystkich stacji roboczych z domeny z ich adresami IP?
Żeby pobrać z AD informacje o komputerach, można użyć polecenia PowerShell Get-ADComputer. Niestety AD w standardowej konfiguracji nie posiada informacji o adresach IP komputerów w domenie.
Informacje te możemy znaleźć na serwerze DNS lub odpytać każdy komputer po kolei przez WMI.
Ja wykorzystam DNS, może nie być aktualny, ale nie wymaga dostępności wszystkich komputerów w sieci w momencie wykonywania skryptu:
'"ComputerName","IPAddress"' | Out-File .\comps.csv
$comps = (Get-ADComputer -Filter * -SearchBase "ou=workstations,dc=altkom,dc=pl").name
foreach ($comp in $comps) {
$ip = ([System.Net.Dns]::GetHostAddresses("$comp")).IPAddressToString
'"{0}","{1}"' -f $comp,$ip | Out-File .\comps.csv
}
W środowisku produkcyjnym ja osobiście używam konsolki DHCP.
Jeśli ma to być PowerShell, wykonamy to poprzez:
Get-DhcpServerv4Lease
Podając nasz zakres np. tj. 172.16.200.0, mamy IP, mamy nazwę klienta, po której widać, czy nasza domena, czy np. "gość" w 90% przypadków sprawdza się dobrze w praktyce.
Jedna uwaga - jeśli mamy czas dzierżawy np. 8 godzin, archiwalne wpisy mogą nie być dostępne.
Jeszcze jedno rozwiązanie tego zagadnienia:
Get-AdComputer -filter * -properties * |select Dnshostname, ipv4address
Niestety, chyba żadna z przedstawionych wcześniej funkcji nie zwraca w pełni poprawnych wyników. Zwracają poprawne, zakładając sytuację idealną, gdzie dana stacja ma przypisany dokładnie 1 adres IP, natomiast w przypadku realnym, gdzie mamy włączone IPv4, IPv6 oraz kilka kart sieciowych, powyższe sposoby zwracają błędne/niepełne dane:
Przykładowo posiadam stację PC912 z adresami IP:
fe80::a888:db2d:dac3:f3b3%8
fe80::6c6d:edd9:33ba:6910%6
192.168.100.100
10.10.10.24
Sposób '1' tj.:
'"ComputerName","IPAddress"' | Out-File .\comps.csv $comps = (Get-ADComputer -Filter * -SearchBase "ou=workstations,dc=altkom,dc=pl").name foreach ($comp in $comps) { $ip = ([System.Net.Dns]::GetHostAddresses("$comp")).IPAddressToString '"{0}","{1}"' -f $comp,$ip | Out-File .\comps.csv }
Zwraca wynik:
"PC912","System.Object[]"
Natomiast sposób '2' tj.:
"Get-AdComputer -filter * -properties * |select Dnshostname, ipv4address"
Zwraca wynik:
Dnshostname ipv4address
----------- -----------
PC912.mkrzanowicz.pl 192.168.100.100
Żeby obsłużyć realne przypadki z wieloma adresami IP należałoby trochę stuningowac sposób '1' żeby wyglądał przykładowo tak:
'"ComputerName","IPAddress"' | Out-File .\comps.csv $comps = (Get-ADComputer -Filter * ).name foreach ($comp in $comps) { $result = $null $ip = ([System.Net.Dns]::GetHostAddresses("$comp")).IPAddressToString $ip | ForEach-Object {$result += "$_ "} '"{0}","{1}"' -f $comp,$result }
I dopiero wtedy zwróci on poprawnie wszystkie przypisane do stacji adresy IP w formie np.:
"PC912","fe80::a888:db2d:dac3:f3b3%8 fe80::6c6d:edd9:33ba:6910%6 192.168.100.100 10.10.10.24 "