libnet_become_dc.c

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

C
2,239
字号
			 "(objectClass=*)", attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->domain.behavior_version = ldb_msg_find_attr_as_uint(r->msgs[0], "msDs-Behavior-Version", 0);	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_schema_object_version(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	static const char *attrs[] = {		"objectVersion",		NULL	};	basedn = ldb_dn_new(s, s->ldap1.ldb, s->forest.schema_dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->forest.schema_object_version = ldb_msg_find_attr_as_uint(r->msgs[0], "objectVersion", 0);	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_w2k3_update_revision(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	static const char *attrs[] = {		"revision",		NULL	};	basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "CN=Windows2003Update,CN=DomainUpdates,CN=System,%s",				s->domain.dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", attrs, &r);	talloc_free(basedn);	if (ret == LDB_ERR_NO_SUCH_OBJECT) {		/* w2k doesn't have this object */		s->domain.w2k3_update_revision = 0;		return NT_STATUS_OK;	} else if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->domain.w2k3_update_revision = ldb_msg_find_attr_as_uint(r->msgs[0], "revision", 0);	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_infrastructure_fsmo(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	struct ldb_dn *ntds_dn;	struct ldb_dn *server_dn;	static const char *_1_1_attrs[] = {		"1.1",		NULL	};	static const char *fsmo_attrs[] = {		"fSMORoleOwner",		NULL	};	static const char *dns_attrs[] = {		"dnsHostName",		NULL	};	static const char *guid_attrs[] = {		"objectGUID",		NULL	};	basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "<WKGUID=2fbac1870ade11d297c400c04fd8d5cd,%s>",				s->domain.dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", _1_1_attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	basedn = talloc_steal(s, r->msgs[0]->dn);	talloc_free(r);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", fsmo_attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->infrastructure_fsmo.ntds_dn_str	= samdb_result_string(r->msgs[0], "fSMORoleOwner", NULL);	if (!s->infrastructure_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->infrastructure_fsmo.ntds_dn_str);	talloc_free(r);	ntds_dn = ldb_dn_new(s, s->ldap1.ldb, s->infrastructure_fsmo.ntds_dn_str);	NT_STATUS_HAVE_NO_MEMORY(ntds_dn);	server_dn = ldb_dn_get_parent(s, ntds_dn);	NT_STATUS_HAVE_NO_MEMORY(server_dn);	s->infrastructure_fsmo.server_dn_str = ldb_dn_alloc_linearized(s, server_dn);	NT_STATUS_HAVE_NO_MEMORY(s->infrastructure_fsmo.server_dn_str);	ret = ldb_search(s->ldap1.ldb, server_dn, LDB_SCOPE_BASE,			 "(objectClass=*)", dns_attrs, &r);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->infrastructure_fsmo.dns_name	= samdb_result_string(r->msgs[0], "dnsHostName", NULL);	if (!s->infrastructure_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->infrastructure_fsmo.dns_name);	talloc_free(r);	ret = ldb_search(s->ldap1.ldb, ntds_dn, LDB_SCOPE_BASE,			 "(objectClass=*)", guid_attrs, &r);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->infrastructure_fsmo.ntds_guid = samdb_result_guid(r->msgs[0], "objectGUID");	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_rid_manager_fsmo(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	const char *reference_dn_str;	struct ldb_dn *ntds_dn;	struct ldb_dn *server_dn;	static const char *rid_attrs[] = {		"rIDManagerReference",		NULL	};	static const char *fsmo_attrs[] = {		"fSMORoleOwner",		NULL	};	static const char *dns_attrs[] = {		"dnsHostName",		NULL	};	static const char *guid_attrs[] = {		"objectGUID",		NULL	};	basedn = ldb_dn_new(s, s->ldap1.ldb, s->domain.dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", rid_attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	reference_dn_str	= samdb_result_string(r->msgs[0], "rIDManagerReference", NULL);	if (!reference_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;	basedn = ldb_dn_new(s, s->ldap1.ldb, reference_dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	talloc_free(r);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE,			 "(objectClass=*)", fsmo_attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->rid_manager_fsmo.ntds_dn_str	= samdb_result_string(r->msgs[0], "fSMORoleOwner", NULL);	if (!s->rid_manager_fsmo.ntds_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->rid_manager_fsmo.ntds_dn_str);	talloc_free(r);	ntds_dn = ldb_dn_new(s, s->ldap1.ldb, s->rid_manager_fsmo.ntds_dn_str);	NT_STATUS_HAVE_NO_MEMORY(ntds_dn);	server_dn = ldb_dn_get_parent(s, ntds_dn);	NT_STATUS_HAVE_NO_MEMORY(server_dn);	s->rid_manager_fsmo.server_dn_str = ldb_dn_alloc_linearized(s, server_dn);	NT_STATUS_HAVE_NO_MEMORY(s->rid_manager_fsmo.server_dn_str);	ret = ldb_search(s->ldap1.ldb, server_dn, LDB_SCOPE_BASE,			 "(objectClass=*)", dns_attrs, &r);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->rid_manager_fsmo.dns_name	= samdb_result_string(r->msgs[0], "dnsHostName", NULL);	if (!s->rid_manager_fsmo.dns_name) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->rid_manager_fsmo.dns_name);	talloc_free(r);	ret = ldb_search(s->ldap1.ldb, ntds_dn, LDB_SCOPE_BASE,			 "(objectClass=*)", guid_attrs, &r);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->rid_manager_fsmo.ntds_guid = samdb_result_guid(r->msgs[0], "objectGUID");	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_site_object(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "CN=%s,CN=Sites,%s",				s->dest_dsa.site_name,				s->forest.config_dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE, 			 "(objectClass=*)", NULL, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->dest_dsa.site_guid = samdb_result_guid(r->msgs[0], "objectGUID");	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_check_options(struct libnet_BecomeDC_state *s){	if (!s->callbacks.check_options) return NT_STATUS_OK;	s->_co.domain		= &s->domain;	s->_co.forest		= &s->forest;	s->_co.source_dsa	= &s->source_dsa;	return s->callbacks.check_options(s->callbacks.private_data, &s->_co);}static NTSTATUS becomeDC_ldap1_computer_object(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	char *filter;	static const char *attrs[] = {		"distinguishedName",		"userAccountControl",		NULL	};	basedn = ldb_dn_new(s, s->ldap1.ldb, s->domain.dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	filter = talloc_asprintf(basedn, "(&(|(objectClass=user)(objectClass=computer))(sAMAccountName=%s$))",				 s->dest_dsa.netbios_name);	NT_STATUS_HAVE_NO_MEMORY(filter);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_SUBTREE, 			 filter, attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	s->dest_dsa.computer_dn_str	= samdb_result_string(r->msgs[0], "distinguishedName", NULL);	if (!s->dest_dsa.computer_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->dest_dsa.computer_dn_str);	s->dest_dsa.user_account_control = samdb_result_uint(r->msgs[0], "userAccountControl", 0);	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_server_object_1(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	const char *server_reference_dn_str;	struct ldb_dn *server_reference_dn;	struct ldb_dn *computer_dn;	basedn = ldb_dn_new_fmt(s, s->ldap1.ldb, "CN=%s,CN=Servers,CN=%s,CN=Sites,%s",				s->dest_dsa.netbios_name,				s->dest_dsa.site_name,				s->forest.config_dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE, 			 "(objectClass=*)", NULL, &r);	talloc_free(basedn);	if (ret == LDB_ERR_NO_SUCH_OBJECT) {		/* if the object doesn't exist, we'll create it later */		return NT_STATUS_OK;	} else if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	server_reference_dn_str = samdb_result_string(r->msgs[0], "serverReference", NULL);	if (server_reference_dn_str) {		server_reference_dn	= ldb_dn_new(r, s->ldap1.ldb, server_reference_dn_str);		NT_STATUS_HAVE_NO_MEMORY(server_reference_dn);		computer_dn		= ldb_dn_new(r, s->ldap1.ldb, s->dest_dsa.computer_dn_str);		NT_STATUS_HAVE_NO_MEMORY(computer_dn);		/*		 * if the server object belongs to another DC in another domain in the forest,		 * we should not touch this object!		 */		if (ldb_dn_compare(computer_dn, server_reference_dn) != 0) {			talloc_free(r);			return NT_STATUS_OBJECT_NAME_COLLISION;		}	}	/* if the server object is already for the dest_dsa, then we don't need to create it */	s->dest_dsa.server_dn_str	= samdb_result_string(r->msgs[0], "distinguishedName", NULL);	if (!s->dest_dsa.server_dn_str) return NT_STATUS_INVALID_NETWORK_RESPONSE;	talloc_steal(s, s->dest_dsa.server_dn_str);	talloc_free(r);	return NT_STATUS_OK;}static NTSTATUS becomeDC_ldap1_server_object_2(struct libnet_BecomeDC_state *s){	int ret;	struct ldb_result *r;	struct ldb_dn *basedn;	const char *server_reference_bl_dn_str;	static const char *attrs[] = {		"serverReferenceBL",		NULL	};	/* if the server_dn_str has a valid value, we skip this lookup */	if (s->dest_dsa.server_dn_str) return NT_STATUS_OK;	basedn = ldb_dn_new(s, s->ldap1.ldb, s->dest_dsa.computer_dn_str);	NT_STATUS_HAVE_NO_MEMORY(basedn);	ret = ldb_search(s->ldap1.ldb, basedn, LDB_SCOPE_BASE, 			 "(objectClass=*)", attrs, &r);	talloc_free(basedn);	if (ret != LDB_SUCCESS) {		return NT_STATUS_LDAP(ret);	} else if (r->count != 1) {		talloc_free(r);		return NT_STATUS_INVALID_NETWORK_RESPONSE;	}	server_reference_bl_dn_str = samdb_result_string(r->msgs[0], "serverReferenceBL", NULL);	if (!server_reference_bl_dn_str) {		/* if no back link is present, we're done for this function */		talloc_free(r);		return NT_STATUS_OK;	}	/* if the server object is already for the dest_dsa, then we don't need to create it */	s->dest_dsa.server_dn_str	= samdb_result_string(r->msgs[0], "serverReferenceBL", NULL);	if (s->dest_dsa.server_dn_str) {		/* if a back link is present, we know that the server object is present */		talloc_steal(s, s->dest_dsa.server_dn_str);

⌨️ 快捷键说明

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