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 + -
显示快捷键?