cli_netlogon.c
来自「samba-3.0.22.tar.gz 编译smb服务器的源码」· C语言 代码 · 共 953 行 · 第 1/2 页
C
953 行
/* We have to talloc_strdup, otherwise a talloc_steal would fail */ *dc_unc = talloc_strdup(mem_ctx, tmp); if (*dc_unc == NULL) { return WERR_NOMEM; } } if (dc_address != NULL) { char *tmp; if (rpcstr_pull_unistr2_talloc(mem_ctx, &tmp, &r.uni_dc_address) < 0) { return WERR_GENERAL_FAILURE; } if (*tmp == '\\') tmp += 1; if (*tmp == '\\') tmp += 1; /* We have to talloc_strdup, otherwise a talloc_steal would fail */ *dc_address = talloc_strdup(mem_ctx, tmp); if (*dc_address == NULL) { return WERR_NOMEM; } } if (dc_address_type != NULL) { *dc_address_type = r.dc_address_type; } if (domain_guid_out != NULL) { *domain_guid_out = r.domain_guid; } if ((domain_name_out != NULL) && (rpcstr_pull_unistr2_talloc(mem_ctx, domain_name_out, &r.uni_domain_name) < 1)) { return WERR_GENERAL_FAILURE; } if ((forest_name != NULL) && (rpcstr_pull_unistr2_talloc(mem_ctx, forest_name, &r.uni_forest_name) < 1)) { return WERR_GENERAL_FAILURE; } if (dc_flags != NULL) { *dc_flags = r.dc_flags; } if ((dc_site_name != NULL) && (rpcstr_pull_unistr2_talloc(mem_ctx, dc_site_name, &r.uni_dc_site_name) < 1)) { return WERR_GENERAL_FAILURE; } if ((client_site_name != NULL) && (rpcstr_pull_unistr2_talloc(mem_ctx, client_site_name, &r.uni_client_site_name) < 1)) { return WERR_GENERAL_FAILURE; } return WERR_OK;}/* Dsr_GetSiteName */WERROR rpccli_netlogon_dsr_getsitename(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const char *computer_name, char **site_name){ prs_struct qbuf, rbuf; NET_Q_DSR_GETSITENAME q; NET_R_DSR_GETSITENAME r; ZERO_STRUCT(q); ZERO_STRUCT(r); /* Initialize input parameters */ init_net_q_dsr_getsitename(&q, computer_name); /* Marshall data and send request */ CLI_DO_RPC_WERR(cli, mem_ctx, PI_NETLOGON, NET_DSR_GETSITENAME, q, r, qbuf, rbuf, net_io_q_dsr_getsitename, net_io_r_dsr_getsitename, WERR_GENERAL_FAILURE); if (!W_ERROR_IS_OK(r.result)) { return r.result; } if ((site_name != NULL) && (rpcstr_pull_unistr2_talloc(mem_ctx, site_name, &r.uni_site_name) < 1)) { return WERR_GENERAL_FAILURE; } return WERR_OK;}/* Sam synchronisation */NTSTATUS rpccli_netlogon_sam_sync(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, uint32 database_id, uint32 next_rid, uint32 *num_deltas, SAM_DELTA_HDR **hdr_deltas, SAM_DELTA_CTR **deltas){ prs_struct qbuf, rbuf; NET_Q_SAM_SYNC q; NET_R_SAM_SYNC r; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; DOM_CRED clnt_creds; DOM_CRED ret_creds; ZERO_STRUCT(q); ZERO_STRUCT(r); ZERO_STRUCT(ret_creds); /* Initialise input parameters */ creds_client_step(cli->dc, &clnt_creds); init_net_q_sam_sync(&q, cli->dc->remote_machine, global_myname(), &clnt_creds, &ret_creds, database_id, next_rid); /* Marshall data and send request */ CLI_DO_RPC_COPY_SESS_KEY(cli, mem_ctx, PI_NETLOGON, NET_SAM_SYNC, q, r, qbuf, rbuf, net_io_q_sam_sync, net_io_r_sam_sync, NT_STATUS_UNSUCCESSFUL); /* Return results */ result = r.status; *num_deltas = r.num_deltas2; *hdr_deltas = r.hdr_deltas; *deltas = r.deltas; if (!NT_STATUS_IS_ERR(result)) { /* Check returned credentials. */ if (!creds_client_check(cli->dc, &r.srv_creds.challenge)) { DEBUG(0,("cli_netlogon_sam_sync: credentials chain check failed\n")); return NT_STATUS_ACCESS_DENIED; } } return result;}/* Sam synchronisation */NTSTATUS rpccli_netlogon_sam_deltas(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, uint32 database_id, UINT64_S seqnum, uint32 *num_deltas, SAM_DELTA_HDR **hdr_deltas, SAM_DELTA_CTR **deltas){ prs_struct qbuf, rbuf; NET_Q_SAM_DELTAS q; NET_R_SAM_DELTAS r; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; DOM_CRED clnt_creds; ZERO_STRUCT(q); ZERO_STRUCT(r); /* Initialise input parameters */ creds_client_step(cli->dc, &clnt_creds); init_net_q_sam_deltas(&q, cli->dc->remote_machine, global_myname(), &clnt_creds, database_id, seqnum); /* Marshall data and send request */ CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SAM_DELTAS, q, r, qbuf, rbuf, net_io_q_sam_deltas, net_io_r_sam_deltas, NT_STATUS_UNSUCCESSFUL); /* Return results */ result = r.status; *num_deltas = r.num_deltas2; *hdr_deltas = r.hdr_deltas; *deltas = r.deltas; if (!NT_STATUS_IS_ERR(result)) { /* Check returned credentials. */ if (!creds_client_check(cli->dc, &r.srv_creds.challenge)) { DEBUG(0,("cli_netlogon_sam_sync: credentials chain check failed\n")); return NT_STATUS_ACCESS_DENIED; } } return result;}/* Logon domain user */NTSTATUS rpccli_netlogon_sam_logon(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, uint32 logon_parameters, const char *domain, const char *username, const char *password, int logon_type){ prs_struct qbuf, rbuf; NET_Q_SAM_LOGON q; NET_R_SAM_LOGON r; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; DOM_CRED clnt_creds; DOM_CRED ret_creds; NET_ID_INFO_CTR ctr; NET_USER_INFO_3 user; int validation_level = 3; fstring clnt_name_slash; ZERO_STRUCT(q); ZERO_STRUCT(r); ZERO_STRUCT(ret_creds); fstr_sprintf( clnt_name_slash, "\\\\%s", global_myname() ); /* Initialise input parameters */ creds_client_step(cli->dc, &clnt_creds); q.validation_level = validation_level; ctr.switch_value = logon_type; switch (logon_type) { case INTERACTIVE_LOGON_TYPE: { unsigned char lm_owf_user_pwd[16], nt_owf_user_pwd[16]; nt_lm_owf_gen(password, nt_owf_user_pwd, lm_owf_user_pwd); init_id_info1(&ctr.auth.id1, domain, logon_parameters, /* param_ctrl */ 0xdead, 0xbeef, /* LUID? */ username, clnt_name_slash, (const char *)cli->dc->sess_key, lm_owf_user_pwd, nt_owf_user_pwd); break; } case NET_LOGON_TYPE: { uint8 chal[8]; unsigned char local_lm_response[24]; unsigned char local_nt_response[24]; generate_random_buffer(chal, 8); SMBencrypt(password, chal, local_lm_response); SMBNTencrypt(password, chal, local_nt_response); init_id_info2(&ctr.auth.id2, domain, logon_parameters, /* param_ctrl */ 0xdead, 0xbeef, /* LUID? */ username, clnt_name_slash, chal, local_lm_response, 24, local_nt_response, 24); break; } default: DEBUG(0, ("switch value %d not supported\n", ctr.switch_value)); return NT_STATUS_INVALID_INFO_CLASS; } r.user = &user; init_sam_info(&q.sam_id, cli->dc->remote_machine, global_myname(), &clnt_creds, &ret_creds, logon_type, &ctr); /* Marshall data and send request */ CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SAMLOGON, q, r, qbuf, rbuf, net_io_q_sam_logon, net_io_r_sam_logon, NT_STATUS_UNSUCCESSFUL); /* Return results */ result = r.status; if (r.buffer_creds) { /* Check returned credentials if present. */ if (!creds_client_check(cli->dc, &r.srv_creds.challenge)) { DEBUG(0,("rpccli_netlogon_sam_logon: credentials chain check failed\n")); return NT_STATUS_ACCESS_DENIED; } } return result;}/** * Logon domain user with an 'network' SAM logon * * @param info3 Pointer to a NET_USER_INFO_3 already allocated by the caller. **/NTSTATUS rpccli_netlogon_sam_network_logon(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, uint32 logon_parameters, const char *server, const char *username, const char *domain, const char *workstation, const uint8 chal[8], DATA_BLOB lm_response, DATA_BLOB nt_response, NET_USER_INFO_3 *info3){ prs_struct qbuf, rbuf; NET_Q_SAM_LOGON q; NET_R_SAM_LOGON r; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; NET_ID_INFO_CTR ctr; int validation_level = 3; const char *workstation_name_slash; const char *server_name_slash; static uint8 zeros[16]; DOM_CRED clnt_creds; DOM_CRED ret_creds; int i; ZERO_STRUCT(q); ZERO_STRUCT(r); ZERO_STRUCT(ret_creds); creds_client_step(cli->dc, &clnt_creds); if (server[0] != '\\' && server[1] != '\\') { server_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", server); } else { server_name_slash = server; } if (workstation[0] != '\\' && workstation[1] != '\\') { workstation_name_slash = talloc_asprintf(mem_ctx, "\\\\%s", workstation); } else { workstation_name_slash = workstation; } if (!workstation_name_slash || !server_name_slash) { DEBUG(0, ("talloc_asprintf failed!\n")); return NT_STATUS_NO_MEMORY; } /* Initialise input parameters */ q.validation_level = validation_level; ctr.switch_value = NET_LOGON_TYPE; init_id_info2(&ctr.auth.id2, domain, logon_parameters, /* param_ctrl */ 0xdead, 0xbeef, /* LUID? */ username, workstation_name_slash, (const uchar*)chal, lm_response.data, lm_response.length, nt_response.data, nt_response.length); init_sam_info(&q.sam_id, server_name_slash, global_myname(), &clnt_creds, &ret_creds, NET_LOGON_TYPE, &ctr); r.user = info3; /* Marshall data and send request */ CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SAMLOGON, q, r, qbuf, rbuf, net_io_q_sam_logon, net_io_r_sam_logon, NT_STATUS_UNSUCCESSFUL); if (memcmp(zeros, info3->user_sess_key, 16) != 0) { SamOEMhash(info3->user_sess_key, cli->dc->sess_key, 16); } else { memset(info3->user_sess_key, '\0', 16); } if (memcmp(zeros, info3->lm_sess_key, 8) != 0) { SamOEMhash(info3->lm_sess_key, cli->dc->sess_key, 8); } else { memset(info3->lm_sess_key, '\0', 8); } memset(&info3->acct_flags, '\0', 4); for (i=0; i < 7; i++) { memset(&info3->unknown[i], '\0', 4); } /* Return results */ result = r.status; if (r.buffer_creds) { /* Check returned credentials if present. */ if (!creds_client_check(cli->dc, &r.srv_creds.challenge)) { DEBUG(0,("rpccli_netlogon_sam_network_logon: credentials chain check failed\n")); return NT_STATUS_ACCESS_DENIED; } } return result;}/***************************************************************************LSA Server Password Set.****************************************************************************/NTSTATUS rpccli_net_srv_pwset(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, const char *machine_name, const uint8 hashed_mach_pwd[16]){ prs_struct rbuf; prs_struct qbuf; DOM_CRED clnt_creds; NET_Q_SRV_PWSET q; NET_R_SRV_PWSET r; uint16 sec_chan_type = 2; NTSTATUS result; creds_client_step(cli->dc, &clnt_creds); DEBUG(4,("cli_net_srv_pwset: srv:%s acct:%s sc: %d mc: %s\n", cli->dc->remote_machine, cli->dc->mach_acct, sec_chan_type, machine_name)); /* store the parameters */ init_q_srv_pwset(&q, cli->dc->remote_machine, (const char *)cli->dc->sess_key, cli->dc->mach_acct, sec_chan_type, machine_name, &clnt_creds, hashed_mach_pwd); CLI_DO_RPC(cli, mem_ctx, PI_NETLOGON, NET_SRVPWSET, q, r, qbuf, rbuf, net_io_q_srv_pwset, net_io_r_srv_pwset, NT_STATUS_UNSUCCESSFUL); result = r.status; if (!NT_STATUS_IS_OK(result)) { /* report error code */ DEBUG(0,("cli_net_srv_pwset: %s\n", nt_errstr(result))); } /* Always check returned credentials. */ if (!creds_client_check(cli->dc, &r.srv_cred.challenge)) { DEBUG(0,("rpccli_net_srv_pwset: credentials chain check failed\n")); return NT_STATUS_ACCESS_DENIED; } return result;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?