static NTSTATUS process_dc_dns(TALLOC_CTX *mem_ctx, const char *domain_name, uint32_t flags, struct ip_service_name *dclist, int num_dcs, struct netr_DsRGetDCNameInfo **info) { int i = 0; bool valid_dc = false; struct netlogon_samlogon_response *r = NULL; uint32_t nt_version = NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_5EX; uint32_t ret_flags = 0; NTSTATUS status; nt_version |= map_ds_flags_to_nt_version(flags); for (i=0; i<num_dcs; i++) { char addr[INET6_ADDRSTRLEN]; print_sockaddr(addr, sizeof(addr), &dclist[i].ss); DEBUG(10,("LDAP ping to %s (%s)\n", dclist[i].hostname, addr)); if (ads_cldap_netlogon(mem_ctx, &dclist[i].ss, domain_name, nt_version, &r)) { nt_version = r->ntver; ret_flags = get_cldap_reply_server_flags(r, nt_version); if (check_cldap_reply_required_flags(ret_flags, flags)) { valid_dc = true; break; } } continue; } if (!valid_dc) { return NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; } status = make_dc_info_from_cldap_reply(mem_ctx, flags, &dclist[i].ss, &r->data.nt5_ex, info); if (NT_STATUS_IS_OK(status)) { return store_cldap_reply(mem_ctx, flags, &dclist[i].ss, nt_version, &r->data.nt5_ex); } return status; }
/* this implements the CLDAP based netlogon lookup requests for finding the domain controller of a ADS domain */ static int net_ads_lookup(int argc, const char **argv) { ADS_STRUCT *ads; ads = ads_init(NULL, opt_target_workgroup, opt_host); if (ads) { ads->auth.flags |= ADS_AUTH_NO_BIND; } ads_connect(ads); if (!ads || !ads->config.realm) { d_printf("Didn't find the cldap server!\n"); return -1; } return ads_cldap_netlogon(ads); }
bool ads_cldap_netlogon_5(TALLOC_CTX *mem_ctx, const char *server, const char *realm, struct nbt_cldap_netlogon_5 *reply5) { uint32_t nt_version = NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX; union nbt_cldap_netlogon *reply = NULL; bool ret; ret = ads_cldap_netlogon(mem_ctx, server, realm, &nt_version, &reply); if (!ret) { return false; } if (nt_version != (NETLOGON_VERSION_5 | NETLOGON_VERSION_5EX)) { return false; } *reply5 = reply->logon5; return true; }
bool ads_cldap_netlogon_5(TALLOC_CTX *mem_ctx, const char *server, const char *realm, struct NETLOGON_SAM_LOGON_RESPONSE_EX *reply5) { uint32_t nt_version = NETLOGON_NT_VERSION_5 | NETLOGON_NT_VERSION_5EX; struct netlogon_samlogon_response *reply = NULL; bool ret; ret = ads_cldap_netlogon(mem_ctx, server, realm, nt_version, &reply); if (!ret) { return false; } if (reply->ntver != NETLOGON_NT_VERSION_5EX) { DEBUG(0,("ads_cldap_netlogon_5: nt_version mismatch: 0x%08x\n", reply->ntver)); return false; } *reply5 = reply->data.nt5_ex; return true; }