仕事をしていると予期せぬ障害に度々遭遇します
先日、Windows Server 2012で複数のDomain Controllerで構成された環境で1台のDomain Controllerでユーザ登録を行ったところエラーで登録できない状態に陥りました
イベントログに記録されているエラーは下記の内容です
ログの名前: System
ソース: Microsoft-Windows-Directory-Services-SAM
日付: 2014/xx/xx xx:xx:xx
イベント ID: 12293
タスクのカテゴリ: なし
レベル: エラー
キーワード:
ユーザー: SYSTEM
コンピューター: server03.rootlinks.local
説明:
SAM データベースで同一 SID 属性を持つ 2 つ以上のオブジェクトがあります。アカウントの識別名は CN=test,OU=スタッフ,DC=rootlinks,DC=localです。すべての重複アカウントは削除されました。ほかの重複はイベント ログを参照してください。
SIDの重複で新規ユーザ登録ができない?
重複した SID を生成するドメイン コントローラへの対処方法
http://support.microsoft.com/kb/419021/ja
ntdsutil commandの対処方法があったので実行してみましたが解決しませんでした
他のDomain Controllerではユーザの登録ができて障害のあるDomain Controllerに同期されActive Directoryに表示されます
最終的には障害のあるDomain Controllerを降格させて再度昇格させるしか無いかなと思いつつ、インストールソフトの関係でその作業は極力避けたい状態です
いろいろ情報をさがしていると下記のサイトに辿り着きました
User accounts deleted when creating new security principals
http://social.technet.microsoft.com/Forums/windowsserver/en-US/3f2f520e-40b0-4e86-bf4d-0b2876803529/user-accounts-deleted-when-creating-new-security-principals?forum=winserverDS
Marcin, I’ve been doing a bit more reading and I think I’ve found a less disruptive solution to our problem. This link contains a script to invalidate a RID pool on a DC, forcing it to request a new pool. I think we’d rather do this than demote/promote:-
降格/昇格を実行するなら俺達はこの方法を実行してみると….
この掲示板を読んでいると今回の障害はRID Masterから個々のDomain Controllerに割り当てられたRID Poolに不整合が発生していると思われます
障害の発生しているDomain ControllerのRID Poolを強制的に無効化して再度RID MasterからRID Poolを割り当ててもらうVBScriptのリンクが示されていました
Event ID 16646 — RID Pool Request
http://technet.microsoft.com/en-us/library/cc733186%28WS.10%29.aspx
※上記サイトから引用
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
sub Usage wscript.echo "Script to invalidate the domain controller's RID pool." wscript.echo "Usage: cscript iRIDPool.vbs" wscript.quit -1 end sub ' Get the command line arguments Set Args = Wscript.Arguments ' Validation and Usage if Args.Count > 0 then if Args(0) = "/?" or Args(0) = "-?" then wscript.echo "Help Requested" wscript.echo "" Usage end if end if Set oRootDSE = GetObject("LDAP://RootDSE") strNamingContext = oRootDSE.Get("defaultNamingContext") ' --- Define the attributes to be returned from the query --- strAttributes = "objectSid" '--- Set up the connection --- Set oConnection = CreateObject("ADODB.Connection") Set oCmd = CreateObject("ADODB.Command") oConnection.Provider = "ADsDSOObject" oConnection.Open "ADs Provider" Set oCmd.ActiveConnection = oConnection '--- Build the query string --- strADOQuery = "<LDAP://" + strNamingContext + ">;(objectClass=DomainDNS);" + strAttributes + ";subtree" oCmd.CommandText = strADOQuery oCmd.Properties("Page Size") = 1000 '--- Execute the query for the user in the directory --- Set oRecordSet = oCmd.Execute ' Assume we find nothing SearchHit = 0 While Not oRecordSet.EOF For Each oField In oRecordSet.Fields 'Output each field and value to the debug window ' Remember not to print empty search warning SearchHit = 1 if (oField.Name = "objectSid") then DomainSID = oField.Value end if Next wscript.echo "Invalidating RID Pool..." oRootDSE.Put "invalidateRidPool", DomainSID oRootDSE.SetInfo wscript.echo "RID Pool Invalidated" oRecordSet.MoveNext Wend ' Warn of empty search if no hits if SearchHit <> 1 then wscript.echo "DomainSid not found on the DomainDNS object under " & strNamingContext & "!" wscript.quit 0 end if |
特に書き換える必要は無く、これを実行すれば無効化されて再割り当てが行われました
結果、障害は解消され正常になりました:-)
一応その都度、下記のコマンドで確認して下さい
1 |
dcdiag /test:ridmanager /v |