查找存在多个NIC的多个服务器的IP和MAC地址

时间:2018-03-15 08:09:50

标签: powershell networking windows-server-2016

我查看了几个堆栈帖子,虽然大多数都接近实现我正在寻找的东西,但我需要使IP和MAC地址的收集更加动态。

目标

我正在使用PowerShell在网络中的多个服务器的注册表中进行一些修改。我将向一个函数发送一个包含多个服务器名称的数组,该函数为每个服务器名称创建一个具有以下结构的字符串:

ComputerName@IPAddress:MACaddress

该字符串中的一个服务器将与我运行脚本的服务器相同,但脚本不知道它是哪一个。我需要能够,无论服务器是本地主机还是远程服务器,都要创建上面的字符串。

到目前为止工作

如果我在本地运行,我可以使用以下代码:

$ServerName = $env:COMPUTERNAME
$IPAddress = "192.168.0.1"
$MACAddress = ((Get-WmiObject win32_networkadapterconfiguration | where{$_.IPAddress -like "*$IPaddress*"} | select macaddress).macaddress).Replace(':','-')

$RegistryString = "$ServerName@$IPaddress"+":$MacAddress"

这没有问题。如果我想远程操作,下面的工作很有用:

$ServerName = "MyRemoteServer"
$IPAddress = ([System.Net.Dns]::GetHostAddresses($ServerName)).IPAddressToString
$MACAddress = ((Get-WmiObject win32_networkadapterconfiguration -ComputerName $ServerName | where{$_.IPAddress -like "*$IPaddress*"} | select macaddress).macaddress).Replace(':','-')

我想要做的是将一组计算机名称发送到一个函数,该函数为每个服务器创建ServerName @ IPAddress:MACAddress字符串并将其输入注册表。

问题

问题在于,如果我尝试远程计算机的第二部分,它适用于远程计算机,但对于本地计算机,它会返回所有网络接口卡的IP地址。我尝试从另一个Stack帖子中执行以下解决方法:

$ServerName = "MyArbitraryServerName"
$NIC = Get-WmiObject Win32_NetworkAdapter -ComputerName $ServerName | select -First 1
$IPAddress = $NIC.GetRelated("Win32_NetworkAdapterConfiguration") | select -expand IPAddress -first 1
$MACAddress = ((Get-WmiObject win32_networkadapterconfiguration -ComputerName $ServerName | where{$_.IPAddress -like "*$IPaddress*"} | select macaddress).macaddress).Replace(':','-')

这很有效,但是选择-first 1感觉有点脏。我已经确认这适用于我的大多数本地机器,但我觉得这并不总是这样。

问题

如果select -first 1始终保证我将获得正确的IP(即来自本地Intranet的IP),我对此很好,但我知道某些环境有几个不同网段的网卡,但在相同的域名,所以我怀疑这不起作用。

如果解决方案只是拥有一个if(localhost),那么做某事其他做远程的东西,然后这也会起作用,但我不知道如何验证是否函数所采用的数组中的服务器名称是否为本地主机。

感谢任何帮助!

编辑:以下是我用来提出上述内容的大部分资料来源:

https://social.technet.microsoft.com/Forums/windowsserver/en-US/a4512ce9-8ca2-413d-80d2-88da1e48dcd8/remote-registry-change-via-powershell?forum=winserverManagement

How can I use PowerShell to make remote registry changes?

https://blogs.technet.microsoft.com/heyscriptingguy/2014/11/07/powertip-use-powershell-to-find-mac-address/

https://www.petri.com/powershell-problem-solver-find-ip-address-using-powershell

1 个答案:

答案 0 :(得分:0)

我找到了一个脏的解决方案,我强制脚本的用户输入本地IP地址。当我进行IP地址查找时,我也会进行字符串匹配,以验证我是否在本地运行脚本。如果是,我使用手动输入的IP地址。这是完整的解决方案:

function global:SetServerMacMap{

param(
    [Parameter(mandatory=$true)][String]$ServerName,
    [Parameter(mandatory=$true)][String]$LocalIPAddress
)

$IPAddress = ([System.Net.Dns]::GetHostAddresses($ServerName)).IPAddressToString

if($IPAddress -match $LocalIPAddress){
    $IPAddress = $LocalIPAddress
}

$MACAddress = ((Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $ServerName | where{$_.IPAddress -like "*$IPaddress*"} | select macaddress).macaddress).Replace(':','-')

$ServerMacMap = "$ServerName@$IPaddress"+":$MacAddress"

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $NSSServerName ) 
        $regKey= $reg.OpenSubKey("SOFTWARE\\MySoftware\\Settings",$true) 
        $regKey.SetValue('ServerMacMap',$ServerMacMap,[Microsoft.Win32.RegistryValueKind]::String)
}

如果有更优雅的解决方案更具动态性(即,不需要手动输入IP地址的解决方案),我会全力以赴。现在,这就是我的目标,但我并不完全满意。