我需要创建一个IP地址和DNS名称列表。一世 我试图从IP地址获取DNS名称。我尝试了两种方法:
try
/ catch
但之后结束。这是我到目前为止所拥有的:
#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 }
# }
答案 0 :(得分:1)
试试这个解决方案:
$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
}
我们创建一个对象,其中包含IPaddress,如果无法解析,则创建主机名n/a
。然后,对象被导出到文件中。你会得到类似的东西:
192.0.0.1; Server1
答案 1 :(得分:0)
这使用工作流程,因此它可以执行并行的foreach
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"
答案 2 :(得分:0)
您可能想尝试这里提供的其他解决方案,但这里有一些您可能想要考虑的事项。
首先,我建议不将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
}
}
}
当您捕获异常时,只有在"所请求的名称有效且"的情况下,您才会写入文本文件。 (你的意思是 有效?)。否则你永远不会写任何文件。因此,回到原始代码:
其他事项:
您使用两种方法写入文件:>>
和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
@ restless1987建议了一种确保将IP地址和主机名(如果确定)写入输出文件的方法。我要看一下,看看发生了什么。
我的最后一个提示是要谨慎使用.txt
从Get-Content
文件中读取。它们通常具有尾随(空白)行,您可能想要尝试忽略这些空白。在这种情况下可能不是一个大问题,因为它只是意味着DNS尝试失败,但我已经看到这样的事情在与其他命令一起使用时对(非常)大公司的每个邮箱造成严重破坏。
答案 3 :(得分:0)
另一种方式......
$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 }
}
}
答案 4 :(得分:0)
有许多工具可以实现这一目标,但如果你需要一个快速而肮脏的解决方案,你可以在任何地方运行,这将完成工作。
使用永久有用的ps tools psloggedon /accepteula \\computername or ip address
,例如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
,您可以获取当前登录的用户,以检查这是否是正确的机器。例如:
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
现在您已确认此IP地址是此用户的正确IP地址。我们只需要使用nslookup查找IP地址。
<paper>
<header>
</header>
<body>
<paragraph>
</paragraph>
</body>
<conclusion>
</conclusion>
</paper>
现在我们知道该计算机的计算机名称是Workstation07。