簡體   English   中英

查找存在多個NIC的幾台服務器的IP和MAC地址

[英]Find IP and MAC address for several servers where multiple NICs are present

我到處查看了幾篇堆棧文章,盡管大多數文章都接近實現我所尋找的目標,但我需要使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(':','-')

這可以工作,但是僅執行select -first 1.感覺有點骯臟。我已經證實這對我的大多數本地計算機都有效,但是我感覺並非總是如此。

如果select -first 1始終保證我將獲得正確的IP(即來自本地Intranet的IP),我就可以了,但是我知道某些環境在同一域內有多個用於不同網段的NIC,所以我懷疑這行不通。

如果解決方案是僅擁有一個if(localhost)然后執行其他操作來完成遠程操作,那也將起作用,但是我不確定如何驗證該函數所使用的數組中的服務器名稱是否為本地主機。

任何幫助表示贊賞!

編輯:這是我以前想出的大多數資源:

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

如何使用PowerShell進行遠程注冊表更改?

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

我發現了一個骯臟的解決方案,在其中我迫使腳本用戶輸入本地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地址的解決方案),我將不知所措。 目前,這已經達到了我的目標,但是我對此並不完全滿意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM