查找存在多个 NIC 的多个服务器的 IP 和 MAC 地址
Find IP and MAC address for several servers where multiple NICs are present
我查看了几个堆栈 posts,虽然大多数都接近实现我正在寻找的目标,但我需要更多地收集 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 字符串并将其输入注册表。
问题
问题是,如果我尝试远程处理的第二部分,它适用于远程计算机,但对于本地计算机,它 returns 所有 网络的 IP 地址接口卡。我尝试从不同的 Stack post:
执行以下解决方法
$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(':','-')
这行得通,但只执行 select -first 感觉有点脏 1. 我已经验证这适用于我的大多数本地机器,但我觉得这并不总是如此案.
问题
如果 select -first 1 始终保证我将获得正确的 IP(即来自本地 Intranet 的 IP)我对此很好,但我知道某些环境有多个 NIC不同网段但在同一个域内,所以我怀疑这行不通。
如果解决方案只是有一个 if(localhost) 然后 做一些事情 否则做远程的事情那也可以,但我不确定我会怎么做着手验证该函数所采用的数组中的服务器名称是否是本地主机。
感谢任何帮助!
编辑:这是我用来提出上述内容的大部分来源:
How can I use PowerShell to make remote registry changes?
https://www.petri.com/powershell-problem-solver-find-ip-address-using-powershell
我发现了一个肮脏的解决方案,我强制脚本的用户输入本地 IP 地址。当我查找 IP 地址时,我还会执行 string-matching 来验证我是否是 运行 本地脚本。如果是,我会使用手动输入的 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 地址的解决方案),我会洗耳恭听。目前,这符合我的目标,但我对此并不完全满意。
我查看了几个堆栈 posts,虽然大多数都接近实现我正在寻找的目标,但我需要更多地收集 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 字符串并将其输入注册表。
问题
问题是,如果我尝试远程处理的第二部分,它适用于远程计算机,但对于本地计算机,它 returns 所有 网络的 IP 地址接口卡。我尝试从不同的 Stack post:
执行以下解决方法$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(':','-')
这行得通,但只执行 select -first 感觉有点脏 1. 我已经验证这适用于我的大多数本地机器,但我觉得这并不总是如此案.
问题
如果 select -first 1 始终保证我将获得正确的 IP(即来自本地 Intranet 的 IP)我对此很好,但我知道某些环境有多个 NIC不同网段但在同一个域内,所以我怀疑这行不通。
如果解决方案只是有一个 if(localhost) 然后 做一些事情 否则做远程的事情那也可以,但我不确定我会怎么做着手验证该函数所采用的数组中的服务器名称是否是本地主机。
感谢任何帮助!
编辑:这是我用来提出上述内容的大部分来源:
How can I use PowerShell to make remote registry changes?
https://www.petri.com/powershell-problem-solver-find-ip-address-using-powershell
我发现了一个肮脏的解决方案,我强制脚本的用户输入本地 IP 地址。当我查找 IP 地址时,我还会执行 string-matching 来验证我是否是 运行 本地脚本。如果是,我会使用手动输入的 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 地址的解决方案),我会洗耳恭听。目前,这符合我的目标,但我对此并不完全满意。