我有一个powershell脚本,可以在本地或远程计算机上运行某些命令。 当计算机处于远程状态时,将通过Invoke-Command调用该命令,并提示用户输入其他凭据。
用户可以输入脚本参数,该参数可以是:hostname,IP,127.0.0.1,来自hosts文件的别名。 我需要检查该参数是否适用于本地或远程计算机,以便调用本地命令或Invoke-Command。 我曾经这样做过:
Function IsLocalhost {
Param([string] $srvname)
$script:AVLserverHost = $srvname.Split('\')[0]
#Write-Host ("HOST: " + $script:AVLserverHost)
if ((get-content env:computername) -eq $script:AVLserverHost) {
return $true;
} else {
$AddressList = @(([net.dns]::GetHostEntry($script:AVLserverHost)).AddressList)
$script:HostIp = $AddressList.IpAddressToString
$name = [System.Net.Dns]::gethostentry($script:HostIp)
if ((get-content env:computername) -eq $name.HostName) {
return $true
}
}
return $false
}
但它只适用于域DNS。我们的计算机位于工作组或独立计算机上,我们只能通过IP或来自hosts文件的别名连接。
那么如果主机不在域DNS中,如果给定主机是本地主机,则如何检查powershell(或c#代码)。 如果它是本地的,我想有真/假,如果输入了主机名或主机别名,我想要它的真实IP地址。
答案 0 :(得分:2)
你可以试试这个:
function Is-LoopBackAddress([string] $Address)
{
$addressIPs = [Net.Dns]::GetHostAddresses($Address).IPAddressToString
$netInterfaces = [Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces()
foreach ($netInterface in $netInterfaces)
{
$ipProperties = $netInterface.GetIPProperties()
foreach ($ip in $ipProperties.UnicastAddresses)
{
if ($addressIPs -contains $ip.Address.IPAddressToString)
{
return $true
}
}
}
return $false
}
Is-LoopBackAddress 'localhost'
答案 1 :(得分:1)
您可以生成本地IP的数组,将localhost添加到数组中,然后查看您的参数是否在数组中。这是ipv4的ps2.0兼容版本。
$LocalArray = @()
$LocalArray += (gwmi Win32_NetworkAdapterConfiguration | ? {$_.IPAddress}) | select -expand ipaddress | select-string -notmatch ":"
$LocalArray += 'localhost'
$LocalArray += '127.0.0.1'
$LocalArray += hostname
$LocalArray -contains $IP
答案 2 :(得分:0)
我将@Noah的代码与其他示例相结合,如何读取hosts文件,这是最终代码:
Function IsLocalhost {
Param([string] $srvname)
$script:AVLserverHost = $srvname.Split('\')[0]
#get list of localhost addresses
$localAddresses = @()
$localAddresses += (gwmi Win32_NetworkAdapterConfiguration | ? {$_.IPAddress}) | select -expand ipaddress | select-string -notmatch ":"
$localAddresses += 'localhost'
$localAddresses += '127.0.0.1'
$localAddresses += hostname
$hosts = "$env:windir\System32\drivers\etc\hosts"
[regex]$r="\S" #define a regex to return first NON-whitespace character
#strip out any lines beginning with # and blank lines
$HostsData = Get-Content $hosts | where {
(($r.Match($_)).value -ne "#") -and ($_ -notmatch "^\s+$") -and ($_.Length -gt 0)
}
$HostsData | foreach {
$_ -match "(?<IP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s+(?<HOSTNAME>\S+)" | Out-Null
$ip = $matches.ip
$hostname = $matches.hostname
if ($localAddresses -contains $ip) {
$localAddresses += $hostname
}
}
if ($localAddresses -contains $script:AVLserverHost) {
return $true;
} else {
$script:HostIp = (Test-Connection $script:AVLserverHost | Select-Object IPV4Address)[0].IPV4Address.IPAddressToString
}
return $false
}