libnet_become_dc.c

来自「samba最新软件」· C语言 代码 · 共 2,239 行 · 第 1/5 页

C
2,239
字号
		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_ntSecurityDescriptor;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* objectClass: nTDSDSA */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		vd[0] = data_blob_talloc(vd, NULL, 4);		if (composite_nomem(vd[0].data, c)) return;		/* value for nTDSDSA */		SIVAL(vd[0].data, 0, 0x0017002F);		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_objectClass;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* objectCategory: CN=NTDS-DSA,CN=Schema,... */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[1];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= talloc_asprintf(vd, "CN=NTDS-DSA,%s",							  s->forest.schema_dn_str);		if (composite_nomem(v[0].dn, c)) return;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0], 					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_objectCategory;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* invocationId: random guid */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		const struct GUID *v;		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		v = &s->dest_dsa.invocation_id;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, v, (ndr_push_flags_fn_t)ndr_push_GUID);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_invocationId;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* hasMasterNCs: ... */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[3];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 3);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 3);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= s->forest.config_dn_str;		v[1].guid		= GUID_zero();		v[1].sid		= s->zero_sid;		v[1].dn			= s->domain.dn_str;		v[2].guid		= GUID_zero();		v[2].sid		= s->zero_sid;		v[2].dn			= s->forest.schema_dn_str;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		vs[1].blob		= &vd[1];		vs[2].blob		= &vd[2];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_hasMasterNCs;		attrs[i].value_ctr.num_values	= 3;		attrs[i].value_ctr.values	= vs;		i++;	}	/* msDS-hasMasterNCs: ... */	if (w2k3) {		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[3];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 3);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 3);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= s->forest.config_dn_str;		v[1].guid		= GUID_zero();		v[1].sid		= s->zero_sid;		v[1].dn			= s->domain.dn_str;		v[2].guid		= GUID_zero();		v[2].sid		= s->zero_sid;		v[2].dn			= s->forest.schema_dn_str;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, &v[1],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, &v[2],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		vs[1].blob		= &vd[1];		vs[2].blob		= &vd[2];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs;		attrs[i].value_ctr.num_values	= 3;		attrs[i].value_ctr.values	= vs;		i++;	}	/* dMDLocation: CN=Schema,... */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[1];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= s->forest.schema_dn_str;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_dMDLocation;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* msDS-HasDomainNCs: <domain_partition> */	if (w2k3) {		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[1];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= s->domain.dn_str;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* msDS-Behavior-Version */	if (w2k3) {		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		vd[0] = data_blob_talloc(vd, NULL, 4);		if (composite_nomem(vd[0].data, c)) return;		SIVAL(vd[0].data, 0, DS_BEHAVIOR_WIN2003);		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_msDS_Behavior_Version;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* systemFlags */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		vd[0] = data_blob_talloc(vd, NULL, 4);		if (composite_nomem(vd[0].data, c)) return;		SIVAL(vd[0].data, 0, SYSTEM_FLAG_DISALLOW_MOVE_ON_DELETE);		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_systemFlags;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* serverReference: ... */	{		struct drsuapi_DsAttributeValue *vs;		DATA_BLOB *vd;		struct drsuapi_DsReplicaObjectIdentifier3 v[1];		vs = talloc_array(attrs, struct drsuapi_DsAttributeValue, 1);		if (composite_nomem(vs, c)) return;		vd = talloc_array(vs, DATA_BLOB, 1);		if (composite_nomem(vd, c)) return;		v[0].guid		= GUID_zero();		v[0].sid		= s->zero_sid;		v[0].dn			= s->dest_dsa.computer_dn_str;		ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, &v[0],					       (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {			c->status = ndr_map_error2ntstatus(ndr_err);			if (!composite_is_ok(c)) return;		}		vs[0].blob		= &vd[0];		attrs[i].attid			= DRSUAPI_ATTRIBUTE_serverReference;		attrs[i].value_ctr.num_values	= 1;		attrs[i].value_ctr.values	= vs;		i++;	}	/* truncate the attribute list to the attribute count we have filled in */	num_attrs = i;	/* setup request structure */	r->in.bind_handle						= &s->drsuapi1.bind_handle;	r->in.level							= 2;	r->in.req.req2.first_object.next_object				= NULL;	r->in.req.req2.first_object.object.identifier			= identifier;	r->in.req.req2.first_object.object.unknown1			= 0x00000000;		r->in.req.req2.first_object.object.attribute_ctr.num_attributes	= num_attrs;	r->in.req.req2.first_object.object.attribute_ctr.attributes	= attrs;	req = dcerpc_drsuapi_DsAddEntry_send(s->drsuapi1.pipe, r, r);	composite_continue_rpc(c, req, becomeDC_drsuapi1_add_entry_recv, s);}static void becomeDC_drsuapi2_connect_recv(struct composite_context *req);static NTSTATUS becomeDC_prepare_db(struct libnet_BecomeDC_state *s);static void becomeDC_drsuapi1_add_entry_recv(struct rpc_request *req){	struct libnet_BecomeDC_state *s = talloc_get_type(req->async.private_data,					  struct libnet_BecomeDC_state);	struct composite_context *c = s->creq;	struct drsuapi_DsAddEntry *r = talloc_get_type(req->ndr.struct_ptr,				       struct drsuapi_DsAddEntry);	char *binding_str;	bool print = false;	if (req->p->conn->flags & DCERPC_DEBUG_PRINT_OUT) {		print = true;	}	c->status = dcerpc_ndr_request_recv(req);	if (!composite_is_ok(c)) return;	if (print) {		NDR_PRINT_OUT_DEBUG(drsuapi_DsAddEntry, r);	}	if (!W_ERROR_IS_OK(r->out.result)) {		composite_error(c, werror_to_ntstatus(r->out.result));		return;	}	if (r->out.level == 3) {		if (r->out.ctr.ctr3.count != 1) {			WERROR status;			if (r->out.ctr.ctr3.level != 1) {				composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);				return;			}			if (!r->out.ctr.ctr3.error) {				composite_error(c, NT_STATUS_INVALID_NETWORK_RESPONSE);				return;			}			status = r->out.ctr.ctr3.error->info1.status;			if (!r->out.ctr.ctr3.error->info1.info) {				composite_error(c, werror_to_ntstatus(status));				return;			}			/* see if we can get a more detailed error */			switch (r->out.ctr.ctr3.error->info1.level) {			case 1:				status = r->out.ctr.ctr3.error->info1.info->error1.status;				break;			case 4:			case 5:			case 6:			case 7:				status = r->out.ctr.ctr3.error->info1.info->errorX.status;				break;			}			composite_error(c, werror_to_ntstatus(status));			return;		}		s->dest_dsa.ntds_guid	= r->out.ctr.ctr3.objects[0].guid;	} else if (r->out.level == 2) {		if (r->out.ctr.ctr2.c

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?