Bagikan melalui


Mendeteksi Master Skema

Active Directory Domain Services memiliki sistem pembaruan multi-master; setiap pengendali domain menyimpan salinan direktori yang dapat ditulis. Pembaruan skema disebarkan ke semua domain milik pohon atau forest yang sama. Karena sulit untuk mendamaikan pembaruan yang bertentangan dengan skema, pembaruan skema hanya dapat dilakukan di satu server. Server dengan hak untuk melakukan pembaruan dapat berubah, tetapi hanya satu server yang akan memiliki hak tersebut pada waktu tertentu. Server ini disebut master skema. DC pertama yang diinstal di perusahaan adalah, secara default, master skema.

Perubahan skema hanya dapat dilakukan pada tingkat master skema. Untuk mendeteksi DC mana yang merupakan master skema, lakukan langkah-langkah berikut.

Mendeteksi Master Skema DC

  1. Baca atribut fsmoRoleOwner dari kontainer skema pada DC apa pun. Atribut fsmoRoleOwner mengembalikan nama khusus (DN) objek nTDSDSA untuk master skema.
  2. Ikat ke objek nTDSDSA yang DN-nya baru saja Anda ambil. Induk objek ini adalah objek server untuk DC yang berisi master skema.
  3. Dapatkan ADsPath untuk induk objek nTDSDSA . Induk adalah objek server.
  4. Ikat ke objek server.
  5. Dapatkan atribut dNSHostName dari objek server. Ini adalah nama DNS DC yang berisi master skema.
  6. Tentukan nama DNS master skema sebagai server dan DN sebagai DN kontainer skema untuk diikat ke master skema. Misalnya, jika server adalah "dc1.fabrikam.com" dan DN kontainer skema adalah "cn=schema,cn=configuration,dc=fabrikam,dc=com", ADsPath adalah sebagai berikut.
    LDAP://dc1.fabrikam.com/cn=schema,cn=configuration,dc=fabrikam,dc=com
    

Disarankan agar Anda menemukan master skema dan mengikatnya untuk membuat perubahan skema. Namun, Anda dapat memindahkan master skema ke server lain.

Untuk menjadikan server lain sebagai master skema, pengguna istimewa yang sesuai dapat:

  • Gunakan snap-in MMC Schema Manager.

    Catatan

    Snap-in MMC Skema Direktori Aktif harus didaftarkan secara manual. Untuk mendaftarkan snap-in Skema, Anda harus menjalankan perintah berikut dari prompt perintah di direktori Windows System32.

    regsvr32.exe schmmgmt.dll

     

  • Gunakan utilitas baris perintah NTDSUTIL.

  • Gunakan aplikasi pihak ketiga (aplikasi yang mengeluarkan tulisan LDAP yang sesuai).

Untuk menjadi master skema secara terprogram, aplikasi yang berjalan dalam konteks pengguna istimewa yang cocok dapat mengeluarkan tulisan LDAP dari atribut operasional menjadiSchemaMaster ke rootDSE pada DC tersebut. Ini memulai transfer atom master skema langsung dari pemegang saat ini ke DC lokal.

Contoh kode berikut menemukan master skema. Fungsi berikut mengikat ke kontainer skema di komputer yang merupakan master skema.

HRESULT BindToSchemaMaster(IADsContainer **ppSchemaMaster)
{
HRESULT hr = E_FAIL;
// Get rootDSE and the schema container DN.
IADs *pObject = NULL;
IADs *pTempSchema = NULL;
IADs *pNTDS = NULL;
IADs *pServer = NULL;
BSTR bstrParent;
LPOLESTR szPath = new OLECHAR[MAX_PATH];
VARIANT var, varRole,varComputer;
hr = ADsOpenObject(L"LDAP://rootDSE",
         NULL,
         NULL,
         ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
         IID_IADs,
         (void**)&pObject);
if (hr == S_OK)
{
  hr = pObject->Get(CComBSTR("schemaNamingContext"), &var);
  if (hr == S_OK)
  {
    wcscpy_s(szPath,L"LDAP://");
    wcscat_s(szPath,var.bstrVal);
    hr = ADsOpenObject(szPath,
             NULL,
             NULL,
             ADS_SECURE_AUTHENTICATION, // Use Secure Authentication.
             IID_IADs,
             (void**)&pTempSchema);
 
    if (hr == S_OK)
    {
      /*
      Read the fsmoRoleOwner attribute to identify which server is 
      the schema master.
      */  
      hr = pTempSchema->Get(CComBSTR("fsmoRoleOwner"), &varRole);
      if (hr == S_OK)
      {
        // The fsmoRoleOwner attribute returns the nTDSDSA object.
        // The parent is the server object.
        // Bind to NTDSDSA object and get parent.
        wcscpy_s(szPath,L"LDAP://");
        wcscat_s(szPath,varRole.bstrVal);
        hr = ADsOpenObject(szPath,
             NULL,
             NULL,
             ADS_SECURE_AUTHENTICATION,
             IID_IADs,
             (void**)&pNTDS);
        if (hr == S_OK)
        {
          hr = pNTDS->get_Parent(&bstrParent);
          if (hr == S_OK)
          {
            /*
            Bind to server object and get the DNS name of 
            the server.
            */
            wcscpy_s(szPath,bstrParent);
            hr = ADsOpenObject(szPath,
               NULL,
               NULL,
               ADS_SECURE_AUTHENTICATION,
               IID_IADs,
               (void**)&pServer);
            if (hr == S_OK)
            {
              // Get the dns name of the server.
              hr = pServer->Get(CComBSTR("dNSHostName"), 
                  &varComputer);
              if (hr == S_OK)
              {
                    wcscpy_s(szPath,L"LDAP://");
                    wcscat_s(szPath,varComputer.bstrVal);
                    wcscat_s(szPath,L"/");
                    wcscat_s(szPath,var.bstrVal);
                    hr = ADsOpenObject(szPath,
                         NULL,
                         NULL,
                         ADS_SECURE_AUTHENTICATION,
                         IID_IADs,
                         (void**)ppSchemaMaster);
                    if (FAILED(hr))
                    {
                      if (*ppSchemaMaster)
                      {
                        (*ppSchemaMaster)->Release();
                        (*ppSchemaMaster) = NULL;
                      }
                    }
              }
              VariantClear(&varComputer);
            }
            if (pServer)
              pServer->Release();
          }
          SysFreeString(bstrParent);
        }
        if (pNTDS)
          pNTDS->Release();
      }
      VariantClear(&varRole);
    }
    if (pTempSchema)
      pTempSchema->Release();
  }
  VariantClear(&var);
}
if (pObject)
    pObject->Release();
 
return hr;
}

Contoh kode berikut menampilkan nama DNS untuk komputer yang merupakan master skema.

On Error Resume Next
 
'''''''''''''''''''
' Bind to the rootDSE
''''''''''''''''''''
sPrefix = "LDAP://"
Set root= GetObject(sPrefix & "rootDSE")
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on GetObject method"
End If
 
'''''''''''''''''''
' Get the DN for the schema
''''''''''''''''''''
sSchema = root.Get("schemaNamingContext")
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on Get method"
End If
 
'''''''''''''''''''
' Bind to the schema container
''''''''''''''''''''
Set Schema= GetObject(sPrefix & sSchema )
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on GetObject method to bind to schema"
End If
''''''''''''''''''''
' Read the fsmoRoleOwner attribute to see which server is the 
' schema master.
''''''''''''''''''''
sMaster = Schema.Get("fsmoRoleOwner")
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on IADs::Get method for fsmoRoleOwner"
End If
''''''''''''''''''''
' The fsmoRoleOwner attribute returns the nTDSDSA object.
' The parent is the server object.
' Bind to NTDSDSA object and get the parent object.
''''''''''''''''''''
Set NTDS = GetObject(sPrefix & sMaster)
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on GetObject method for NTDS"
End If
sServer = NTDS.Parent
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on IADs::get_Parent method"
End If
''''''''''''''''''''
' Bind to server object
' and get the reference to the computer object.
''''''''''''''''''''
Set Server = GetObject(sServer)
If (Err.Number <> 0) Then
   BailOnFailure Err.Number, "on GetObject method for " & sServer
End If
sComputer = Server.Get("dNSHostName")
''''''''''''''''''''
' Display the DNS name for the computer.
''''''''''''''''''''
strText = "Schema master has the following DNS name: "& sComputer
WScript.echo strText
 
 
 
''''''''''''''''''''
' Display subroutines
''''''''''''''''''''
 
Sub BailOnFailure(ErrNum, ErrText)
    strText = "Error 0x" & Hex(ErrNum) & " " & ErrText
    MsgBox strText, vbInformation, "ADSI Error"
    WScript.Quit
End Sub