⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 4 页
字号:
}/*  work out the domain sid for the current open ldb*/const struct dom_sid *samdb_domain_sid(struct ldb_context *ldb){	TALLOC_CTX *tmp_ctx;	const struct dom_sid *domain_sid;	const char *attrs[] = {		"objectSid",		NULL	};	struct ldb_result *res;	int ret;	/* see if we have a cached copy */	domain_sid = (struct dom_sid *)ldb_get_opaque(ldb, "cache.domain_sid");	if (domain_sid) {		return domain_sid;	}	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	ret = ldb_search_exp_fmt(ldb, tmp_ctx, &res, ldb_get_default_basedn(ldb), LDB_SCOPE_BASE, attrs, "objectSid=*");	if (ret != LDB_SUCCESS) {		goto failed;	}		if (res->count != 1) {		goto failed;	}	domain_sid = samdb_result_dom_sid(tmp_ctx, res->msgs[0], "objectSid");	if (domain_sid == NULL) {		goto failed;	}	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.domain_sid", domain_sid) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, domain_sid);	talloc_free(tmp_ctx);	return domain_sid;failed:	DEBUG(1,("Failed to find domain_sid for open ldb\n"));	talloc_free(tmp_ctx);	return NULL;}bool samdb_set_domain_sid(struct ldb_context *ldb, const struct dom_sid *dom_sid_in){	TALLOC_CTX *tmp_ctx;	struct dom_sid *dom_sid_new;	struct dom_sid *dom_sid_old;	/* see if we have a cached copy */	dom_sid_old = talloc_get_type(ldb_get_opaque(ldb, 						     "cache.domain_sid"), struct dom_sid);	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	dom_sid_new = dom_sid_dup(tmp_ctx, dom_sid_in);	if (!dom_sid_new) {		goto failed;	}	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.domain_sid", dom_sid_new) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, dom_sid_new);	talloc_free(tmp_ctx);	talloc_free(dom_sid_old);	return true;failed:	DEBUG(1,("Failed to set our own cached domain SID in the ldb!\n"));	talloc_free(tmp_ctx);	return false;}/* Obtain the short name of the flexible single master operator * (FSMO), such as the PDC Emulator */const char *samdb_result_fsmo_name(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, const struct ldb_message *msg, 			     const char *attr){	/* Format is cn=NTDS Settings,cn=<NETBIOS name of FSMO>,.... */	struct ldb_dn *fsmo_dn = ldb_msg_find_attr_as_dn(ldb, mem_ctx, msg, attr);	const struct ldb_val *val = ldb_dn_get_component_val(fsmo_dn, 1);	const char *name = ldb_dn_get_component_name(fsmo_dn, 1);	if (!name || (ldb_attr_cmp(name, "cn") != 0)) {		/* Ensure this matches the format.  This gives us a		 * bit more confidence that a 'cn' value will be a		 * ascii string */		return NULL;	}	if (val) {		return (char *)val->data;	}	return NULL;}/*  work out the ntds settings dn for the current open ldb*/struct ldb_dn *samdb_ntds_settings_dn(struct ldb_context *ldb){	TALLOC_CTX *tmp_ctx;	const char *root_attrs[] = { "dsServiceName", NULL };	int ret;	struct ldb_result *root_res;	struct ldb_dn *settings_dn;		/* see if we have a cached copy */	settings_dn = (struct ldb_dn *)ldb_get_opaque(ldb, "cache.settings_dn");	if (settings_dn) {		return settings_dn;	}	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}		ret = ldb_search(ldb, ldb_dn_new(tmp_ctx, ldb, ""), LDB_SCOPE_BASE, NULL, root_attrs, &root_res);	if (ret) {		DEBUG(1,("Searching for dsServiceName in rootDSE failed: %s\n", 			 ldb_errstring(ldb)));		goto failed;	}	talloc_steal(tmp_ctx, root_res);	if (root_res->count != 1) {		goto failed;	}	settings_dn = ldb_msg_find_attr_as_dn(ldb, tmp_ctx, root_res->msgs[0], "dsServiceName");	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.settings_dn", settings_dn) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, settings_dn);	talloc_free(tmp_ctx);	return settings_dn;failed:	DEBUG(1,("Failed to find our own NTDS Settings DN in the ldb!\n"));	talloc_free(tmp_ctx);	return NULL;}/*  work out the ntds settings invocationId for the current open ldb*/const struct GUID *samdb_ntds_invocation_id(struct ldb_context *ldb){	TALLOC_CTX *tmp_ctx;	const char *attrs[] = { "invocationId", NULL };	int ret;	struct ldb_result *res;	struct GUID *invocation_id;		/* see if we have a cached copy */	invocation_id = (struct GUID *)ldb_get_opaque(ldb, "cache.invocation_id");	if (invocation_id) {		return invocation_id;	}	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	ret = ldb_search(ldb, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, NULL, attrs, &res);	if (ret) {		goto failed;	}	talloc_steal(tmp_ctx, res);	if (res->count != 1) {		goto failed;	}	invocation_id = talloc(tmp_ctx, struct GUID);	if (!invocation_id) {		goto failed;	}	*invocation_id = samdb_result_guid(res->msgs[0], "invocationId");	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.invocation_id", invocation_id) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, invocation_id);	talloc_free(tmp_ctx);	return invocation_id;failed:	DEBUG(1,("Failed to find our own NTDS Settings invocationId in the ldb!\n"));	talloc_free(tmp_ctx);	return NULL;}bool samdb_set_ntds_invocation_id(struct ldb_context *ldb, const struct GUID *invocation_id_in){	TALLOC_CTX *tmp_ctx;	struct GUID *invocation_id_new;	struct GUID *invocation_id_old;	/* see if we have a cached copy */	invocation_id_old = (struct GUID *)ldb_get_opaque(ldb, 							 "cache.invocation_id");	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	invocation_id_new = talloc(tmp_ctx, struct GUID);	if (!invocation_id_new) {		goto failed;	}	*invocation_id_new = *invocation_id_in;	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.invocation_id", invocation_id_new) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, invocation_id_new);	talloc_free(tmp_ctx);	talloc_free(invocation_id_old);	return true;failed:	DEBUG(1,("Failed to set our own cached invocationId in the ldb!\n"));	talloc_free(tmp_ctx);	return false;}/*  work out the ntds settings objectGUID for the current open ldb*/const struct GUID *samdb_ntds_objectGUID(struct ldb_context *ldb){	TALLOC_CTX *tmp_ctx;	const char *attrs[] = { "objectGUID", NULL };	int ret;	struct ldb_result *res;	struct GUID *ntds_guid;		/* see if we have a cached copy */	ntds_guid = (struct GUID *)ldb_get_opaque(ldb, "cache.ntds_guid");	if (ntds_guid) {		return ntds_guid;	}	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	ret = ldb_search(ldb, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, NULL, attrs, &res);	if (ret) {		goto failed;	}	talloc_steal(tmp_ctx, res);	if (res->count != 1) {		goto failed;	}	ntds_guid = talloc(tmp_ctx, struct GUID);	if (!ntds_guid) {		goto failed;	}	*ntds_guid = samdb_result_guid(res->msgs[0], "objectGUID");	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.ntds_guid", ntds_guid) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, ntds_guid);	talloc_free(tmp_ctx);	return ntds_guid;failed:	DEBUG(1,("Failed to find our own NTDS Settings objectGUID in the ldb!\n"));	talloc_free(tmp_ctx);	return NULL;}bool samdb_set_ntds_objectGUID(struct ldb_context *ldb, const struct GUID *ntds_guid_in){	TALLOC_CTX *tmp_ctx;	struct GUID *ntds_guid_new;	struct GUID *ntds_guid_old;		/* see if we have a cached copy */	ntds_guid_old = (struct GUID *)ldb_get_opaque(ldb, "cache.ntds_guid");	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		goto failed;	}	ntds_guid_new = talloc(tmp_ctx, struct GUID);	if (!ntds_guid_new) {		goto failed;	}	*ntds_guid_new = *ntds_guid_in;	/* cache the domain_sid in the ldb */	if (ldb_set_opaque(ldb, "cache.ntds_guid", ntds_guid_new) != LDB_SUCCESS) {		goto failed;	}	talloc_steal(ldb, ntds_guid_new);	talloc_free(tmp_ctx);	talloc_free(ntds_guid_old);	return true;failed:	DEBUG(1,("Failed to set our own cached invocationId in the ldb!\n"));	talloc_free(tmp_ctx);	return false;}/*  work out the server dn for the current open ldb*/struct ldb_dn *samdb_server_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx){	return ldb_dn_get_parent(mem_ctx, samdb_ntds_settings_dn(ldb));}/*  work out the server dn for the current open ldb*/struct ldb_dn *samdb_server_site_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx){	struct ldb_dn *server_dn;	struct ldb_dn *server_site_dn;	server_dn = samdb_server_dn(ldb, mem_ctx);	if (!server_dn) return NULL;	server_site_dn = ldb_dn_get_parent(mem_ctx, server_dn);	talloc_free(server_dn);	return server_site_dn;}/*  work out if we are the PDC for the domain of the current open ldb*/bool samdb_is_pdc(struct ldb_context *ldb){	const char *dom_attrs[] = { "fSMORoleOwner", NULL };	int ret;	struct ldb_result *dom_res;	TALLOC_CTX *tmp_ctx;	bool is_pdc;	struct ldb_dn *pdc;	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		DEBUG(1, ("talloc_new failed in samdb_is_pdc"));		return false;	}	ret = ldb_search(ldb, ldb_get_default_basedn(ldb), LDB_SCOPE_BASE, NULL, dom_attrs, &dom_res);	if (ret) {		DEBUG(1,("Searching for fSMORoleOwner in %s failed: %s\n", 			 ldb_dn_get_linearized(ldb_get_default_basedn(ldb)), 			 ldb_errstring(ldb)));		goto failed;	}	talloc_steal(tmp_ctx, dom_res);	if (dom_res->count != 1) {		goto failed;	}	pdc = ldb_msg_find_attr_as_dn(ldb, tmp_ctx, dom_res->msgs[0], "fSMORoleOwner");	if (ldb_dn_compare(samdb_ntds_settings_dn(ldb), pdc) == 0) {		is_pdc = true;	} else {		is_pdc = false;	}	talloc_free(tmp_ctx);	return is_pdc;failed:	DEBUG(1,("Failed to find if we are the PDC for this ldb\n"));	talloc_free(tmp_ctx);	return false;}/*  work out if we are a Global Catalog server for the domain of the current open ldb*/bool samdb_is_gc(struct ldb_context *ldb){	const char *attrs[] = { "options", NULL };	int ret, options;	struct ldb_result *res;	TALLOC_CTX *tmp_ctx;	tmp_ctx = talloc_new(ldb);	if (tmp_ctx == NULL) {		DEBUG(1, ("talloc_new failed in samdb_is_pdc"));		return false;	}	/* Query cn=ntds settings,.... */	ret = ldb_search(ldb, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, NULL, attrs, &res);	if (ret) {		return false;	}	if (res->count != 1) {		talloc_free(res);		return false;	}	options = ldb_msg_find_attr_as_int(res->msgs[0], "options", 0);	talloc_free(res);	talloc_free(tmp_ctx);	/* if options attribute has the 0x00000001 flag set, then enable the global catlog */	if (options & 0x000000001) {		return true;	}	return false;}/* Find a domain object in the parents of a particular DN.  */int samdb_search_for_parent_domain(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, struct ldb_dn *dn,				   struct ldb_dn **parent_dn, const char **errstring){	TALLOC_CTX *local_ctx;	struct ldb_dn *sdn = dn;	struct ldb_result *res = NULL;	int ret = 0;	const char *attrs[] = { NULL };	local_ctx = talloc_new(mem_ctx);	if (local_ctx == NULL) return LDB_ERR_OPERATIONS_ERROR;		while ((sdn = ldb_dn_get_parent(local_ctx, sdn))) {		ret = ldb_search(ldb, sdn, LDB_SCOPE_BASE, 				 "(|(|(objectClass=domain)(objectClass=builtinDomain))(objectClass=samba4LocalDomain))", attrs, &res);		if (ret == LDB_SUCCESS) {			talloc_steal(local_ctx, res);			if (res->count == 1) {				break;			}		} else {			break;		}	}	if (ret != LDB_SUCCESS) {		*errstring = talloc_asprintf(mem_ctx, "Error searching for parent domain of %s, failed searching for %s: %s",					     ldb_dn_get_linearized(dn),					     ldb_dn_get_linearized(sdn),					     ldb_errstring(ldb));		talloc_free(local_ctx);

⌨️ 快捷键说明

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