从 AD 中的所有 PC 获取主机名和 MAC 地址

Get Hostname and MAC address from all PCs in AD

我正在尝试从 Active Directory 中的所有 PC 获取主机名和 MAC 地址。我知道 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

尝试这样的事情怎么样:

# 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
  • 如果您只想从 Get-ADComputer 获取一个 属性,请不要获取所有
  • 一台计算机可以有多个MAC,以避免返回一个数组加入它们。
  • $result += 每次重建数组时效率低下,请改用 PSCustomObject。

试试这个(未测试):
编辑:第一次测试连接,仅在在线时获得MAC

## Q:\Test18\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