static WERROR cmd_netlogon_dsr_getdcnameex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { WERROR result; NTSTATUS status; uint32_t flags = DS_RETURN_DNS_NAME; const char *server_name = cli->desthost; const char *domain_name; const char *site_name = NULL; struct GUID domain_guid = GUID_zero(); struct netr_DsRGetDCNameInfo *info = NULL; struct dcerpc_binding_handle *b = cli->binding_handle; if (argc < 2) { fprintf(stderr, "Usage: %s [domain_name] [domain_guid] " "[site_name] [flags]\n", argv[0]); return WERR_OK; } domain_name = argv[1]; if (argc >= 3) { if (!NT_STATUS_IS_OK(GUID_from_string(argv[2], &domain_guid))) { return WERR_NOMEM; } } if (argc >= 4) { site_name = argv[3]; } if (argc >= 5) { sscanf(argv[4], "%x", &flags); } debug_dsdcinfo_flags(1,flags); status = dcerpc_netr_DsRGetDCNameEx(b, mem_ctx, server_name, domain_name, &domain_guid, site_name, flags, &info, &result); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(result)) { return result; } d_printf("DsRGetDCNameEx gave %s\n", NDR_PRINT_STRUCT_STRING(mem_ctx, netr_DsRGetDCNameInfo, info)); return result; }
WERROR DsGetDcName_r(struct libnetapi_ctx *ctx, struct DsGetDcName *r) { WERROR werr; NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND; struct dcerpc_binding_handle *b; werr = libnetapi_get_binding_handle(ctx, r->in.server_name, &ndr_table_netlogon, &b); if (!W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_netr_DsRGetDCNameEx(b, ctx, r->in.server_name, r->in.domain_name, r->in.domain_guid, r->in.site_name, r->in.flags, (struct netr_DsRGetDCNameInfo **)r->out.dc_info, &werr); if (NT_STATUS_IS_OK(status) && W_ERROR_IS_OK(werr)) { goto done; } status = dcerpc_netr_DsRGetDCName(b, ctx, r->in.server_name, r->in.domain_name, r->in.domain_guid, NULL, r->in.flags, (struct netr_DsRGetDCNameInfo **)r->out.dc_info, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: return werr; }