libnet_vampire.c

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

C
713
字号
	s->schema = dsdb_get_schema(s->ldb);	if (!s->schema) {		DEBUG(0,("Failed to get loaded dsdb_schema\n"));		return NT_STATUS_FOOBAR;	}	return NT_STATUS_OK;}static NTSTATUS vampire_schema_chunk(void *private_data,					    const struct libnet_BecomeDC_StoreChunk *c){	struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);	WERROR status;	const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;	uint32_t total_object_count;	uint32_t object_count;	struct drsuapi_DsReplicaObjectListItemEx *first_object;	struct drsuapi_DsReplicaObjectListItemEx *cur;	switch (c->ctr_level) {	case 1:		mapping_ctr		= &c->ctr1->mapping_ctr;		total_object_count	= c->ctr1->total_object_count;		object_count		= c->ctr1->object_count;		first_object		= c->ctr1->first_object;		break;	case 6:		mapping_ctr		= &c->ctr6->mapping_ctr;		total_object_count	= c->ctr6->total_object_count;		object_count		= c->ctr6->object_count;		first_object		= c->ctr6->first_object;		break;	default:		return NT_STATUS_INVALID_PARAMETER;	}	if (total_object_count) {		DEBUG(0,("Schema-DN[%s] objects[%u/%u]\n",			c->partition->nc.dn, object_count, total_object_count));	} else {		DEBUG(0,("Schema-DN[%s] objects[%u]\n",		c->partition->nc.dn, object_count));	}	if (!s->schema) {		s->self_made_schema = dsdb_new_schema(s, lp_iconv_convenience(s->lp_ctx));		NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema);		status = dsdb_load_oid_mappings_drsuapi(s->self_made_schema, mapping_ctr);		if (!W_ERROR_IS_OK(status)) {			return werror_to_ntstatus(status);		}		s->schema = s->self_made_schema;	} else {		status = dsdb_verify_oid_mappings_drsuapi(s->schema, mapping_ctr);		if (!W_ERROR_IS_OK(status)) {			return werror_to_ntstatus(status);		}	}	if (!s->schema_part.first_object) {		s->schema_part.object_count = object_count;		s->schema_part.first_object = talloc_steal(s, first_object);	} else {		s->schema_part.object_count		+= object_count;		s->schema_part.last_object->next_object = talloc_steal(s->schema_part.last_object,								       first_object);	}	for (cur = first_object; cur->next_object; cur = cur->next_object) {}	s->schema_part.last_object = cur;	if (c->partition->highwatermark.tmp_highest_usn == c->partition->highwatermark.highest_usn) {		return vampire_apply_schema(s, c);	}	return NT_STATUS_OK;}static NTSTATUS vampire_store_chunk(void *private_data,					   const struct libnet_BecomeDC_StoreChunk *c){	struct vampire_state *s = talloc_get_type(private_data, struct vampire_state);	WERROR status;	const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr;	uint32_t total_object_count;	uint32_t object_count;	struct drsuapi_DsReplicaObjectListItemEx *first_object;	uint32_t linked_attributes_count;	struct drsuapi_DsReplicaLinkedAttribute *linked_attributes;	const struct drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;	struct dsdb_extended_replicated_objects *objs;	struct repsFromTo1 *s_dsa;	char *tmp_dns_name;	uint32_t i;	s_dsa			= talloc_zero(s, struct repsFromTo1);	NT_STATUS_HAVE_NO_MEMORY(s_dsa);	s_dsa->other_info	= talloc(s_dsa, struct repsFromTo1OtherInfo);	NT_STATUS_HAVE_NO_MEMORY(s_dsa->other_info);	switch (c->ctr_level) {	case 1:		mapping_ctr			= &c->ctr1->mapping_ctr;		total_object_count		= c->ctr1->total_object_count;		object_count			= c->ctr1->object_count;		first_object			= c->ctr1->first_object;		linked_attributes_count		= 0;		linked_attributes		= NULL;		s_dsa->highwatermark		= c->ctr1->new_highwatermark;		s_dsa->source_dsa_obj_guid	= c->ctr1->source_dsa_guid;		s_dsa->source_dsa_invocation_id = c->ctr1->source_dsa_invocation_id;		uptodateness_vector		= NULL; /* TODO: map it */		break;	case 6:		mapping_ctr			= &c->ctr6->mapping_ctr;		total_object_count		= c->ctr6->total_object_count;		object_count			= c->ctr6->object_count;		first_object			= c->ctr6->first_object;		linked_attributes_count		= c->ctr6->linked_attributes_count;		linked_attributes		= c->ctr6->linked_attributes;		s_dsa->highwatermark		= c->ctr6->new_highwatermark;		s_dsa->source_dsa_obj_guid	= c->ctr6->source_dsa_guid;		s_dsa->source_dsa_invocation_id = c->ctr6->source_dsa_invocation_id;		uptodateness_vector		= c->ctr6->uptodateness_vector;		break;	default:		return NT_STATUS_INVALID_PARAMETER;	}	s_dsa->replica_flags		= DRSUAPI_DS_REPLICA_NEIGHBOUR_WRITEABLE					| DRSUAPI_DS_REPLICA_NEIGHBOUR_SYNC_ON_STARTUP					| DRSUAPI_DS_REPLICA_NEIGHBOUR_DO_SCHEDULED_SYNCS;	memset(s_dsa->schedule, 0x11, sizeof(s_dsa->schedule));	tmp_dns_name	= GUID_string(s_dsa->other_info, &s_dsa->source_dsa_obj_guid);	NT_STATUS_HAVE_NO_MEMORY(tmp_dns_name);	tmp_dns_name	= talloc_asprintf_append_buffer(tmp_dns_name, "._msdcs.%s", c->forest->dns_name);	NT_STATUS_HAVE_NO_MEMORY(tmp_dns_name);	s_dsa->other_info->dns_name = tmp_dns_name;	if (total_object_count) {		DEBUG(0,("Partition[%s] objects[%u/%u]\n",			c->partition->nc.dn, object_count, total_object_count));	} else {		DEBUG(0,("Partition[%s] objects[%u]\n",		c->partition->nc.dn, object_count));	}	status = dsdb_extended_replicated_objects_commit(s->ldb,							 c->partition->nc.dn,							 mapping_ctr,							 object_count,							 first_object,							 linked_attributes_count,							 linked_attributes,							 s_dsa,							 uptodateness_vector,							 c->gensec_skey,							 s, &objs);	if (!W_ERROR_IS_OK(status)) {		DEBUG(0,("Failed to commit objects: %s\n", win_errstr(status)));		return werror_to_ntstatus(status);	}	if (lp_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) {		for (i=0; i < objs->num_objects; i++) {			struct ldb_ldif ldif;			fprintf(stdout, "#\n");			ldif.changetype = LDB_CHANGETYPE_NONE;			ldif.msg = objs->objects[i].msg;			ldb_ldif_write_file(s->ldb, stdout, &ldif);			NDR_PRINT_DEBUG(replPropertyMetaDataBlob, objs->objects[i].meta_data);		}	}	talloc_free(s_dsa);	talloc_free(objs);	for (i=0; i < linked_attributes_count; i++) {		const struct dsdb_attribute *sa;		if (!linked_attributes[i].identifier) {			return NT_STATUS_FOOBAR;				}		if (!linked_attributes[i].value.blob) {			return NT_STATUS_FOOBAR;				}		sa = dsdb_attribute_by_attributeID_id(s->schema,						      linked_attributes[i].attid);		if (!sa) {			return NT_STATUS_FOOBAR;		}		if (lp_parm_bool(s->lp_ctx, NULL, "become dc", "dump objects", false)) {			DEBUG(0,("# %s\n", sa->lDAPDisplayName));			NDR_PRINT_DEBUG(drsuapi_DsReplicaLinkedAttribute, &linked_attributes[i]);			dump_data(0,				linked_attributes[i].value.blob->data,				linked_attributes[i].value.blob->length);		}	}	return NT_STATUS_OK;}NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, 			struct libnet_Vampire *r){	struct libnet_JoinDomain *join;	struct libnet_set_join_secrets *set_secrets;	struct libnet_BecomeDC b;	struct vampire_state *s;	struct ldb_message *msg;	int ldb_ret;	uint32_t i;	NTSTATUS status;	const char *account_name;	const char *netbios_name;		r->out.error_string = NULL;	s = talloc_zero(mem_ctx, struct vampire_state);	if (!s) {		return NT_STATUS_NO_MEMORY;	}	s->lp_ctx = ctx->lp_ctx;	s->event_ctx = ctx->event_ctx;	join = talloc_zero(s, struct libnet_JoinDomain);	if (!join) {		return NT_STATUS_NO_MEMORY;	}			if (r->in.netbios_name != NULL) {		netbios_name = r->in.netbios_name;	} else {		netbios_name = talloc_reference(join, lp_netbios_name(ctx->lp_ctx));		if (!netbios_name) {			r->out.error_string = NULL;			talloc_free(s);			return NT_STATUS_NO_MEMORY;		}	}	account_name = talloc_asprintf(join, "%s$", netbios_name);	if (!account_name) {		r->out.error_string = NULL;		talloc_free(s);		return NT_STATUS_NO_MEMORY;	}		join->in.domain_name	= r->in.domain_name;	join->in.account_name	= account_name;	join->in.netbios_name	= netbios_name;	join->in.level		= LIBNET_JOINDOMAIN_AUTOMATIC;	join->in.acct_type	= ACB_WSTRUST;	join->in.recreate_account = false;	status = libnet_JoinDomain(ctx, join, join);	if (!NT_STATUS_IS_OK(status)) {		r->out.error_string = talloc_steal(mem_ctx, join->out.error_string);		talloc_free(s);		return status;	}		s->join = join;	s->targetdir = r->in.targetdir;	ZERO_STRUCT(b);	b.in.domain_dns_name		= join->out.realm;	b.in.domain_netbios_name	= join->out.domain_name;	b.in.domain_sid			= join->out.domain_sid;	b.in.source_dsa_address		= join->out.samr_binding->host;	b.in.dest_dsa_netbios_name	= netbios_name;	b.in.callbacks.private_data	= s;	b.in.callbacks.check_options	= vampire_check_options;	b.in.callbacks.prepare_db       = vampire_prepare_db;	b.in.callbacks.schema_chunk	= vampire_schema_chunk;	b.in.callbacks.config_chunk	= vampire_store_chunk;	b.in.callbacks.domain_chunk	= vampire_store_chunk;	status = libnet_BecomeDC(ctx, s, &b);	if (!NT_STATUS_IS_OK(status)) {		printf("libnet_BecomeDC() failed - %s\n", nt_errstr(status));		talloc_free(s);		return status;	}	msg = ldb_msg_new(s);	if (!msg) {		printf("ldb_msg_new() failed\n");		talloc_free(s);		return NT_STATUS_NO_MEMORY;	}	msg->dn = ldb_dn_new(msg, s->ldb, "@ROOTDSE");	if (!msg->dn) {		printf("ldb_msg_new(@ROOTDSE) failed\n");		talloc_free(s);		return NT_STATUS_NO_MEMORY;	}	ldb_ret = ldb_msg_add_string(msg, "isSynchronized", "TRUE");	if (ldb_ret != LDB_SUCCESS) {		printf("ldb_msg_add_string(msg, isSynchronized, TRUE) failed: %d\n", ldb_ret);		talloc_free(s);		return NT_STATUS_NO_MEMORY;	}	for (i=0; i < msg->num_elements; i++) {		msg->elements[i].flags = LDB_FLAG_MOD_REPLACE;	}	printf("mark ROOTDSE with isSynchronized=TRUE\n");	ldb_ret = ldb_modify(s->ldb, msg);	if (ldb_ret != LDB_SUCCESS) {		printf("ldb_modify() failed: %d\n", ldb_ret);		talloc_free(s);		return NT_STATUS_INTERNAL_DB_ERROR;	}	set_secrets = talloc_zero(s, struct libnet_set_join_secrets);	if (!set_secrets) {		return NT_STATUS_NO_MEMORY;	}			set_secrets->in.domain_name = join->out.domain_name;	set_secrets->in.realm = join->out.realm;	set_secrets->in.account_name = account_name;	set_secrets->in.netbios_name = netbios_name;	set_secrets->in.join_type = SEC_CHAN_BDC;	set_secrets->in.join_password = join->out.join_password;	set_secrets->in.kvno = join->out.kvno;	set_secrets->in.domain_sid = join->out.domain_sid;		status = libnet_set_join_secrets(ctx, set_secrets, set_secrets);	if (!NT_STATUS_IS_OK(status)) {		r->out.error_string = talloc_steal(mem_ctx, set_secrets->out.error_string);		talloc_free(s);		return status;	}	r->out.domain_name = talloc_steal(r, join->out.domain_name);	r->out.domain_sid = talloc_steal(r, join->out.domain_sid);	talloc_free(s);		return NT_STATUS_OK;}

⌨️ 快捷键说明

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