Bagikan melalui


Fungsi DsGetDcNameA (dsgetdc.h)

Fungsi DsGetDcName mengembalikan nama pengendali domain dalam domain tertentu. Fungsi ini menerima kriteria pemilihan pengendali domain tambahan untuk menunjukkan preferensi pengontrol domain dengan karakteristik tertentu.

Sintaks

DSGETDCAPI DWORD DsGetDcNameA(
  [in]  LPCSTR                   ComputerName,
  [in]  LPCSTR                   DomainName,
  [in]  GUID                     *DomainGuid,
  [in]  LPCSTR                   SiteName,
  [in]  ULONG                    Flags,
  [out] PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo
);

Parameter

[in] ComputerName

Penunjuk ke string yang dihentikan null yang menentukan nama server untuk memproses fungsi ini. Biasanya, parameter ini adalah NULL, yang menunjukkan bahwa komputer lokal digunakan.

[in] DomainName

Penunjuk ke string yang dihentikan null yang menentukan nama domain atau partisi aplikasi untuk dikueri. Nama ini bisa berupa nama gaya DNS, misalnya, fabrikam.com, atau nama gaya datar, misalnya, Fabrikam. Jika nama gaya DNS ditentukan, nama dapat ditentukan dengan atau tanpa periode berikutnya.

Jika parameter Bendera berisi bendera DS_GC_SERVER_REQUIRED , DomainName harus menjadi nama forest. Dalam hal ini, DsGetDcName gagal jika DomainName menentukan nama yang bukan akar forest.

Jika parameter Bendera berisi bendera DS_GC_SERVER_REQUIRED dan DomainName adalah NULL, DsGetDcName mencoba menemukan katalog global di forest komputer yang diidentifikasi oleh ComputerName, yang merupakan komputer lokal jika ComputerName adalah NULL.

Jika DomainNameadalah NULL dan parameter Bendera tidak berisi bendera DS_GC_SERVER_REQUIRED , ComputerName diatur ke nama domain default domain utama komputer yang diidentifikasi oleh ComputerName.

[in] DomainGuid

Penunjuk ke struktur GUID yang menentukan GUID domain yang dikueri. Jika DomainGuid bukan NULL dan domain yang ditentukan oleh DomainName atau ComputerName tidak dapat ditemukan, DsGetDcName mencoba menemukan pengendali domain di domain yang memiliki GUID yang ditentukan oleh DomainGuid.

[in] SiteName

Penunjuk ke string yang dihentikan null yang menentukan nama situs tempat pengendali domain yang dikembalikan harus ada secara fisik. Jika parameter ini ADALAH NULL, DsGetDcName mencoba mengembalikan pengendali domain di situs yang paling dekat dengan situs komputer yang ditentukan oleh ComputerName. Parameter ini harus NULL, secara default.

[in] Flags

Berisi sekumpulan bendera yang menyediakan data tambahan yang digunakan untuk memproses permintaan. Parameter ini bisa menjadi kombinasi dari nilai berikut.

DS_AVOID_SELF

Ketika dipanggil dari pengendali domain, menentukan bahwa nama pengendali domain yang dikembalikan tidak boleh menjadi komputer saat ini. Jika komputer saat ini bukan pengendali domain, bendera ini diabaikan. Bendera ini dapat digunakan untuk mendapatkan nama pengendali domain lain di domain.

DS_BACKGROUND_ONLY

Jika bendera DS_FORCE_REDISCOVERY tidak ditentukan, fungsi ini menggunakan data pengontrol domain yang di-cache. Jika data yang di-cache berusia lebih dari 15 menit, cache di-refresh dengan ping pengontrol domain. Jika bendera ini ditentukan, refresh ini dihindari meskipun data yang di-cache kedaluwarsa. Bendera ini harus digunakan jika fungsi DsGetDcName dipanggil secara berkala.

DS_DIRECTORY_SERVICE_PREFERRED

DsGetDcName mencoba menemukan pengendali domain yang mendukung fungsi layanan direktori. Jika pengendali domain yang mendukung layanan direktori tidak tersedia, DsGetDcName mengembalikan nama pengendali domain layanan non-direktori. Namun, DsGetDcName hanya mengembalikan pengontrol domain layanan non-direktori setelah upaya untuk menemukan pengontrol domain layanan direktori kehabisan waktu.

DS_DIRECTORY_SERVICE_REQUIRED

Mengharuskan pengontrol domain yang dikembalikan mendukung layanan direktori.

DS_DIRECTORY_SERVICE_6_REQUIRED

Mengharuskan pengendali domain yang dikembalikan menjalankan Windows Server 2008 atau yang lebih baru.

DS_DIRECTORY_SERVICE_8_REQUIRED

Mengharuskan pengendali domain yang dikembalikan menjalankan Windows Server 2012 atau yang lebih baru.

DS_FORCE_REDISCOVERY

Memaksa data pengontrol domain yang di-cache untuk diabaikan. Ketika bendera DS_FORCE_REDISCOVERY tidak ditentukan, DsGetDcName dapat mengembalikan data pengontrol domain yang di-cache. Jika bendera ini ditentukan, DsGetDcName tidak akan menggunakan informasi yang di-cache (jika ada) tetapi sebaliknya akan melakukan penemuan pengontrol domain baru.

Bendera ini tidak boleh digunakan dalam kondisi normal, karena menggunakan informasi pengontrol domain yang di-cache memiliki karakteristik performa yang lebih baik dan membantu memastikan bahwa pengendali domain yang sama digunakan secara konsisten oleh semua aplikasi. Bendera ini harus digunakan hanya setelah aplikasi menentukan bahwa pengendali domain yang dikembalikan oleh DsGetDcName (ketika dipanggil tanpa bendera ini) tidak dapat diakses. Dalam hal ini, aplikasi harus mengulangi panggilan DsGetDcName dengan bendera ini untuk memastikan bahwa informasi cache yang tidak digunakan (jika ada) diabaikan dan pengontrol domain yang dapat dijangkau ditemukan.

DS_GC_SERVER_REQUIRED

Mengharuskan pengendali domain yang dikembalikan menjadi server katalog global untuk forest domain dengan domain ini sebagai akar. Jika bendera ini diatur dan parameter DomainName bukan NULL, DomainName harus menentukan nama forest. Bendera ini tidak dapat digabungkan dengan bendera DS_PDC_REQUIRED atau DS_KDC_REQUIRED .

DS_GOOD_TIMESERV_PREFERRED

DsGetDcName mencoba menemukan pengendali domain yang merupakan server waktu yang andal. Layanan Waktu Windows dapat dikonfigurasi untuk mendeklarasikan satu atau beberapa pengendali domain sebagai server waktu yang dapat diandalkan. Untuk informasi selengkapnya, lihat dokumentasi Layanan Waktu Windows . Bendera ini hanya dimaksudkan untuk digunakan oleh Layanan Waktu Windows.

DS_IP_REQUIRED

Parameter ini menunjukkan bahwa pengendali domain harus memiliki alamat IP. Dalam hal ini, DsGetDcName akan menempatkan alamat protokol Internet pengendali domain di anggota DomainControllerAddress dari DomainControllerInfo.

DS_IS_DNS_NAME

Menentukan bahwa parameter DomainName adalah nama DNS. Bendera ini tidak dapat digabungkan dengan bendera DS_IS_FLAT_NAME .

Tentukan DS_IS_DNS_NAME atau DS_IS_FLAT_NAME. Jika tidak ada bendera yang ditentukan, DsGetDcName mungkin membutuhkan waktu lebih lama untuk menemukan pengendali domain karena mungkin harus mencari gaya DNS dan nama datar.

DS_IS_FLAT_NAME

Menentukan bahwa parameter DomainName adalah nama datar. Bendera ini tidak dapat digabungkan dengan bendera DS_IS_DNS_NAME .

DS_KDC_REQUIRED

Mengharuskan pengendali domain yang dikembalikan saat ini menjalankan layanan Pusat Distribusi Kunci Kerberos. Bendera ini tidak dapat digabungkan dengan bendera DS_PDC_REQUIRED atau DS_GC_SERVER_REQUIRED .

DS_ONLY_LDAP_NEEDED

Menentukan bahwa server yang dikembalikan adalah server LDAP. Server yang dikembalikan belum tentu merupakan pengendali domain. Tidak ada layanan lain yang tersirat untuk hadir di server. Server yang dikembalikan tidak selalu memiliki kontainer konfigurasi bisa-tulis atau kontainer skema bisa-tulis. Server yang dikembalikan mungkin belum tentu digunakan untuk membuat atau memodifikasi prinsip keamanan. Bendera ini dapat digunakan dengan bendera DS_GC_SERVER_REQUIRED untuk mengembalikan server LDAP yang juga menghosting server katalog global. Server katalog global yang dikembalikan belum tentu merupakan pengendali domain. Tidak ada layanan lain yang tersirat untuk hadir di server. Jika bendera ini ditentukan, bendera DS_PDC_REQUIRED, DS_TIMESERV_REQUIRED, DS_GOOD_TIMESERV_PREFERRED, DS_DIRECTORY_SERVICES_PREFERED, DS_DIRECTORY_SERVICES_REQUIRED, dan DS_KDC_REQUIRED diabaikan.

DS_PDC_REQUIRED

Mengharuskan pengendali domain yang dikembalikan menjadi pengendali domain utama untuk domain tersebut. Bendera ini tidak dapat digabungkan dengan bendera DS_KDC_REQUIRED atau DS_GC_SERVER_REQUIRED .

DS_RETURN_DNS_NAME

Menentukan bahwa nama yang dikembalikan di anggota DomainControllerName dan DomainNamedomainControllerInfo harus berupa nama DNS. Jika nama DNS tidak tersedia, kesalahan akan ditampilkan. Bendera ini tidak dapat ditentukan dengan bendera DS_RETURN_FLAT_NAME . Bendera ini menyiratkan bendera DS_IP_REQUIRED .

DS_RETURN_FLAT_NAME

Menentukan bahwa nama yang dikembalikan di anggota DomainControllerName dan DomainNamedomainControllerInfo harus berupa nama datar. Jika nama datar tidak tersedia, kesalahan akan dikembalikan. Bendera ini tidak dapat ditentukan dengan bendera DS_RETURN_DNS_NAME .

DS_TIMESERV_REQUIRED

Mengharuskan pengendali domain yang dikembalikan saat ini menjalankan Layanan Waktu Windows.

DS_TRY_NEXTCLOSEST_SITE

Ketika bendera ini ditentukan, DsGetDcName mencoba menemukan pengendali domain di situs yang sama dengan pemanggil. Jika tidak ada pengendali domain yang ditemukan, pengontrol domain yang dapat memberikan informasi topologi dan memanggil DsBindToISTG untuk mendapatkan handel ikat, lalu panggil DsQuerySitesByCost melalui UDP untuk menentukan "situs terdekat berikutnya," dan akhirnya cache nama situs yang ditemukan. Jika tidak ada pengendali domain yang ditemukan di situs tersebut, maka DsGetDcName kembali ke metode default untuk menemukan pengendali domain.

Jika bendera ini digunakan bersama dengan nilai non-NULL dalam parameter input SiteName, maka ERROR_INVALID_FLAGS dilemparkan.

Selain itu, jenis pencarian yang digunakan dengan DS_TRY_NEXT_CLOSEST_SITE khusus situs, sehingga bendera ini diabaikan jika digunakan bersama dengan DS_PDC_REQUIRED. Akhirnya, DS_TRY_NEXTCLOSEST_SITE diabaikan ketika digunakan bersama dengan DS_RETURN_FLAT_NAME karena itu menggunakan NetBIOS untuk menyelesaikan nama, tetapi domain pengendali domain yang ditemukan tidak akan selalu cocok dengan domain tempat klien bergabung.

Catatan Bendera ini Kebijakan Grup diaktifkan. Jika Anda mengaktifkan pengaturan kebijakan "Situs Terdekat Berikutnya", Lokasi DC Situs Terdekat Berikutnya akan diaktifkan untuk komputer di semua adaptor jaringan yang tersedia tetapi tidak dikonfigurasi. Jika Anda menonaktifkan pengaturan kebijakan, Lokasi DC Situs Terdekat Berikutnya tidak akan digunakan secara default untuk komputer di semua adaptor jaringan yang tersedia tetapi tidak dikonfigurasi. Namun, jika panggilan Pencari Lokasi DC dilakukan menggunakan bendera DS_TRY_NEXTCLOSEST_SITE secara eksplisit, DsGetDcName mematuhi perilaku Situs Terdekat Berikutnya. Jika Anda tidak mengonfigurasi pengaturan kebijakan ini, Lokasi DC Situs Terdekat Berikutnya tidak akan digunakan secara default untuk komputer di semua adaptor jaringan yang tersedia tetapi tidak dikonfigurasi. Jika bendera DS_TRY_NEXTCLOSEST_SITE digunakan secara eksplisit, perilaku Situs Terdekat Berikutnya akan digunakan.
 

DS_WRITABLE_REQUIRED

Mengharuskan pengendali domain yang dikembalikan dapat ditulis; artinya, host salinan layanan direktori yang dapat ditulis.

DS_WEB_SERVICE_REQUIRED

Mengharuskan pengendali domain yang dikembalikan saat ini menjalankan layanan web Direktori Aktif.

[out] DomainControllerInfo

Penunjuk ke nilai PDOMAIN_CONTROLLER_INFO yang menerima penunjuk ke struktur DOMAIN_CONTROLLER_INFO yang berisi data tentang pengendali domain yang dipilih. Struktur ini dialokasikan oleh DsGetDcName. Pemanggil harus membebaskan struktur menggunakan fungsi NetApiBufferFree ketika tidak lagi diperlukan.

Mengembalikan nilai

Jika fungsi mengembalikan data pengendali domain, nilai yang dikembalikan ERROR_SUCCESS.

Jika fungsi gagal, nilai yang dikembalikan bisa menjadi salah satu kode kesalahan berikut.

Keterangan

Fungsi DsGetDcName dikirim ke layanan Netlogon pada komputer jarak jauh yang ditentukan oleh ComputerName. Jika ComputerNameNULL, fungsi diproses di komputer lokal.

DsGetDcName tidak memverifikasi bahwa nama pengendali domain yang dikembalikan adalah nama pengendali domain aktual atau katalog global. Jika autentikasi timbal balik diperlukan, pemanggil harus melakukan autentikasi.

DsGetDcName tidak memerlukan akses tertentu ke domain yang ditentukan. Secara default, fungsi ini tidak memastikan bahwa pengendali domain yang dikembalikan saat ini tersedia. Sebagai gantinya, pemanggil harus mencoba menggunakan pengendali domain yang dikembalikan. Jika pengendali domain tidak tersedia, pemanggil harus memanggil fungsi DsGetDcName lagi, menentukan bendera DS_FORCE_REDISCOVERY .

Waktu Respons

Saat menggunakan DsGetDcName , ketahui detail waktu berikut:
  • DsGetDcName melakukan panggilan jaringan dan dapat memakan waktu dari beberapa detik hingga satu menit, tergantung pada lalu lintas jaringan, topologi, beban DC, dan sebagainya.
  • TIDAK disarankan untuk memanggil DsGetDcName dari UI atau utas kritis pengaturan waktu lainnya.
  • Pencari Lokasi DC memang menggunakan logika yang dioptimalkan untuk memberikan informasi DC secepat mungkin. Ini juga menggunakan informasi cache di situs untuk menghubungi DC terdekat.

Catatan tentang Kelekatan Pengendali Domain

Dalam Active Directory Domain Services, fungsi pencari lokasi pengendali domain dirancang sehingga setelah klien menemukan pengontrol domain pilihan, klien tidak akan mencari yang lain kecuali pengendali domain tersebut berhenti merespons atau klien dimulai ulang. Ini disebut sebagai "Kelekatan Pengendali Domain." Karena stasiun kerja biasanya beroperasi selama berbulan-bulan tanpa masalah atau mulai ulang, salah satu konsekuensi yang tidak diinginkan dari perilaku ini adalah bahwa jika pengendali domain tertentu turun untuk pemeliharaan, semua klien yang terhubung ke dalamnya mengalihkan koneksi mereka ke pengontrol domain lain. Tetapi ketika pengendali domain muncul kembali, tidak ada klien yang pernah terhubung kembali ke sana karena klien tidak sering menghidupkan ulang. Hal ini dapat menyebabkan masalah penyeimbangan beban.

Sebelumnya, solusi paling umum untuk masalah ini adalah menyebarkan skrip pada setiap komputer klien yang secara berkala disebut DsGetDcName menggunakan DS_FORCE_REDISCOVERY bendera . Ini adalah solusi yang agak rumit, sehingga Windows Server 2008 dan Windows Vista memperkenalkan mekanisme baru yang menyebabkan masalah dengan kelekatan pengendali domain.

Setiap kali DsGetDcName mengambil nama pengendali domain dari cache-nya, DsGetDcName memeriksa untuk melihat apakah entri cache ini kedaluwarsa, dan jika demikian, membuang nama pengendali domain tersebut dan mencoba menemukan kembali nama pengendali domain. Masa pakai entri yang di-cache dikendalikan oleh nilai dalam kunci registri berikut

\ HKEY_LOCAL_MACHINESISTEM\CurrentControlSet\Layanan\Netlogon\Parameter\ForceRediscoveryInterval

dan

\ HKEY_LOCAL_MACHINEPerangkat lunak\Kebijakan\Microsoft\Netlogon\Parameter\ForceRediscoveryInterval

Nilai dalam kunci registri ini berjenis REG_DWORD. Mereka menentukan panjang dalam detik sebelum DsGetDcName harus mencoba menemukan kembali nama pengontrol domain. Nilai defaultnya adalah 43200 detik (12 jam). Jika nilai entri registri ForceRediscoveryInterval diatur ke 0, klien selalu melakukan penemuan ulang. Jika nilai diatur ke 4294967295, cache tidak pernah kedaluwarsa, dan pengontrol domain yang di-cache terus digunakan. Kami menyarankan agar Anda tidak mengatur entri registri ForceRediscoveryInterval ke nilai yang kurang dari 3600 detik (60 menit).

Catatan Pengaturan registri ForceRediscoveryInterval diaktifkan kebijakan grup. Jika Anda menonaktifkan pengaturan kebijakan, Force Rediscovery akan digunakan secara default untuk komputer pada setiap interval 12 jam. Jika Anda tidak mengonfigurasi pengaturan kebijakan ini, Force Rediscovery akan digunakan secara default untuk komputer pada setiap interval 12 jam, kecuali pengaturan komputer lokal dalam registri adalah nilai yang berbeda.
 
Perhatikan bahwa jika bendera DS_BACKGROUND_ONLY ditentukan, DsGetDcName tidak akan pernah mencoba menemukan kembali nama pengendali domain, karena titik bendera tersebut adalah memaksa DsGetDcName untuk menggunakan nama pengontrol domain yang di-cache meskipun kedaluwarsa.

Pelacakan ETW di DsGetDcName

Untuk mengaktifkan Pelacakan ETW untuk DsGetDcName, buat kunci registri berikut:

\ HKEY_LOCAL_MACHINESistem\CurrentControlSet\Layanan\DCLocator\Menelusuri

Kunci akan memiliki struktur sebagai berikut:

String ProcessName
  DWORD  PID <optional>

ProcessName harus berupa nama lengkap termasuk ekstensi proses yang ingin Anda dapatkan informasi pelacakannya. PID hanya diperlukan ketika ada beberapa proses dengan nama yang sama. Jika ditentukan, maka hanya proses dengan PID tersebut yang akan diaktifkan untuk pelacakan. Tidak dimungkinkan untuk melacak hanya 2 dari 3 (atau lebih) proses dengan nama yang sama. Anda dapat mengaktifkan satu instans atau semua instans (ketika beberapa instans dengan nama proses yang sama ada dan PID tidak ditentukan, semua instans akan diaktifkan untuk pelacakan).

Misalnya, ini akan melacak semua instans App1.exe dan App2.exe, tetapi hanya instans App3.exe yang memiliki PID 999:

App1.exe 
App2.exe
App3.exe
     PID 999

Jalankan perintah berikut untuk memulai sesi pelacakan:

tracelog.exe -start <sessionname> -guid #cfaa5446-c6c4-4f5c-866f-31c9b55b962d -f <filename> -flag <traceFlags>

sessionname adalah nama yang diberikan untuk sesi pelacakan. Guid untuk penyedia pelacakan DCLocator adalah "cfaa5446-c6c4-4f5c-866f-31c9b55b962d". nama file adalah nama file log tempat peristiwa ditulis. traceFlags adalah satu atau beberapa bendera berikut yang menandakan area mana yang akan dilacak:

Bendera Nilai Hex Deskripsi
DCLOCATOR_MISC 0x00000002 Penelusuran kesalahan lain-lain
DCLOCATOR_MAILSLOT 0x00000010 Pesan mailslot
DCLOCATOR_SITE 0x00000020 Situs
DCLOCATOR_CRITICAL 0x00000100 Kesalahan penting
DCLOCATOR_SESSION_SETUP 0x00000200 Pemeliharaan Domain Tepercaya
DCLOCATOR_DNS 0x00004000 Pendaftaran Nama
DCLOCATOR_DNS_MORE 0x00020000 Pendaftaran Nama Verbose
DCLOCATOR_MAILBOX_TEXT 0x02000000 Pesan Kotak Surat Verbose
DCLOCATOR_SITE_MORE 0x08000000 Situs verbose
 

Jalankan perintah berikut untuk menghentikan sesi pelacakan:

tracelog.exe -stop <sessionname>

sessionname adalah nama yang sama dengan nama yang Anda gunakan saat memulai sesi.

Catatan Kunci registri untuk proses yang sedang dilacak harus ada di registri pada saat sesi pelacakan dimulai. Ketika sesi dimulai, proses akan memverifikasi apakah sesi harus menghasilkan pesan jejak atau tidak (berdasarkan ada atau tidaknya kunci registri untuk nama proses tersebut dan PID opsional). Proses ini memeriksa registri hanya di awal sesi. Setiap perubahan dalam registri yang terjadi setelah itu tidak akan berpengaruh pada pelacakan.
 

Catatan

Header dsgetdc.h mendefinisikan DsGetDcName sebagai alias yang secara otomatis memilih versi ANSI atau Unicode dari fungsi ini berdasarkan definisi konstanta preprosektor UNICODE. Mencampur penggunaan alias encoding-netral dengan kode yang tidak mengodekan-netral dapat menyebabkan ketidakcocokan yang mengakibatkan kesalahan kompilasi atau runtime. Untuk informasi selengkapnya, lihat Konvensi untuk Prototipe Fungsi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista
Server minimum yang didukung Windows Server 2008
Target Platform Windows
Header dsgetdc.h
Pustaka NetApi32.lib
DLL NetApi32.dll

Lihat juga

DOMAIN_CONTROLLER_INFO

Fungsi Layanan Direktori

DsGetSiteName

DsValidateSubnetName

GUID

NetApiBufferFree

Layanan Waktu Windows