Получить имя хоста и MAC-адрес со всех компьютеров в AD - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь получить имя хоста и MAC-адрес со всех компьютеров в Active Directory. Я знаю, что MAC-адреса отсутствуют в каталоге Activce. Вот почему я уже использовал небольшой сценарий от кого-то еще. Дело в том, что мне нужно составить список имен хостов, что я могу сделать, но затем другой скрипт сталкивается с проблемой, потому что некоторые компьютеры не подключены к сети.

Может кто-нибудь помочь мне получить список только с компьютерами, которые в сети?

Это часть, которая ищет список, который я создаю, с именами хостов.

$Computers = Import-CSV C:\Users\admin_stagiair\Desktop\Computers.txt
$result = @()
foreach ($c in $Computers){
    $nic = Invoke-Command {
        Get-WmiObject Win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"'
    } -ComputerName $c.Name
    $x = New-Object System.Object | select ComputerName, MAC
    $x.Computername = $c.Name
    $x.Mac = $Nic.MACAddress
    $result += $x
}
$result | Export-Csv C:\Users\admin_stagiair\Desktop\Computers.csv -Delimiter ";" -NoTypeInformation

И это та часть, в которой я пытался выполнить поиск в списке и отфильтровать онлайн-компьютеры, которые абсолютно не работают, и я не могу понять, как это сделать.

$Computers = Import-Csv C:\Users\admin_stagiair\Desktop\Computers.txt
foreach ($c in $Computers) {
    $ping = Test-Connection -Quiet -Count 1
    if ($ping) {
        $c >> (Import-Csv -Delimiter "C:\Users\admin_stagiair\Desktop\online.txt")
    } else {
        "Offline"
    }
}

Последний бит, это часть, которую я использую для создания списка всех компьютеров в Active Directory.

Get-ADComputer -Filter {enabled -eq $true} -Properties * |
    select Name > C:\Users\(user)\Desktop\Computers.txt

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018
  • Если вам нужно только одно свойство от Get-ADComputer, не выбирайте все
  • на компьютере может быть несколько MAC, чтобы избежать возврата массива, присоединитесь к ним.
  • $result += неэффективно перестраивает массив каждый раз, вместо этого используйте PSCustomObject.

Попробуйте это (не проверено):
РЕДАКТИРОВАТЬ: первое тестовое соединение, получить MAC только когда онлайн

## Q:\Test\2018\09\18\SO_52381514.ps1

$Computers = (Get-ADComputer -Filter {enabled -eq $true} -Property Name).Name

$result = ForEach ($Computer in $Computers){
    If (Test-Connection -Quiet -Count 1 -Computer $Computer){
        [PSCustomPbject]@{
            ComputerName = $Computer
            MAC = (Invoke-Command {
                     (Get-WmiObject Win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"').MACAddress -Join ', '
                  } -ComputerName $Computer)
            Online = $True
            DateTime = [DateTime]::Now
        }
    } Else {
        [PSCustomPbject]@{
            ComputerName = $Computer
            MAC = ''
            Online = $False
            DateTime = [DateTime]::Now
        }
    }

}
$result | Export-Csv C:\Users\admin_stagiair\Desktop\Computers.csv -Delimiter ";" -NoTypeInformation
0 голосов
/ 18 сентября 2018

Как насчет того, чтобы попробовать что-то вроде этого:

# Get all computers in list that are online
$Computers = Import-Csv C:\Users\admin_stagiair\Desktop\Computers.txt | 
    Select-Object -ExpandProperty Name | 
    Where-Object {Test-Connection -ComputerName $_ -Count 1 -Quiet}

# Grab the ComputerName and MACAddress
$result = Get-WmiObject -ComputerName $computers -Class Win32_NetworkAdapterConfiguration -Filter 'ipenabled = "true"' |
    Select-Object -Property PSComputerName, MacAddress

$result | Export-Csv C:\Users\admin_stagiair\Desktop\Computers.csv -Delimiter ";" -NoTypeInformation
...