//Enumerate all dcs with srv records public static IEnumerable <string> EnumerateDCs(string domainDnsName, DsFlag flags) { IntPtr handle; int result = NativeMethods.DsGetDcOpenW(domainDnsName, DsEnumerateOptions.None, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, flags, out handle); if (result != 0) { ThrowNetApi(result); } try { IntPtr hostName; while ((result = NativeMethods.DsGetDcNextW(handle, IntPtr.Zero, IntPtr.Zero, out hostName)) == 0) { yield return(Marshal.PtrToStringUni(hostName)); NativeMethods.NetApiBufferFree(hostName); } if (result != 259) //NoMoreItems { ThrowNetApi(result); } } finally { NativeMethods.DsGetDcCloseW(handle); } }
public static extern int DsGetDcNameW( string ComputerName, string DomainName, IntPtr DomainGuid, IntPtr SiteName, DsFlag Flags, out IntPtr DomainControllerInfo);
public static extern int DsGetDcOpenW( string DnsName, DsEnumerateOptions options, IntPtr SiteName, IntPtr DomainGuid, IntPtr DnsForestName, DsFlag Flags, out IntPtr GetDcContext);
//Get a dc in the domain public static DOMAIN_CONTROLLER_INFO GetDc(string domainName, DsFlag flags, string computerNameToPerformSearch = null) { IntPtr returnValue; int result = string.IsNullOrWhiteSpace(computerNameToPerformSearch) ? NativeMethods.DsGetDcNameW(IntPtr.Zero, domainName, IntPtr.Zero, IntPtr.Zero, flags, out returnValue) : NativeMethods.DsGetDcNameW(computerNameToPerformSearch, domainName, IntPtr.Zero, IntPtr.Zero, flags, out returnValue); if (result != 0) { ThrowNetApi(result); } var dci = (DOMAIN_CONTROLLER_INFO)Marshal.PtrToStructure(returnValue, typeof(DOMAIN_CONTROLLER_INFO)); NativeMethods.NetApiBufferFree(returnValue); return(dci); }