ForestDNSZones or DomainDNSZones FSMO says “The role owner attribute could not be read”
This came up recently at a customer site. I was looking for the script that fixes this (remembering that the site the fix belongs to is attached to an article that has nothing to do with the issue, but it still works great).
What I ran into was a TON of really horrible advice out there on the forums. Please please please – if you get this error don’t follow any of the advice you read unless the article mentions running a script that is lovingly called “fixfsmo.vbs”
What you’re probably seeing in LDP or ADSIEdit in the CN=infrastructure,DC=DomainDNSZones,DC=MyDomainName,DC=Whatever (that or ForestDNSZones) is an entry for FSMO that points to a retired or missing DC. Sorta’ like this:
cn=ntds settings\0adel:f655f307-02gb-4923-b7be-fc5e2042b4c8,cn={MyOldDCName}\0adel:88c9073f-6964-4ab3-98f0-d30dcd12a908,cn=servers,cn={SiteName},cn=sites,cn=configuration,dc={MyDomainName},dc={Whatever}
What has happened is the DC who held the FSMO Role Holder for your DomainDNSZones or your ForestDNSZones (or both) application partition isn’t there anymore. Someone deleted it, decommissioned it, basically it failed somewhere along the line but the DC owned one or more of your AD Integrated DNS Zones. The deleted DC can be seen in the mess above after cn=___ and in most cases this means someone had to do metadata cleanup and forcibly removed the server from AD.
So you might be asking, “uh, Chris? Aren’t there just 5 FSMO role holders?” Well, see for yourself:
Without getting into a huge discussion about naming contexts or application partitions – just know that if your domain uses application partitions (likely) each of these will have a FSMO. Like your other FSMO role holders you may need to seize the role. Sadly, you can’t do this with NTDSUTIL. You can SEE them (see below) but you can’t do anything with them:
In the list of options above, note that there isn’t a Seize or Transfer option for the application partitions. You can select them or view them:
But that’s it. There is a way to change the owner when you’re in this state however, keep reading.
So again, without going into a lot of depth on naming contexts and Application Partitions (I actually have another post that deals with this which will be published early next month dealing with DNS and App Partitions) we will move on for now. The bottom line is, you have a partition in your Active Directory database with no owner. We need to fix this, and we can’t use NTDSUTIL to get there.
The NORMAL way to go about changing FSMO role holders for the applications partitions is to use an editor like ADSIEdit or LDP. As shown in the first image above, you see that this region is editable. BUT as you’ve probably already noticed, this will error out “The role owner attribute could not be read” because there’s nobody to talk to (the value owner is gone).
So you need to force this change to happen. This is described in KB949257, unfortunately this article’s title is talking about issues doing an adprep /rodcprep – and a lot of people miss it or skip over it when in actuality it has exactly the script you need.
What you need to do is go to the DC you want to hold the role (I usually use the PDCE, but not for any particular reason). Now create a new file and call it fixfsmo.vbs:
Then dump this text into it:
const ADS_NAME_INITTYPE_GC = 3 const ADS_NAME_TYPE_1779 = 1 const ADS_NAME_TYPE_CANONICAL = 2 set inArgs = WScript.Arguments if (inArgs.Count = 1) then ' Assume the command line argument is the NDNC (in DN form) to use. NdncDN = inArgs(0) Else Wscript.StdOut.Write "usage: cscript fixfsmo.vbs NdncDN" End if if (NdncDN <> "") then ' Convert the DN form of the NDNC into DNS dotted form. Set objTranslator = CreateObject("NameTranslate") objTranslator.Init ADS_NAME_INITTYPE_GC, "" objTranslator.Set ADS_NAME_TYPE_1779, NdncDN strDomainDNS = objTranslator.Get(ADS_NAME_TYPE_CANONICAL) strDomainDNS = Left(strDomainDNS, len(strDomainDNS)-1) Wscript.Echo "DNS name: " & strDomainDNS ' Find a domain controller that hosts this NDNC and that is online. set objRootDSE = GetObject("LDAP://" & strDomainDNS & "/RootDSE") strDnsHostName = objRootDSE.Get("dnsHostName") strDsServiceName = objRootDSE.Get("dsServiceName") Wscript.Echo "Using DC " & strDnsHostName ' Get the current infrastructure fsmo. strInfraDN = "CN=Infrastructure," & NdncDN set objInfra = GetObject("LDAP://" & strInfraDN) Wscript.Echo "infra fsmo is " & objInfra.fsmoroleowner ' If the current fsmo holder is deleted, set the fsmo holder to this domain controller. if (InStr(objInfra.fsmoroleowner, "\0ADEL:") > 0) then ' Set the fsmo holder to this domain controller. objInfra.Put "fSMORoleOwner", strDsServiceName objInfra.SetInfo ' Read the fsmo holder back. set objInfra = GetObject("LDAP://" & strInfraDN) Wscript.Echo "infra fsmo changed to:" & objInfra.fsmoroleowner End if End if |
And run the script from an elevated command prompt. You should now be able (through NTDSUTIL as shown above or through ADSIEdit) be able to see that the owner has changed to a valid DC.
For clarification, you should only run this script if the DC that is listed is no longer available and you can’t change it manually through ADSIEdit.
HTH!
Comments
Anonymous
January 01, 2003
Hi, I'm having an issue with several similarities. Originaly I had a W2K3 as DC which was the FSMO. Later I add a new W2K8R2 as a DC, and transfer to it the FSMO. Since then I added other 4 W2K8R2 as DC in different sites. Now Im trying unsuccesfuly to remove the old W2K3 gracefuly with DCPROMO. I'm getting a lots of issues same as in this note. The difference is that in my case the FSMO owner for the "DomainDNSzones" and "ForesDNSzones" is the old W2K3. Is there a way to transfer (and not to sieze) this ownership since both DC exisit and funcition? If there is not, should I seize the ownership with the VBS modified to skip the "IF"? Could be this related to not running an "adprep /rodcprep" (I'm not planing to have any RODC? Thanks in advanceAnonymous
January 01, 2003
Yes. Non-domain naming context. Also, might be good to clarify that there is a difference between a FSMO role and a fSMORoleOwner attribute. I don't want to confuse the two but I don't want to get into a bloated description in a comment field. It may be a good idea to expand on these concepts a bit more in another blog article in a few weeks.Anonymous
January 01, 2003
Correct, those are the same scripts for this issue in that KB, but... the title is a bit misleading. Same solution to two different problems. Glad it worked out for you!Anonymous
January 01, 2003
It's OK for me.
We had this code error at DomainDNSZones Level in one of our client's active directory domain:
FSMO Role: CN=Infrastructure,DC=DomainDnsZones,DC=[domain_name],DC=local
FSMO Server DN: CN=NTDS Settings�ADEL:cff79b91-689d-4b9a-9a58-d3e8c0727222,CN=[DC_NAME]�ADEL:2c2630f4-d8cf-4a0c-a825-2c63d06a6e66,CN=Servers,CN=[SiteName],CN=Sites,CN=Configuration,DC=[domain_name],DC=local
After some search of code errors in Microsoft KBs:
The fSMORoleOwner attribute contains the string "0ADEL" indicating that the role owning DC's NTDS Settings object has been deleted
It seems one old DC was removed not kindly for far away...
We use fix scripts of: https://support2.microsoft.com/default.aspx?scid=kb;EN-US;949257 to seize Infrastructure FSMO role to another DC and then the DCPROMO of failing DCs went on!!
Really thanksAnonymous
December 20, 2011
Coo. This clears a few things up. I always thought if you had a partition in AD, you'd have to have an owner listed somewhere. Are these NDNC's?Anonymous
February 01, 2012
is it Ok if I modify the script by deleting the following two lines, so its contents will run without the IF condition:
- if (InStr(objInfra.fsmoroleowner, "�ADEL:") > 0) then
- End if The above is a pair of IF statement which is embedded in another IF statement. Thanks, Ben
Anonymous
February 01, 2012
Somehow my previous comment was lost: Because I have accidently "cleared" the fSMORoleOwner (which was point to a non-existed DC) and now it becomes to <Not Set>. The script seems to be not help because the embedded IF statement will not run (not effect). Thanks, BenAnonymous
February 01, 2012
Try copying and pasting the code from the kb article instead. (link above) and make sure and run that from the DC you want to take the role.Anonymous
February 01, 2012
Thanks for your quick response Chris. The script from MSKB is actually the same as yours, it does nothing when I run it on DC, because the current setting in fSMORoleOwner is <Not Set>. The IF statement I quoted in my earlier post has excluded to run because "if (InStr(objInfra.fsmoroleowner, "�ADEL:") > 0)" is not ture (due to fSMORoleOwner is <Not Set>). So my concern is if I take away "IF ... End IF" two lines and let its content to run (set a new DC), would have any other side affect (unexpected consequance)? Thanks again! BenAnonymous
February 01, 2012
It looks the same but for some odd reason it is different. I had a customer prove it to me the other day and I've been meaning to update it after I figure it out... Anyway, that's neither here nor there. I get what you're saying now and no I can't imagine a way that could have any strange results. I've modified the script before for similar reasons... Let me ask you this, can you change the setting manually now? It may be as simple as that. Get the fsmo role owner value from another application partition and copy/paste.Anonymous
February 01, 2012
Although the current fSMORoleOwner in ForestDnsZones is <Not Set>, but I still cannot set a new value (error message "...cannot be read"). I have run the script against DomainDnsZones, it was successful because the DomainDnsZones fSMORoleOwner had the value (although it had a wrong DC - a non existed DC); because I have "accidently" cleared ForestDnsZones fSMORoleOwner attribute and it has non-value ( <Not Set> ), hance, the embedded IF...End IF statement will not run. I would take the IF...end IF away (keep the inside content) and "force" it to run (un-conditional), but has raised my concern as mentioned previously due to overlook something? Thanks Chris. BenAnonymous
February 01, 2012
My concern actually comes from the last sentance in your article: "For clarification, you should only run this script if the DC that is listed is no longer available and you can’t change it manually through ADSIEdit." Because my wrong DC is no longer listed in fSMORoleOwner attribute (value has been cleared to <Not Set>). Thanks. BenAnonymous
February 02, 2012
The comment has been removedAnonymous
February 02, 2012
Hey, glad it all worked out :)Anonymous
August 19, 2014
Hi Chris,
when i run it i get the following error:
fixfsmo.vbs(20, 5) (null): Name translation: Could not find the name or insufficient right to see name.
any ideas?
TIAAnonymous
September 10, 2014
@ANC I got the same error when I used the script incorrectly. This worked for me.
cscript fixfsmo.vbs dc=forestdnszones,dc=mydomain,dc=org
then for domain zone:
cscript fixfsmo.vbs dc=domaindnszones,dc=mydomain,dc=org
I commented out the IF statement at the bottom as I had cleared the fsmoroleower value manually.Anonymous
May 17, 2015
Thank you Chris, Ben and Mike. This worked for me. :) By the way, you can change the DomainDNSZones and ForestDNSZones from the role holder but not from the server you are seeing the
Operation failed. Error code: 0x20ae
The role owner attribute could not be read.
http://blog.mpecsinc.ca/2011/03/ad-ds-operation-failed-directory.html
Once it is changed on the role holder, it will change it on the old AD server that has the incorrect info.Anonymous
July 28, 2015
Thank you so much! I read practically every other article on how to fix this problem and you explanation finally did it. Thanks to Mike Montgomery for his tip on how to use the script!Anonymous
July 28, 2015
*yourAnonymous
November 24, 2015
Thanks to Chris and to Mike. You both solved my problem so virtual beers to you both!Anonymous
February 10, 2016
So my issue is a little different..
CN=NTDS Settings�ADEL:9a20d37c-e5b6-4dd4-9ecb-2b532aa0b08d,CN=SR-DC1�ADEL:b60b40d3-9616-416c-8b24-5f2d0b502ccd,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=DOMAINNAME,DC=local
I query the fsmo roles and they all show running on SR-DC3.. I'm trying to demote SR-DC1 and get the error in the article.. However, SR-DC1 exists and is an active DC..
What now?
ThanksAnonymous
March 02, 2016
The comment has been removed