Get-ADComputer junto com ipv4address de Test-Connection

0

Eu tenho uma lista de ADComputers

$computers = Get-ADComputer -Filter {Name -like "Foo*"}

Eu quero ver o subconjunto daqueles que estão on-network e retornando pings agora.

$results = @()
foreach ($computer in $computers) {
    if (Test-Connection -ComputerName $computer.Name -Count 1 -Quiet) {
        $results += $computer
    }
}

no entanto, agora descubro que quero o objeto ADComputer e o IPv4Address que retornaram de TestConnection , portanto, pensei em filtrar novamente e encapsular o computador em uma hashtable personalizada junto com o IPv4Address retornado.

$results2 = @()
foreach ($result in $results) {
    $ipv4 = Test-Connection -ComputerName $result.Name -Count 1 | Select -ExpandProperty IPv4Address
    $results2 += @{Computer=$result; IPv4Address=$ipv4}
}

e depois obter meus resultados com

$results2 | Format-Table Computer.Name, IPv4Address

No entanto, meus resultados estão em branco

Computer.Name IPv4Address
------------- -----------
(many blank rows follow)

Como posso obter os resultados que espero disso? Ou alternativamente: estou latindo na árvore errada e há uma maneira mais fácil de fazer isso?

    
por Adam Smith 22.01.2018 / 19:33

3 respostas

1
$results = foreach ($c in $computers)
{
    $ipv4 = Test-Connection -ComputerName $c.name -count 1 | select -expand IPV4Address
    [PSCustomObject]@{ "Computer" = $c.name ; "IPV4" = $($ipv4.IPAddressToString) }
}

você tem essas linhas vazias porque a propriedade IPV4Address contém várias propriedades em vez de uma string. a propriedade IPAddressToString contém o endereço IPv4 por si próprio

sua saída será salva em $results se você quiser que eles saiam diretamente, apenas remova a variável na frente de foreach

Eu usei PSCustomObject para isso porque gosto de nomear minhas propriedades, se você quiser mudar isso para um hashtable , mude a última linha de código para:

[hashtable]@{ $c = $($ipv4.IPAddressToString) }
    
por 23.01.2018 / 08:03
1

Tente isso ...

Clear-Host
(Get-ADComputer -Filter *).Name | %{
If (Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue)
{
    Test-Connection -ComputerName $_ -Count 1 '
    | Select Address,ProtocolAddress,
    @{Name = 'Status';Expression = {'Online'}}
}
Else{$_ | Select @{Name = 'Address';Expression = {$_}},
@{Name = 'ProtocolAddress';Expression = {'NoAddress'}},
@{Name = 'Status';Expression = {'Offline'}}
}} | Format-Table -AutoSize

Resultados

Address  ProtocolAddress Status 
-------  --------------- ------ 
DC01     192.168.0.11    Online 
EX01     192.168.2.12    Online 
...
WS01     NoAddress       Offline
IIS01    192.168.7.11    Online
... 

Ou aqui está outra maneira de fazer o que você está depois

Clear-Host
(Get-ADComputer -Filter *).Name | %{
If (Test-Connection -ComputerName $_ -Count 1 -ErrorAction SilentlyContinue)
{Resolve-DnsName -Name $_ -Type A '
| Select Name,IPaddress,@{Name = 'Status';Expression = {'Online'}}}
Else{
Resolve-DnsName -Name $_ -Type A -ErrorAction SilentlyContinue '
| Select Name,IPaddress,@{Name = 'Status';Expression = {'Offline'}}
}}

Resultados

Name                       IPAddress     Status
----                       ---------     ------
DC01.contoso.com     192.168.0.11  Online
EX01.contoso.com     192.168.2.12  Online
...
WS01.contoso.com     192.168.8.30  Offline
IIS01.contoso.com    192.168.7.11  Online
...
    
por 23.01.2018 / 09:33
-1

Eu tenho um script do PowerShell para essa tarefa exata:

$computers = Get-Content "ListOfWrkStns_Jan18.txt"  

foreach ($computer in $computers) {  

    if (test-Connection -ComputerName $computer -Count 2 -Quiet ) {   

        "$computer is up."  

                } else  

                {"$computer is DOWN!"  

                }      

} 

Você só precisa criar um arquivo "ListOfWrkStns.txt" (lista de estações de trabalho) para alimentar a entrada de todos os nomes de máquinas.

    
por 22.01.2018 / 20:04

Tags