ドメイン コントローラーを降格(demote)してメタデータも消したのに、DNS の _ldap・_kerberos・(いわゆる GC レコード)などの SRV が何度削除しても蘇る――この現象は、AD 統合 DNS の複数レイヤーや「静的フラグ」、「アプリケーション パーティション残骸」、NS 設定、KMS の自動登録といった複数の要因が絡み合って発生します。本記事では、再生成のメカニズムを正しく分解し、確実に再出現を止めて完全削除するための包括的な実務手順と検証方法を整理します。
現象の要約
- 降格済みで Active Directory 上から該当 DC(例:DCB)のオブジェクトが見つからない。
- DNS ゾーンから該当 DC の SRV レコード(
_ldap、_kerberos、gc相当)が削除しても復活する。 - 一部に -static フラグが付与され、スカベンジングの対象外になっている。
- 副次的に
_vlmcs._tcp(KMS)レコードも勝手に作られることがある。
SRV レコードが復活するメカニズムの理解
まず、「なぜ復活するのか」を部品ごとに押さえます。
| 要素 | 役割 | 再生成の起点になり得る理由 |
|---|---|---|
| Netlogon による自動登録 | 各現行 DC が %systemroot%\System32\netlogon.dns を元に SRV を登録 | 古い SRV が残ると、複製・再登録・参照が混線して復活に見える |
| AD 統合 DNS のアプリケーション パーティション | DomainDnsZones / ForestDnsZones に DNS オブジェクトを格納 | GUI から見えない残骸が残ると、別の DNS サーバーからレプリケートされ復活 |
| 静的フラグ(-static) | レコードの「動的更新/スカベンジ対象外」を示すビット | スカベンジしても消えないため、手動削除後にどこかから転送されると復活 |
| ゾーンの NS(Name Servers) | 権威 DNS の一覧 | 降格済み DC が NS に残っていると、ゾーン転送の経由で古い SRV が再登場 |
KMS(_vlmcs._tcp) | ソフトウェア ライセンス認証の自動公開 | KMS ホストが DNS へ自動登録を継続し、関連レコードが作られ続ける |
なお「GC レコード」と呼ばれるものは、DNS 上は _ldap._tcp.gc._msdcs.<forest root> 等として登録されます(_gc というサービス名で登録されるわけではありません)。
対応の全体像(先に全体設計)
- 降格・レプリケーションの健全性を再確認(残骸やレプリケーション エラーがあると他の DC/DNS から“復活”)。
- メタデータ クリーンアップと全 DC 同期(構成パーティションの残骸排除)。
- DNS の静的 SRV を明示削除(GUI/コマンド)。
- ADSIEDIT でアプリケーション パーティション中の残骸を直接削除(
DomainDnsZones/ForestDnsZones)。 - ゾーンの NS から古い DC を除外(ゾーン転送の再汚染を阻止)。
- KMS の自動 DNS 公開を停止(該当時)。
- 正規 DC で SRV を再登録し、期待通りの状態に収束させる。
- Aging/Scavenging を設計・有効化(長期的な自動クリーンアップ)。
作業前の安全対策
- 作業対象の DNS ゾーンをエクスポート(ロールバック手段の確保)
dnscmd <DNSサーバー名> /ZoneExport <ゾーン名> <ファイル名>.dns
- 必要に応じて System State バックアップを取得(AD/DNS は密接に連動)。
- メンテナンス時間帯を確保(SRV はクライアントのログオンやサービス探索に影響)。
詳細手順
1. 降格が完了しているかを再確認
GUI 上で見えない残骸やレプリケーション異常があると、別 DC から古い DNS オブジェクトが再転送されます。
- Active Directory ユーザーとコンピューターとActive Directory サイトとサービスの双方で該当 DC が存在しないことを確認。
- レプリケーション健全性の確認:
repadmin /replsummary
repadmin /showrepl * /csv > C:\Temp\repl.csv
repadmin /showrepl <任意の現行DC> /verbose /all /intersite
エラーが出ている場合は、先にレプリケーションの修復を完了させます。
2. メタデータ クリーンアップの再実行と強制同期
降格時の通信不良などで構成パーティションに残骸が残ることがあります。再実行しておくと安心です。
ntdsutil
metadata cleanup
connections
connect to server <健全な現行DC>
quit
select operation target
list domains
select domain <対象ドメイン番号>
list sites
select site <該当サイト番号>
list servers in site
select server <削除対象DC番号(DCBなど)>
quit
remove selected server
quit
完了後、AD の全ドメイン コントローラー間で同期をかけます。
repadmin /syncall /AdeP
3. DNS から静的 SRV レコードを手動削除
SRV が -static の場合、スカベンジでは消えません。GUI か CLI で明示的に削除します。
- DNS マネージャーで該当ゾーンを開き、当該 SRV を手動削除。
- CLI を使う例(SRV 名は環境に合わせて置換):
dnscmd <DNSサーバー名> /RecordDelete <ゾーン名> "_ldap._tcp.dc._msdcs.<forest root>" SRV /f
dnscmd <DNSサーバー名> /RecordDelete <ゾーン名> "_kerberos._tcp.<domain>" SRV /f
PowerShell(DnsServer モジュール)で一括検索・削除する例:
$TargetHost = "DCB.contoso.local"
$Zones = Get-DnsServerZone
foreach ($z in $Zones) {
$records = Get-DnsServerResourceRecord -ZoneName $z.ZoneName -RRType SRV -ErrorAction SilentlyContinue |
Where-Object { $_.RecordData.DomainName -match $TargetHost }
foreach ($r in $records) {
Remove-DnsServerResourceRecord -ZoneName $z.ZoneName -InputObject $r -Force
}
}
4. アプリケーション パーティション(DomainDnsZones / ForestDnsZones)の残骸削除
GUI で見えない“生レコード”が残っていると、そこからレプリケートされて復活します。ADSIEDIT.mscで直接削除します。
- ADSIEDIT を起動し、コンテキストをそれぞれ開く:
CN=MicrosoftDNS,DC=DomainDnsZones,<Domain DN>CN=MicrosoftDNS,DC=ForestDnsZones,<Forest DN>
- 配下のゾーン >
_msdcs、_tcpなどを辿り、オブジェクト名やdnsRecordの中に DCB の FQDN が含まれるものを確認。 - 該当オブジェクトを削除。必要に応じて事前にエクスポート/スクリーンショットで記録。
削除後は再度 repadmin /syncall /AdeP を実行します。
5. ゾーンの NS(Name Servers)を整理
降格済み DC が NS に残っていると、ゾーン転送や権威の解決過程で古い SRV の再登場を招きます。
- DNS マネージャー > ゾーンのプロパティ > Name Servers から古い DC を除外。
- CLI 例:
dnscmd <DNSサーバー名> /RecordDelete <ゾーン名> @ NS DCB.contoso.local. /f
6. KMS(_vlmcs)レコードの扱い
KMS ホストが DNS に SRV を自動登録する設定になっていると、_vlmcs._tcp が再生成されます。不要または管理したい場合は以下を実施します。
- KMS ホスト上で DNS 公開を無効化:
slmgr /cdns
- 不要な
_vlmcs._tcpの SRV を DNS から削除(上記 3 と同様)。
7. 現行 DC で正しい SRV を再登録
不要を消したら、正しい SRV のみを登録させて整合性を回復します。
nltest /dsregdns
ipconfig /registerdns
net stop netlogon && net start netlogon
確認例:
nslookup -type=SRV _ldap._tcp.dc._msdcs.<forest root>
nslookup -type=SRV _kerberos._tcp.<domain>
nslookup -type=SRV _ldap._tcp.gc._msdcs.<forest root>
8. Aging/Scavenging を設計・有効化(再発防止)
長期運用では老朽レコードの自動削除が有効です。No-Refresh/Refresh は典型的に 7/7 日や 7/21 日など、サイトの更新頻度に合わせ調整します。
- サーバー全体のスカベンジ設定(例):
dnscmd <DNSサーバー名> /Config /ScavengingInterval 7
- ゾーン単位で Aging を有効化。
- 古い静的印を動的に変換してスカベンジ対象にする場合:
dnscmd <DNSサーバー名> /AgeAllRecords <ゾーン名>
無計画に /AgeAllRecords を行うと必要な静的レコードまで消える恐れがあるため、事前にリスト化とバックアップを推奨します。
9. マルチベンダー/複製構成の見直し
以下の構成では、別経路から再注入されることがあります。
- セカンダリ/スタブゾーンを他社 DNS や別フォレストから受けている。
- 非 AD 統合のプライマリ ゾーンが混在し、転送/同期の経路が複数ある。
該当する場合、権威の一本化と古い権威サーバーの NS/転送設定の整理 が重要です。次のコマンドで全ゾーンを棚卸しできます。
dnscmd <DNSサーバー名> /EnumZones
10. 監視と自動検出(再発にすぐ気づく)
降格済みホスト名が SRV に紛れ込んだら通知する簡易スクリプト例です。
$TargetHost = "DCB.contoso.local"
$Zones = Get-DnsServerZone
$found = @()
foreach ($z in $Zones) {
$r = Get-DnsServerResourceRecord -ZoneName $z.ZoneName -RRType SRV -ErrorAction SilentlyContinue |
Where-Object { $_.RecordData.DomainName -match $TargetHost }
if ($r) { $found += $r | Select-Object @{n="Zone";e={$z.ZoneName}}, HostName, RecordType, TimeStamp, @{n="Target";e={$_.RecordData.DomainName}} }
}
if ($found.Count -gt 0) {
$found | Format-Table -AutoSize | Out-String | Write-Output
Write-EventLog -LogName Application -Source "DNS-SRV-Monitor" -EventId 9001 -EntryType Warning -Message "SRV for $TargetHost detected."
}
トラブルシュートの要点(よくある落とし穴)
- GUI で見えない SRV 残骸:
ADSIEDIT.mscでCN=MicrosoftDNS,DC=DomainDnsZones/ForestDnsZonesを必ず点検。 - -static は手動削除が必要:スカベンジでは一切消えません。
- NS の見落とし:ゾーンの権威に古い DC が残ると、ゾーン転送が“汚染源”に。
- 降格の未完了:
ntdsutilの remove selected server とrepadmin /syncall /AdePのセットが定石。 - KMS の自動登録:
slmgr /cdnsを忘れると_vlmcs._tcpが増殖。
確認すべき SRV パターン(チェックリスト)
| 用途 | 代表的なレコード | 備考 |
|---|---|---|
| DC 検出 | _ldap._tcp.dc._msdcs.<forest root> | サイト別は _ldap._tcp.<Site>._sites.dc._msdcs |
| Kerberos | _kerberos._tcp.<domain> / _kerberos._udp.<domain> | サイト別にも作成される |
| グローバル カタログ | _ldap._tcp.gc._msdcs.<forest root> | サイト別は _ldap._tcp.<Site>._sites.gc._msdcs |
| PDC 役割 | _ldap._tcp.pdc._msdcs.<domain> | 一意であるべき |
| KMS | _vlmcs._tcp | slmgr /cdns で公開抑止 |
コマンド サマリー(現場でそのまま使える)
| 目的 | コマンド | メモ |
|---|---|---|
| レプリケーション状況 | repadmin /replsummary | 失敗があると DNS にも影響 |
| 同期のフル実行 | repadmin /syncall /AdeP | AD 全体の整合性回復 |
| SRV 一括検索 | Get-DnsServerResourceRecord -RRType SRV | PowerShell で絞り込み |
| SRV 明示削除 | Remove-DnsServerResourceRecord -Force | -static も確実に削除 |
| ゾーン エクスポート | dnscmd /ZoneExport | ロールバック用 |
| KMS DNS 公開停止 | slmgr /cdns | _vlmcs の抑止 |
| Netlogon 再登録 | nltest /dsregdns / ipconfig /registerdns | 正しい SRV を復元 |
ケース別の原因切り分け
ケース A:GUI では消えているが 24 時間以内に復活する
アプリケーション パーティションの残骸が本命。ADSIEDIT で該当オブジェクトを削除し、repadmin /syncall /AdeP 後に再確認。
ケース B:削除直後にほぼ即復活する
ゾーンの NS に古い DC が残っている可能性。NS の整理とゾーン転送経路の遮断を優先。
ケース C:-static が混在してスカベンジされない
手動削除または慎重に /AgeAllRecords を適用。静的にすべきレコードの棚卸しが必須。
ケース D:_vlmcs._tcp だけが復活する
KMS の DNS 公開が有効。slmgr /cdns を適用してから DNS を整理。
検証のしかた(完了条件を明確にする)
- ゾーン内 SRV を“ホスト名で”検索して該当 DCB がゼロ件であること。
- 権威 NS の一覧に降格済み DC が含まれないこと。
- 現行 DC で
nltest /dsgetdc:<domain>を実行し、解決先に降格済み DC が登場しないこと。 - 24~48 時間の運用後も復活しないこと(スケジューラで監視スクリプトを回す)。
運用ベストプラクティス
- DC 降格の標準手順に「メタデータ クリーンアップ &
repadmin /syncall /AdeP」を組み込む。 - DNS Aging/Scavenging の値を標準化(例:No-Refresh=7 日、Refresh=7~21 日)。
- ゾーンの NS を定期棚卸し(まだ存在するはずのないサーバーが紛れていないか)。
- 降格作業前に ゾーン エクスポート と System State を取得。
- KMS 運用ポリシーとして DNS 自動公開の要否を明確化。
フル自動クリーン(サンプル スクリプト)
ターゲット FQDN を含む SRV を全ゾーンから削除し、レプリケーション後に正しい SRV を再登録する例です。検証環境で必ず試してから本番へ適用してください。
# 変数
$TargetHost = "DCB.contoso.local"
$DomainName = "contoso.local"
$ForestRoot = "contoso.local"
$DnsServer = $env:COMPUTERNAME
# 1) SRV 一括削除(全ゾーン)
$Zones = Get-DnsServerZone -ComputerName $DnsServer
foreach ($z in $Zones) {
$srv = Get-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $z.ZoneName -RRType SRV -ErrorAction SilentlyContinue |
Where-Object { $_.RecordData.DomainName -match [regex]::Escape($TargetHost) }
foreach ($r in $srv) {
Remove-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $z.ZoneName -InputObject $r -Force
}
}
# 2) 名前サーバー(NS)から古い DC を除去
try {
$ns = Get-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $DomainName -RRType NS |
Where-Object { $_.RecordData.NameServer -match [regex]::Escape($TargetHost) }
foreach ($r in $ns) {
Remove-DnsServerResourceRecord -ComputerName $DnsServer -ZoneName $DomainName -InputObject $r -Force
}
} catch {}
# 3) レプリケーション
repadmin /syncall /AdeP | Out-Null
# 4) 現行 DC から SRV を正規再登録
nltest /dsregdns | Out-Null
ipconfig /registerdns | Out-Null
まとめ
「降格したのに SRV が復活する」現象は、(1)メタデータ/アプリケーション パーティションの残骸、(2)静的フラグ、(3)ゾーンの NS(権威設定)、(4)KMS の自動登録のいずれか(または複合)で説明できます。対処は、AD の健全化 → DNS 静的削除 → パーティション残骸の直当て削除 → NS 整理 → KMS 停止 → 正規再登録の順で“汚染源を断つ”ことが肝要です。最後に Aging/Scavenging を運用へ組み込み、定期監視で早期検知できる体制を整えれば、同種の再発を効果的に防止できます。
付録:質問に対するコンパクト回答(要点だけ)
- なぜ復活する? AD 統合 DNS の残骸、静的フラグ、権威 NS、KMS の自動登録が主因。
- どう止める? ntdsutil 再実行&同期 → DNS の静的 SRV 削除 → ADSIEDIT で
DomainDnsZones/ForestDnsZonesから直接削除 → ゾーンの NS 見直し → KMS のslmgr /cdns→ 正規 DC でnltest /dsregdns。 - _vlmcs の扱い? KMS で DNS 公開を無効化(
slmgr /cdns)、不要 SRV を削除。

コメント