需求来源:某个组织的Active Directory域,其中的一部分域控制器的SRV记录会无缘无故的丢掉,dcdiag检查dns的时候,发现一大堆报错,看到报错基本就不想弄了,实在太多……

PowerShell可以快速的创建A记录和DNS记录。

我们看一下标准的SRV记录是什么样子的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
PS C:\> Get-WmiObject  -Namespace root\MicrosoftDNS -class microsoftdns_srvtype | ? { $_ .DnsServerName  -eq  "dc.contoso.com" }
 
 
__GENUS            : 2
__CLASS            : MicrosoftDNS_SRVType
__SUPERCLASS       : MicrosoftDNS_ResourceRecord
__DYNASTY          : CIM_ManagedSystemElement
__RELPATH          : MicrosoftDNS_SRVType.ContainerName= "_msdcs.contoso.com" ,DnsServerName= "DC.contoso.com" ,DomainName= "_tcp.Default-First-Site-Name._sites.dc._msdcs.contoso.com" ,OwnerName= "_kerberos.
                      _tcp.Default-First-Site-Name._sites.dc._msdcs.contoso.com" ,RecordClass=1,RecordData= "0 100 88 dc2.contoso.com."
__PROPERTY_COUNT   : 18
__DERIVATION       : {MicrosoftDNS_ResourceRecord, CIM_LogicalElement, CIM_ManagedSystemElement}
__SERVER           : DC
__NAMESPACE        : root\MicrosoftDNS
__PATH             : \\DC\root\MicrosoftDNS:MicrosoftDNS_SRVType.ContainerName= "_msdcs.contoso.com" ,DnsServerName= "DC.contoso.com" ,DomainName= "_tcp.Default-First-Site-Name._sites.dc._msdcs.contoso.com
                      " ,OwnerName= "_kerberos._tcp.Default-First-Site-Name._sites.dc._msdcs.contoso.com" ,RecordClass=1,RecordData= "0 100 88 dc2.contoso.com."
Caption            : 
ContainerName      : _msdcs.contoso.com
Description        : 
DnsServerName      : DC.contoso.com
DomainName         : _tcp. Default -First-Site-Name._sites.dc._msdcs.contoso.com
InstallDate        : 
Name               : 
OwnerName          : _kerberos._tcp. Default -First-Site-Name._sites.dc._msdcs.contoso.com
Port               : 88
Priority           : 0
RecordClass        : 1
RecordData         : 0 100 88 dc2.contoso.com.
SRVDomainName      : dc2.contoso.com.
Status             : 
TextRepresentation : _kerberos._tcp. Default -First-Site-Name._sites.dc._msdcs.contoso.com  IN  SRV 0 100 88 dc2.contoso.com.
Timestamp          : 3633513
TTL                : 600
Weight             : 100
PSComputerName     : DC

我们注意一下,有用的地方是如下几行

1
2
3
4
5
ContainerName      : _msdcs.contoso.com
DnsServerName      : DC.contoso.com
OwnerName          : _kerberos._tcp. Default -First-Site-Name._sites.dc._msdcs.contoso.com
RecordData         : 0 100 88 dc2.contoso.com.
TextRepresentation : _kerberos._tcp. Default -First-Site-Name._sites.dc._msdcs.contoso.com  IN  SRV 0 100 88 dc2.contoso.com.

首先要说明的就是容器名,这里主要是注意,msdcs这个容器。另外dnsservername就是当前需要操作的域控制器名。

在TextRepresentation : _kerberos._tcp.Default-First-Site-Name._sites.dc._msdcs.contoso.com IN SRV 0 100 88 dc2.contoso.com. 这句中,则包含了我们要手动输入的所有信息。

我们构造一句话,最后一句就实现了目标功能

1
2
3
4
$dnsServerName = "dc.contoso.com"
$containerName = "_msdcs.contoso.com"
$mydns  [WMIClass] "ROOT\MicrosoftDNS:MicrosoftDNS_ResourceRecord"
$mydns .CreateInstanceFromTextRepresentation( $dnsServerName , $containerName ,_kerberos._tcp. Default -First-Site-Name._sites  IN  SRV 0 100 88 dc3332.contoso.com.)

最后再来完善一下,在非5大角色的域控制器上运行 dcdiag /test:dns /s:domainname /v 看一下dns输出记录。可以添加相应条目

1
2
3
4
5
6
7
8
9
10
11
#脚本需要在PowerShell中运行,首先打开cmd,然后输入PowerShell。 最后在脚本当前目录,输入   .\xxxx.ps1
$hostdc Read-Host  “(请输入需要添加SRV记录的域控制器的netbios名)”
$dnsServerName = "dc.contoso.com"
$containerName = "_msdcs.contoso.com"
$containerName2 = "contoso.com"
$site  = "Default-First-Site-Name"  #此处输入站点名
$mydns  [WMIClass] "ROOT\MicrosoftDNS:MicrosoftDNS_ResourceRecord"
#增加 “DC”“站点”中的kerberos的tcp srv记录
$mydns .CreateInstanceFromTextRepresentation( $dnsServerName , $containerName , "_kerberos._tcp.$site._sites.dc IN SRV 0 100 88 $hostdc" ) |select  RR
#增加“GC”“站点”中的tcp ldap记录
$mydns .CreateInstanceFromTextRepresentation( $dnsServerName , $containerName , "_ldap._tcp.$site._sites.gc IN SRV 0 100 88 $hostdc" ) |select  RR




本文转自 九叔 51CTO博客,原文链接:http://blog.51cto.com/jiushu/1672103,如需转载请自行联系原作者