AD Recycle BinのWhen deletedがDCごとに違う原因と確認方法(ADAC/whenChanged/isDeleted)

Active Directory Recycle Bin を ADAC(Active Directory 管理センター)で確認すると、参照するドメイン コントローラー(DC)によって「When deleted(削除日時)」が一致しないことがあります。特に削除後に昇格した新規 DC だけ、過去の削除が“最近”に見えるケースの原因と、影響範囲、削除時刻を正確に突き止める手順を整理します。

目次

まず結論:ADACの「When deleted」は“削除イベントの真の時刻”を保証しない

最初に押さえておきたいポイントは、ADAC の Recycle Bin 画面にある「When deleted」列は、監査用途で期待するような“削除操作が発生した瞬間の時刻(いつ誰が消したかの時刻)”を、DC 間で厳密に一致させて表示することを目的にしていない、という点です。

実際に Microsoft Q&A でも、「WhenDeleted という属性はなく、ADAC の表示は whenChanged などに依存してズレて見える」という趣旨の説明や、新規 DC では tombstone を取り込んだタイミングで CN がローカル更新され、whenChanged が変わり得るという説明が提示されています。

見たいものADACの「When deleted」推奨の確認方法
削除が起きた“発生時刻”DCによってズレる可能性があるisDeleted のレプリケーション メタデータ(LastOriginatingChangeTime など)を見る
復元可能かどうか判断できる(Deleted/Recycleの状態は見える)isDeleted / isRecycled、Deleted Objects などで確認
いつ物理削除(GC)されるか表示と一致しない場合があるmsDS-DeletedObjectLifetime / tombstoneLifetime と GC 間隔を前提に評価

前提知識:Recycle Bin有効時の「deleted-object」と「recycled-object」

Active Directory の削除済みオブジェクトは、Recycle Bin の有効・無効で“削除後の状態遷移”が変わります。Recycle Bin を有効にしている場合、一般に次の2段階を意識するとトラブルシュートが早くなります。

状態主な判別意味期間の基準
deleted-object(削除済み:復元可能)isDeleted = TRUE かつ isRecycled が無い削除済みだが復元対象。属性が比較的多く残るdeleted-object lifetime(msDS-DeletedObjectLifetime)
recycled-object(リサイクル済み:復元不可)isRecycled = TRUE復元不可。残る属性が大幅に少なくなるtombstone lifetime(tombstoneLifetime)

仕様としては、Recycle Bin が有効な場合、削除操作により通常のオブジェクトが deleted-object になり、deleted-object lifetime を超えると recycled-object に変換され、さらに tombstone lifetime を超えるとディレクトリから削除されます。

なぜDCごとに「When deleted」が変わるのか

ポイント1:whenChanged は複製されず、各DCがローカルに持つ

ズレの根本原因として最も説明力が高いのが、whenChanged 属性がレプリケーションで揃わないことです。Microsoft の属性仕様では、whenChanged は「最終変更日時」だがこの値は複製されない旨が明記されています。

つまり、同じオブジェクト(削除済みオブジェクトを含む)を DC001 と DC003 で見ても、whenChanged は“各 DC がその更新を自分のDBへ反映した時刻”として保持されやすく、結果として DC 間で一致しないことがあります。

ポイント2:削除済みオブジェクトは「DEL:<GUID>」形式へ名前が変更される

削除済みオブジェクトは、Deleted Objects コンテナー配下へ移動するだけでなく、同一階層にフラットに置かれる都合で、衝突回避のために RDN(名前)がユニークになるよう付け替えられます。具体的には、元の name に 0x0A(改行相当)と「DEL:」+ objectGUID を連結した“delete-mangled RDN”に変換されます。

この“名前が書き換わる”処理が、新規 DC が初期同期で tombstone / deleted-object を取り込むタイミングでローカル更新として扱われることがあり、whenChanged が“最近”に見える引き金になります(過去が書き換わったように見える理由)。Microsoft Q&A の事例でも、新規 DC 側で cn がローカルに書き込まれたメタデータが確認されています。

ポイント3:ADACの「When deleted」は内部的に whenChanged 等を参照している可能性が高い

AD には「whenDeleted」という単一の“絶対的な削除日時属性”が用意されているわけではないため、GUI が何らかの運用属性(whenChanged など)を元に「When deleted」列を構成していると考えるのが自然です。実際に Microsoft Q&A でも「WhenDeleted 属性はない」という説明があります。

このズレは危険?削除のレプリケーションや寿命管理への影響

結論から言うと、ADAC表示のズレ=削除の伝播がズレる/保持期限がズレる、ではありません。削除は isDeleted によって tombstone / deleted-object としてレプリケーションされ、削除済みである事実(isDeleted=TRUE)はディレクトリに残ります。

また、Recycle Bin 有効時の「deleted-object → recycled-object → 物理削除」という状態遷移も、deleted-object lifetime と tombstone lifetime に従って進みます。msDS-DeletedObjectLifetime が未設定の場合は tombstone lifetime をデフォルトとして扱うこと、tombstoneLifetime / msDS-DeletedObjectLifetime の最小値(2日)などはプロトコル仕様で定義されています。

ガベージコレクション(物理削除)は各 DC が独立に実行し、既定では一定間隔(例:12時間)で動作します。表示列がブレても、GC は“表示列”ではなくディレクトリが保持する削除状態と寿命を元に動くため、表示だけで判断しないことが重要です。

本当に知りたい「削除時刻」を正確に確認する方法

監査や障害調査で必要なのは、ADAC の見た目ではなく、削除を起点とする属性のレプリケーション メタデータです。ここでは「isDeleted が TRUE になった起点時刻(削除が発生した時刻)」を、PowerShell と repadmin の両方で確認する実務手順を紹介します。

手順1:削除済みオブジェクトを特定し、objectGUIDを取得する

まずは対象を 1 件に絞ります。Get-ADObject は -IncludeDeletedObjects を付けることで削除済みを検索でき、例として whenChanged / isDeleted / isRecycled を組み合わせたフィルター例も公式に掲載されています。

# 例)samAccountName が分かっている場合(ユーザー/コンピューターなど)
$target = Get-ADObject -IncludeDeletedObjects `
  -Filter 'isDeleted -eq $True -and samAccountName -eq "User01" -and -not (isRecycled -eq $True)' `
  -Properties objectGUID,distinguishedName,whenChanged,lastKnownParent,msDS-LastKnownRDN

$target | Select-Object objectGUID,distinguishedName,whenChanged,lastKnownParent,msDS-LastKnownRDN

ポイントは、同じコマンドでも -Server を付けるかどうかで“どの DC 視点の値か”が変わることです。whenChanged は DC ごとに差が出る前提なので、比較するときは -Server で明示し、同条件で揃えます。

手順2:Get-ADReplicationAttributeMetadata で isDeleted の起点時刻を見る(推奨)

Get-ADReplicationAttributeMetadata は、オブジェクト(DN または objectGUID)に対する属性単位のレプリケーション メタデータを取得できます。-IncludeDeletedObjects で削除済みも対象にできます。

# 例)DC 一覧を取得して、各 DC のメタデータを比較する
$dcs = Get-ADDomainController -Filter * | Select-Object -ExpandProperty HostName

$guid = $target.ObjectGUID

$result = foreach ($dc in $dcs) {
  Get-ADReplicationAttributeMetadata -Object $guid -Server $dc -IncludeDeletedObjects -Properties isDeleted,cn |
    Where-Object { $_.AttributeName -in @('isDeleted','cn') } |
    Select-Object @{n='DC';e={$dc}}, AttributeName, LastOriginatingChangeTime, LastOriginatingChangeDirectoryServerIdentity, Version
}

$result | Sort-Object AttributeName,DC | Format-Table -AutoSize

読み取り方の目安は次の通りです。

  • isDeleted:削除を示す本体。ここに表示される LastOriginatingChangeTime が「削除が起きた起点時刻」として扱いやすい
  • cn:DEL:<GUID> 形式への名前変更など、DC ローカル更新を含み得る。whenChanged がズレる背景を説明する材料になる

もし現象が「新規 DC だけ When deleted が最近」でも、isDeleted のメタデータの起点時刻が全 DC で一致しているなら、レプリケーション異常ではなく“表示に使っている属性の性質”に起因する可能性が高い、と判断できます。

手順3:repadmin /showobjmeta で同じことをCLIでも確認する

GUI や PowerShell に依存したくない場合は repadmin の /showobjmeta で、同一オブジェクトのレプリケーション メタデータを DC 間で比較できます。オブジェクトは DN だけでなく GUID でも指定可能です。

# 例)特定 DC にある対象オブジェクトのメタデータ(GUID指定)
repadmin /showobjmeta DC001 "<GUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>"

# DC を変えて比較
repadmin /showobjmeta DC003 "<GUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>"

repadmin 出力の中で isDeleted の行(属性)に付随するタイムスタンプや、originating server(起点 DC)を比較することで、「いつ・どの DC で削除が起きたか」と「新規 DC がいつその更新を取り込んだか」を切り分けられます。

“新規DCだけ過去が書き換わる”ように見える典型シナリオ

現象をタイムラインで整理すると、理解が早くなります。

時系列起きていること見え方の差が出る理由
T0DC001 でユーザーを削除DC001 は削除操作をローカルで処理。isDeleted が TRUE になり、削除済みオブジェクトへ
T0〜T1DC002 へ通常レプリケーションDC002 も削除済みとして取り込み。whenChanged は各 DC の処理時刻で差が出る可能性
T2DC003 を昇格(削除後に新規追加)初期同期で過去の削除済みオブジェクトも取り込む
T2直後DC003 が tombstone/deleted-object をDBへ反映CN/RDN の DEL:<GUID> 付与等がローカル更新扱いになり、whenChanged が“最近”に見えることがある

このとき、ADAC が When deleted の表示に whenChanged を使っていると、DC003 だけ過去の削除が T2 付近に見えてしまう、という構図です。

保持期間(msDS-DeletedObjectLifetime / tombstoneLifetime)を安全に把握する

削除済みオブジェクトが「いつまで復元可能か」「いつ物理削除されるか」は、見た目ではなく設定値で判断します。特に環境によって既定値が揃っていないことがあるため、値を明示的に確認しておくのが安全です。

設定/属性役割どこを見る補足
msDS-DeletedObjectLifetimedeleted-object(復元可能)状態の保持日数CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,…未設定なら tombstoneLifetime を既定として扱う
tombstoneLifetime(Recycle Bin有効時は主に recycled-object の)保持日数同上未設定時は 60 日が既定(プロトコル仕様)
garbageCollPeriodGC(掃除処理)が走る間隔(時間)同上既定は 12 時間
# 例)設定値を確認(Configuration パーティションの Directory Service オブジェクト)
$root = (Get-ADRootDSE).configurationNamingContext
$dsDn  = "CN=Directory Service,CN=Windows NT,CN=Services,$root"

Get-ADObject -Identity $dsDn -Properties tombstoneLifetime,msDS-DeletedObjectLifetime,garbageCollPeriod |
  Select-Object tombstoneLifetime,msDS-DeletedObjectLifetime,garbageCollPeriod

ここで値を把握しておくと、「ADAC の When deleted 表示がズレているのに、復元できる/できないが変わった」などの誤解を避けやすくなります。

運用で困らないための実務的な対策

レポートや監査に ADAC の「When deleted」を使わない

ADAC は復元操作の入口として便利ですが、日時の整合性を担保する設計ではありません。削除時刻をレポート化するなら、以下の優先度がおすすめです。

  • 監査ログ(誰が・いつ削除したか):Windows の「Directory Service Changes」監査で、削除イベント(例:5141)を取得する
  • AD の事実(いつ削除状態になったか):isDeleted のレプリケーション メタデータ(LastOriginatingChangeTime)
  • 復元可否:isRecycled の有無、deleted-object lifetime の範囲

複数DCの比較は「同じものを同じ取り方」で

今回のような“DC によって値が違う”系の調査では、次のルールで情報を揃えると判断がブレません。

  • PowerShell は -Server <DC> を必ず付け、どの DC の値かを固定する
  • 「見た目の列」ではなく、isDeleted/isRecycled とメタデータ(showobjmeta / Get-ADReplicationAttributeMetadata)で比較する
  • DC の時刻同期(NTP)も念のため確認する(時計ずれがあると“最近に見える”が誇張される)

「復元できるのに見つからない」を避ける検索フィルター

削除済みオブジェクト検索では、Deleted Objects コンテナー自体がヒットしたり、recycled-object(復元不可)まで混ざったりして混乱することがあります。Get-ADObject の公式例にもある通り、次の条件を入れておくと実務上安全です。

  • isDeleted -eq True
  • -not (isRecycled -eq True)
  • name -ne “Deleted Objects”

まとめ:ズレの正体を知れば、焦らず安全に判断できる

  • ADAC の「When deleted」は、DC 間で一致しないことがある(特に削除後に昇格した新規 DC で“最近に見える”現象が起きやすい)
  • 背景には whenChanged が複製されないこと、削除時に DEL:<GUID> 形式へ名前が変わること、そして新規 DC の初期同期でローカル更新が発生し得ることがある
  • 削除の伝播や寿命管理を判断するなら、isDeleted / isRecycled とレプリケーション メタデータ(Get-ADReplicationAttributeMetadata / repadmin)で確認する

表示のズレ自体は“よくある罠”ですが、見るべき場所をメタデータに切り替えるだけで、仕様と異常を切り分けられるようになります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次