محمد نصیری
بنیانگذار توسینسو ، هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات و عاشق طبیعت

آموزش رفع خطای دستور adprep /rodcprep ویندوز سرور به زبان ساده

خوب شما هم ممکن است از این دستور در ویندوز سرور 2008 استفاده کرده باشید و شاید به همین مشکلی که بنده به آن برخود کردم ، برخود کرده باشید ، در هنگام اجرا دستور adprep / rodcprep خطاهایی مشابه آنچه در پایین مشاهده میکنید را ممکن است ببینید :

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
Adprep could not contact a replica for partition DC=DomainDnsZones,DC=Contoso,DC=com 
Adprep failed the operation on partition DC=DomainDnsZones,DC=Contoso,DC=com Skipping to next partition. 

Adprep could not contact a replica for partition DC=ForestDnsZones,DC=Contoso,DC=com 
Adprep encountered an LDAP error. Error code: 0x0. Server extended error code: 0x0, Server error message:(null) 

Adprep failed the operation on partition DC=ForestDnsZones,DC=Contoso,DC=com Skipping to next partition. 
Adprep completed with errors. Not all partitions are updated


خوب ابتدا به بررسی مشکلات مربوط به این خطا می پردازیم و سپس راهکار حل مشکل را به شما ارائه خواهیم داد ، این خطا زمانی رخ می دهد که دستور مورد نظر قصد برقراری ارتباط با infrastructure master موجود بر روی هر یک از application partition های موجود بر روی Forest دارد . دستور مورد نظر اینکار را برای این انجام می دهد که بتواند سطوح دسترسی مورد نیاز برای replication های مربوط به RODC را اعمال کند ، دستور rodcprep به دو دلیل ممکن است دچار مشکل شود :

  • Partition یا partition هایی که قصد ارتباط با آنها را در forest داریم وجود ندارند و یا حذف شده اند .
  • Infrastructure master مربوط به partition درخواست شده توسط دستور یا demote شده است و یا در حال حاضر آفلاین است.


برای حل این مشکل دور راهکار وجود دارد ، اگر partition مورد نظر دیگر وجود ندارد ، با استفاده از دستور remove nc میتوانید اطلاعات مربوط به partition از بین رفته یا بهتر بگوییم metadata مربوط به partition مورد نظر را حذف میکنیم ، اگر با شیوه کاری این دستور آشنا نیستید میتوانید به لینک مقابل مراجعه کنید : partition management

اما اگر partition مورد نظر وجود دارد ، برای این partition شما بایستی یک مالک یا بهتر بگوییم یک infrastructure role owner تعیین کنید ، شما اینکار را می توانید بصورت دستی و با استفاده از اعمال تغییرات در attribute های Schema مربوط به fSMORoleOwner انجام دهید ، از طرفی دیگر شما می توانید با اجرا اسکریپتی که در ادامه مشاهده میکنید اینکار را بصورت خودکار انجام دهید ، اما دقت کنید که در اجرای اسکریپت مورد نظر حتما خط اول را خذف کنید وگرنه جواب نخواهید گرفت ، این نکته را حتی در خود آموزش اصلی این اسکریپت هم ذکر نکرده اند و همین موضوع ممکن است شما را به مشکل بیاندازد.

-------fixfsmo.vbs------------------
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


دقت کنید ، خط اول را حذف کنید ، سپس این فایل را در قالب فایلی به نام fixfsmo.vbs ذخیره کنید و بر روی دامین کنترلری که دارای اشکال است اجرا کنید ، دسترسی مدیریتی برای اجرا این اسکریپت نیز پیشنهاد می شود . موفق باشید.


محمد نصیری
محمد نصیری

بنیانگذار توسینسو ، هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات و عاشق طبیعت

هکر با کلاه ، کارشناس امنیت اطلاعات و ارتباطات و کشف جرائم رایانه ای ، بیش از 12 هزار ساعت سابقه تدریس در بیش از 40 سازمان دولتی ، خصوصی و نظامی ، علاقه مند به یادگیری بیشتر و عاشق محیط زیست ، عضو کوچکی از مجموعه توسینسو

نظرات