WERROR NetJoinDomain_r(struct libnetapi_ctx *ctx, struct NetJoinDomain *r) { struct rpc_pipe_client *pipe_cli = NULL; struct wkssvc_PasswordBuffer *encrypted_password = NULL; NTSTATUS status; WERROR werr; unsigned int old_timeout = 0; struct dcerpc_binding_handle *b; DATA_BLOB session_key; if (IS_DC) { return WERR_NERR_SETUPDOMAINCONTROLLER; } werr = libnetapi_open_pipe(ctx, r->in.server, &ndr_table_wkssvc, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } b = pipe_cli->binding_handle; if (r->in.password) { status = cli_get_session_key(talloc_tos(), pipe_cli, &session_key); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } encode_wkssvc_join_password_buffer(ctx, r->in.password, &session_key, &encrypted_password); } old_timeout = rpccli_set_timeout(pipe_cli, 600000); status = dcerpc_wkssvc_NetrJoinDomain2(b, talloc_tos(), r->in.server, r->in.domain, r->in.account_ou, r->in.account, encrypted_password, r->in.join_flags, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: if (pipe_cli && old_timeout) { rpccli_set_timeout(pipe_cli, old_timeout); } return werr; }
WERROR NetJoinDomain_r(struct libnetapi_ctx *ctx, struct NetJoinDomain *r) { struct rpc_pipe_client *pipe_cli = NULL; struct wkssvc_PasswordBuffer *encrypted_password = NULL; NTSTATUS status; WERROR werr; unsigned int old_timeout = 0; werr = libnetapi_open_pipe(ctx, r->in.server, &ndr_table_wkssvc.syntax_id, &pipe_cli); if (!W_ERROR_IS_OK(werr)) { goto done; } if (r->in.password) { encode_wkssvc_join_password_buffer(ctx, r->in.password, &pipe_cli->auth->user_session_key, &encrypted_password); } old_timeout = rpccli_set_timeout(pipe_cli, 600000); status = rpccli_wkssvc_NetrJoinDomain2(pipe_cli, talloc_tos(), r->in.server, r->in.domain, r->in.account_ou, r->in.account, encrypted_password, r->in.join_flags, &werr); if (!NT_STATUS_IS_OK(status)) { werr = ntstatus_to_werror(status); goto done; } done: if (pipe_cli && old_timeout) { rpccli_set_timeout(pipe_cli, old_timeout); } return werr; }
static WERROR cmd_netlogon_getdcname(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv) { const char *dcname = NULL; NTSTATUS status; WERROR werr; int old_timeout; struct dcerpc_binding_handle *b = cli->binding_handle; if (argc != 2) { fprintf(stderr, "Usage: %s domainname\n", argv[0]); return WERR_OK; } /* Make sure to wait for our DC's reply */ old_timeout = rpccli_set_timeout(cli, 30000); /* 30 seconds. */ rpccli_set_timeout(cli, MAX(30000, old_timeout)); /* At least 30 sec */ status = dcerpc_netr_GetDcName(b, mem_ctx, cli->desthost, argv[1], &dcname, &werr); rpccli_set_timeout(cli, old_timeout); if (!NT_STATUS_IS_OK(status)) { return ntstatus_to_werror(status); } if (!W_ERROR_IS_OK(werr)) { return werr; } /* Display results */ printf("%s\n", dcname); return werr; }
enum winbindd_result winbindd_dual_getdcname(struct winbindd_domain *domain, struct winbindd_cli_state *state) { const char *dcname_slash = NULL; const char *p; struct rpc_pipe_client *netlogon_pipe; NTSTATUS result; WERROR werr; unsigned int orig_timeout; struct winbindd_domain *req_domain; state->request->domain_name [sizeof(state->request->domain_name)-1] = '\0'; DEBUG(3, ("[%5lu]: Get DC name for %s\n", (unsigned long)state->pid, state->request->domain_name)); result = cm_connect_netlogon(domain, &netlogon_pipe); if (!NT_STATUS_IS_OK(result)) { DEBUG(1, ("Can't contact the NETLOGON pipe\n")); return WINBINDD_ERROR; } /* This call can take a long time - allow the server to time out. 35 seconds should do it. */ orig_timeout = rpccli_set_timeout(netlogon_pipe, 35000); req_domain = find_domain_from_name_noinit(state->request->domain_name); if (req_domain == domain) { result = rpccli_netr_GetDcName(netlogon_pipe, state->mem_ctx, domain->dcname, state->request->domain_name, &dcname_slash, &werr); } else { result = rpccli_netr_GetAnyDCName(netlogon_pipe, state->mem_ctx, domain->dcname, state->request->domain_name, &dcname_slash, &werr); } /* And restore our original timeout. */ rpccli_set_timeout(netlogon_pipe, orig_timeout); if (!NT_STATUS_IS_OK(result)) { DEBUG(5,("Error requesting DCname for domain %s: %s\n", state->request->domain_name, nt_errstr(result))); return WINBINDD_ERROR; } if (!W_ERROR_IS_OK(werr)) { DEBUG(5, ("Error requesting DCname for domain %s: %s\n", state->request->domain_name, win_errstr(werr))); return WINBINDD_ERROR; } p = dcname_slash; if (*p == '\\') { p+=1; } if (*p == '\\') { p+=1; } fstrcpy(state->response->data.dc_name, p); return WINBINDD_OK; }