Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 来自IP地址的DNS名称_Powershell - Fatal编程技术网

Powershell 来自IP地址的DNS名称

Powershell 来自IP地址的DNS名称,powershell,Powershell,我需要创建一个IP地址和DNS名称的列表。我 我正在尝试从IP地址获取DNS名称。我试过两种方法: 尝试/接住,但之后就结束了。 没有,它只输出我无法关联到IP地址的DNS名称。 以下是我目前掌握的情况: #try { Get-Content C:\Users\pintose\Documents\IP_Address.txt | ForEach-Object {([system.net.dns]::GetHostByAddress($_)).hostname >> C:\User

我需要创建一个IP地址和DNS名称的列表。我 我正在尝试从IP地址获取DNS名称。我试过两种方法:

尝试/接住,但之后就结束了。 没有,它只输出我无法关联到IP地址的DNS名称。 以下是我目前掌握的情况:

#try {
 Get-Content C:\Users\pintose\Documents\IP_Address.txt | ForEach-Object 
{([system.net.dns]::GetHostByAddress($_)).hostname >> C:\Users\user\Documents\hostname.txt}
# }
 # catch {
 if ($_.Exception.Message -like "*The requested name is valid*") {
            Write-Output "UNREACHABLE" | Out-File C:\Users\user\Documents\hostname.txt }
# }
尝试以下解决方案:

$outFile = "C:\Users\user\Documents\hostname.txt"

Get-Content C:\Users\pintose\Documents\IP_Address.txt | ForEach-Object {
    $hash = @{ IPAddress = $_
        hostname = "n/a"     
    }
    $hash.hostname = ([system.net.dns]::GetHostByAddress($_)).hostname
    $object = New-Object psobject -Property $hash
    Export-CSV -InputObject $object -Path $outFile -Append -NoTypeInformation
}
我们创建一个对象,其中包含IP地址,如果无法解析,则主机名为n/a。然后,将对象导出到文件中。您将得到如下结果:


192.0.0.1;Server1

这使用了一个工作流,因此它可以对每个服务器执行并行操作

Workflow Get-DNSNames([string[]]$IPAddresses){
    foreach -parallel ($IP in $IPAddresses){
        try{
            @{$IP = $(([system.net.dns]::GetHostByAddress($IP)).hostname)}
        }catch{
            @{$IP = "N/A"}
        }
    }
}

$List = Get-DNSNames -IPAddresses $(Get-Content "C:\IPAddresses.txt").Split("[\r\n]")
$List | Out-File "C:\IPAddresses_Complete.txt"

您可能想尝试这里提供的其他解决方案,但以下是一些您可能需要考虑的问题

首先,我建议不要在整个第一个命令中使用try{}catch{}。如果在数据中循环,而其中一个数据导致异常,则可能无法完成任务。将try{}catch{}放在有风险的代码行周围:

Get-Content C:\Users\pintose\Documents\IP_Address.txt | Foreach-Object {
  try {
    ([system.net.dns]::GetHostByAddress($_)).hostname >> C:\Users\user\Documents\hostname.txt
  }
  catch {
    if ($_.Exception.Message -like "*The requested name is valid*") {
      Write-Output "UNREACHABLE" | Out-File C:\Users\user\Documents\hostname.txt
    }
  }
}
捕获异常时,您只在请求的名称有效的情况下写入文本文件。您的意思是无效吗?。否则,您永远不会向文件写入任何内容。因此,回到原始代码:

如果有任何IP地址引起的异常 例外情况是,请求的名称无效,我认为可能是输入错误? 然后,不会将任何错误写入文件,脚本结束时不必完成所有IP地址。 其他事项:

您使用两种方法写入文件:>>和Out file。可能最好使用PowerShell cmdlet,但使用-Append开关以确保追加到文件末尾:

([system.net.dns]::GetHostByAddress($_)).hostname | Out-File C:\Users\user\Documents\hostname.txt -Append

Write-Output "UNREACHABLE" | Out-File C:\Users\user\Documents\hostname.txt -Append
@他建议了一种方法,确保在确定输出文件时同时写入IP地址和主机名。我会看一看这是怎么回事

我的最后一个建议是小心从包含Get内容的.txt文件中读取。它们通常有尾随的空行,您可能希望尝试忽略这些空行。在这种情况下,这可能不是什么大问题,因为这只意味着DNS尝试失败,但我已经看到,在一家非常大的公司中,当与其他命令一起使用时,这样的事情会对每个邮箱造成严重破坏。

另一种方式

$ip_list = Get-Content ./IP_Address.txt

foreach ($ip in $ip_list) {
    try {
        ([system.net.dns]::GetHostByAddress($ip)).hostname |
            Out-File -FilePath ./hostname.txt -Append
    }
    catch {
        if ($_.Exception.Message -like "*The requested name is valid*") {
            Write-Output "UNREACHABLE" | Out-File -FilePath './hostname.txt' -Append }
    }
}

有很多工具可以实现这一点,但是如果你需要一个快速而肮脏的解决方案,你可以在任何地方运行,这将完成工作

使用永久有用的,如psloggedon/accepteula\\computername或ip地址,您可以找到当前登录的用户,以检查这台计算机是否正确。例如:

c:\pstools>psloggedon /accepteula \\10.0.0.10

loggedon v1.33 - See who's logged on
Copyright ⌐ 2000-2006 Mark Russinovich
Sysinternals - www.sysinternals.com

Users logged on locally:
    Error: could not retrieve logon time
NT AUTHORITY\LOCAL SERVICE
 Error: could not retrieve logon time
NT AUTHORITY\NETWORK SERVICE
 1/12/2015 8:06:51 AM    DOMAIN\user
 Error: could not retrieve logon time
NT AUTHORITY\SYSTEM

Users logged on via resource shares:
 1/17/2015 2:26:43 PM    DOMAIN\user
现在,您已经确认此IP地址是该用户的正确IP地址。我们只需要使用nslookup查找IP地址

C:\>nslookup 10.0.0.10
Server:  server.domain.com
Address:  10.10.0.1

Name:    Workstation07.server.domain.com
Address:  10.0.0.10

现在我们知道这台计算机的名称是Workstation07。

Wow!非常感谢!这非常有帮助,非常感谢您花时间发布和编写代码。查理·乔恩特:那么,你对阅读.txt文件有什么建议呢?如果有空行,它们仍然需要处理。在这种情况下,我希望在导入CSV时使用CSV,而不是纯文本文件。如果您需要在文本文件中使用“获取内容”,可以在循环每行时添加一个检查,例如,$\uu-match\S+将是一个简单的检查,以确保至少有一个非空白字符。感谢您花时间提供帮助!谢谢我还没试过,但看起来不错。谢谢你花时间帮忙