none
VBS或者Powershell更新DNS zone下的A记录 RRS feed

  • 问题

  • 我当前环境下的DNS默认zone为ixmsoft.com,然后我又新建了一个oa.ixmsoft.com zone

    在oa.ixmsoft.com zone下新建了一条A记录---->oa.ixmsoft.com - A - 192.168.2.100由于网络问题,我想自动更新这条记录

    比如通过vbs或者powershell ping 192.168.2.100 如果不通了,就将192.168.2.100的地址更新为192.168.2.101,谢谢

    这个vbs或者powershell 不知道怎么写,望回复

    2019年6月18日 16:06

答案

  • 您好!

    感谢您的回复。

    是这样的,因为您是在计划任务中执行,每隔30秒执行一次,所以相当于外围已经是个循环,那中间执行部分用上述分支语句就已经可以实现我们的目的。可以把 Else 部分去除,仅仅是供参考的(目的是提供一个默认值,如果3个都不通的话)。假设第一次100不通,则DNS会更新为101或者102;过30秒(计划任务的时间),再次查询的时候,发现100通了,则会更新为100

    如果您偏向于使用 foreach 来实现,可以辅以 break来跳出循环。以下的语句可以和上述分支实现类似的功能,供您参考。

    因为不确定以前有几条@的A记录,所以先执行Remove语句,是为了简化脚本。

    $servers = "10.1.1.20", "10.1.1.30", "10.1.1.10"
    $zone = "oa.sc.com"

    Remove-DnsServerResourceRecord -ZoneName $zone -RRType "A" -Name "@" -Force

    foreach ($s in $servers)
    {
    If (Test-Connection -computername $s -Quiet) 
    {
    Add-DnsServerResourceRecord -ZoneName $zone -A -Name "@" -IPv4Address $s
    break
    }
    }

    如果您有任何疑问,请您及时告知我。

    Regards,

    Alex Zhu
    -----------------------------------------------
    如果回复有帮助, 请记住将其标记为答案。
    如果您有有关 technet 订阅者支持的反馈, 请联系 tnmff@microsoft.com.
    2019年6月20日 2:29

全部回复

  • 您好!

    感谢您的上贴。

    可以尝试以下的PowerShell 语句:

    if (-not (Test-Connection -computername "192.168.2.100" -Quiet))  {

    Remove-DnsServerResourceRecord -ZoneName "oa.sc.com" -RRType "A" -Name "@" -RecordData "192.168.2.100" -Force
    Add-DnsServerResourceRecord -ZoneName "oa.sc.com" -A -Name "@" -IPv4Address "192.168.2.101"

    }

    说明:
    1,如果在DNS中名称是“(与父文件夹相同)”,则使用“@”作为名称
    2,test-connection 会发送4个封包给目标计算机,类似于 ping 命令,在失败后,才会执行下面的操作,需要等待一小段时间,直至命令完成。
    3,在DNS服务器进行修改后,客户端需要执行 ipconfig /flushdns 来进行刷新

    截图如下(供您参考):
    运行前:



    运行界面:



    运行后:


    如果您有任何疑问,请您及时告知我。

    Regards,

    Alex Zhu
    -----------------------------------------------
    如果回复有帮助, 请记住将其标记为答案。
    如果您有有关 technet 订阅者支持的反馈, 请联系 tnmff@microsoft.com.
    2019年6月19日 5:48
  • 您好,感谢您的回复,我运行了脚本可以更新,但是是否脚本可以优化一下。

    脚本我最终是通过计划任务每隔1分钟执行一次,是否可以再根据需求更新一下脚本,非常感谢。

    需求更新:如果192.168.2.100不通,将对应的解析更新为192.168.2.101,,如果192.168.2.101还不通,将对已经的解析更新为192.168.2.102,最终如果192.168.2.100通了,再次将解析跟新到192.168.2.100

    2019年6月19日 6:43
  • 您好,如果按照我的需求执行的话,需要执行三条语句,请帮忙优化一下脚本,谢谢

    $ipaddr1="192.168.2.100"
    $ipaddr2="192.168.2.101"
    $ipaddr3="192.168.2.102"
    $zname="oa.ixmsoft.com"

    if (-not (Test-Connection -computername $ipaddr1 -Quiet))  {

    Remove-DnsServerResourceRecord -ZoneName $zname -RRType "A" -Name "@" -RecordData $ipaddr1 -Force
    Add-DnsServerResourceRecord -ZoneName $zname -A -Name "@" -IPv4Address $ipaddr2

    }


    if (-not (Test-Connection -computername $ipaddr2 -Quiet))  {

    Remove-DnsServerResourceRecord -ZoneName $zname -RRType "A" -Name "@" -RecordData $ipaddr2 -Force
    Add-DnsServerResourceRecord -ZoneName $zname -A -Name "@" -IPv4Address $ipaddr3

    }



    if (Test-Connection -computername $ipaddr1 -Quiet)  {

    Remove-DnsServerResourceRecord -ZoneName $zname -RRType "A" -Name "@" -RecordData $ipaddr2 -Force
    Add-DnsServerResourceRecord -ZoneName $zname -A -Name "@" -IPv4Address $ipaddr1

    }

    2019年6月19日 8:43
  • 您好!

    感谢您的回复。

    我理解了下您的意思:就是这三台机器中,哪一台可以ping通,DNS就设置为哪一台。可以使用以下的脚本实现:




    test.ps1 内容如下:

    Remove-DnsServerResourceRecord -ZoneName "oa.sc.com" -RRType "A" -Name "@" -Force

    If (Test-Connection -computername "192.168.2.100" -Quiet) {
    Add-DnsServerResourceRecord -ZoneName "oa.sc.com" -A -Name "@" -IPv4Address "192.168.2.100"
    }

    ElseIf (Test-Connection -computername "192.168.2.101" -Quiet) {
    Add-DnsServerResourceRecord -ZoneName "oa.sc.com" -A -Name "@" -IPv4Address "192.168.2.101"
    }

    ElseIf (Test-Connection -computername "192.168.2.102" -Quiet) {
    Add-DnsServerResourceRecord -ZoneName "oa.sc.com" -A -Name "@" -IPv4Address "192.168.2.102"
    }

    Else {
    Add-DnsServerResourceRecord -ZoneName "oa.sc.com" -A -Name "@" -IPv4Address "192.168.2.100"
    }


    如果您有任何疑问,请您及时告知我。

    Regards,

    Alex Zhu
    -----------------------------------------------
    如果回复有帮助, 请记住将其标记为答案。
    如果您有有关 technet 订阅者支持的反馈, 请联系 tnmff@microsoft.com.
    2019年6月19日 8:56
  • 您好,不好意思~是我没描述明白,请抱歉。

    具体需求见下:

    我们一共有三个地址,但是建议默认使用第一个地址,如果第一个地址不通了,就更新第二个地址,如果第一个地址和第二个地址都不通了,就更新到第三个地址,当第一个地址通了,继续更新到第一个地址,

    2019年6月19日 9:15
  • 因为我对powershell不是很熟,还在学习中,请帮忙再优化下,谢谢

    比如用foreach  break  continue 等来实现,另外必须要删除然后再增加么,比如有没有update 或者set的参数来修改呢。

    2019年6月19日 9:17
  • 您好!

    感谢您的回复。

    是这样的,因为您是在计划任务中执行,每隔30秒执行一次,所以相当于外围已经是个循环,那中间执行部分用上述分支语句就已经可以实现我们的目的。可以把 Else 部分去除,仅仅是供参考的(目的是提供一个默认值,如果3个都不通的话)。假设第一次100不通,则DNS会更新为101或者102;过30秒(计划任务的时间),再次查询的时候,发现100通了,则会更新为100

    如果您偏向于使用 foreach 来实现,可以辅以 break来跳出循环。以下的语句可以和上述分支实现类似的功能,供您参考。

    因为不确定以前有几条@的A记录,所以先执行Remove语句,是为了简化脚本。

    $servers = "10.1.1.20", "10.1.1.30", "10.1.1.10"
    $zone = "oa.sc.com"

    Remove-DnsServerResourceRecord -ZoneName $zone -RRType "A" -Name "@" -Force

    foreach ($s in $servers)
    {
    If (Test-Connection -computername $s -Quiet) 
    {
    Add-DnsServerResourceRecord -ZoneName $zone -A -Name "@" -IPv4Address $s
    break
    }
    }

    如果您有任何疑问,请您及时告知我。

    Regards,

    Alex Zhu
    -----------------------------------------------
    如果回复有帮助, 请记住将其标记为答案。
    如果您有有关 technet 订阅者支持的反馈, 请联系 tnmff@microsoft.com.
    2019年6月20日 2:29
  • 非常感谢您的回复,再次感谢。
    2019年6月20日 2:36