if (!r->in.dc_name) {
struct netr_DsRGetDCNameInfo *info;
const char *dc;
+ uint32_t name_type_flags = 0;
+ if (r->in.domain_name_type == JoinDomNameTypeDNS) {
+ name_type_flags = DS_IS_DNS_NAME;
+ } else if (r->in.domain_name_type == JoinDomNameTypeNBT) {
+ name_type_flags = DS_IS_FLAT_NAME;
+ }
status = dsgetdcname(mem_ctx,
r->in.msg_ctx,
r->in.domain_name,
DS_FORCE_REDISCOVERY |
DS_DIRECTORY_SERVICE_REQUIRED |
DS_WRITABLE_REQUIRED |
- DS_RETURN_DNS_NAME,
+ DS_RETURN_DNS_NAME |
+ name_type_flags,
&info);
if (!NT_STATUS_IS_OK(status)) {
libnet_join_set_error_string(mem_ctx, r,
typedef bitmap wkssvc_joinflags wkssvc_joinflags;
typedef enum netr_SchannelType netr_SchannelType;
+ typedef [public] enum {
+ JoinDomNameTypeUnknown = 0,
+ JoinDomNameTypeDNS = 1,
+ JoinDomNameTypeNBT = 2
+ } libnetjoin_JoinDomNameType;
+
[nopush,nopull,noopnum] WERROR libnet_JoinCtx(
[in] string dc_name,
[in] string machine_name,
[in,ref] string *domain_name,
+ [in] libnetjoin_JoinDomNameType domain_name_type,
[in] string account_ou,
[in] string admin_account,
[in] string admin_domain,
const char *os_version = NULL;
const char *os_servicepack = NULL;
bool modify_config = lp_config_backend_is_registry();
+ enum libnetjoin_JoinDomNameType domain_name_type = JoinDomNameTypeDNS;
if (c->display_usage)
return net_ads_join_usage(c, argc, argv);
}
else {
domain = argv[i];
+ if (strchr(domain, '.') == NULL) {
+ domain_name_type = JoinDomNameTypeUnknown;
+ } else {
+ domain_name_type = JoinDomNameTypeDNS;
+ }
}
}
/* Do the domain join here */
r->in.domain_name = domain;
+ r->in.domain_name_type = domain_name_type;
r->in.create_upn = createupn;
r->in.upn = machineupn;
r->in.account_ou = create_in_ou;
if (W_ERROR_EQUAL(werr, WERR_DCNOTFOUND) &&
strequal(domain, lp_realm())) {
r->in.domain_name = lp_workgroup();
+ r->in.domain_name_type = JoinDomNameTypeNBT;
werr = libnet_Join(ctx, r);
}
if (!W_ERROR_IS_OK(werr)) {