Esempio n. 1
0
static WERROR cmd_info(struct regshell_context *ctx, int argc, char **argv)
{
	struct security_descriptor *sec_desc = NULL;
	time_t last_mod;
	WERROR error;
	const char *classname = NULL;
	NTTIME last_change;
	uint32_t max_subkeynamelen;
	uint32_t max_valnamelen;
	uint32_t max_valbufsize;
	uint32_t num_subkeys;
	uint32_t num_values;

	error = reg_key_get_info(ctx, ctx->current, &classname, &num_subkeys, &num_values,
				 &last_change, &max_subkeynamelen, &max_valnamelen, &max_valbufsize);
	if (!W_ERROR_IS_OK(error)) {
		printf("Error getting key info: %s\n", win_errstr(error));
		return error;
	}


	printf("Name: %s\n", strchr(ctx->path, '\\')?strrchr(ctx->path, '\\')+1:
		   ctx->path);
	printf("Full path: %s\n", ctx->path);
	if (classname != NULL)
		printf("Key Class: %s\n", classname);
	last_mod = nt_time_to_unix(last_change);
	printf("Time Last Modified: %s", ctime(&last_mod));
	printf("Number of subkeys: %d\n", num_subkeys);
	printf("Number of values: %d\n", num_values);

	if (max_valnamelen > 0)
		printf("Maximum value name length: %d\n", max_valnamelen);

	if (max_valbufsize > 0)
		printf("Maximum value data length: %d\n", max_valbufsize);

	if (max_subkeynamelen > 0)
		printf("Maximum sub key name length: %d\n", max_subkeynamelen);

	error = reg_get_sec_desc(ctx, ctx->current, &sec_desc);
	if (!W_ERROR_IS_OK(error)) {
		printf("Error getting security descriptor: %s\n", win_errstr(error));
		return WERR_OK;
	}
	ndr_print_debug((ndr_print_fn_t)ndr_print_security_descriptor,
			"Security", sec_desc);
	talloc_free(sec_desc);

	return WERR_OK;
}
Esempio n. 2
0
/**
 * Print a registry key recursively
 *
 * @param level Level at which to print
 * @param p Key to print
 * @param fullpath Whether the full pat hshould be printed or just the last bit
 * @param novals Whether values should not be printed
 */
static void print_tree(unsigned int level, struct registry_key *p,
		       const char *name,
		       bool fullpath, bool novals)
{
	struct registry_key *subkey;
	const char *valuename, *keyname;
	uint32_t valuetype;
	DATA_BLOB valuedata;
	struct security_descriptor *sec_desc;
	WERROR error;
	unsigned int i;
	TALLOC_CTX *mem_ctx;

	for(i = 0; i < level; i++) putchar(' '); puts(name);

	mem_ctx = talloc_init("print_tree");
	for (i = 0; W_ERROR_IS_OK(error = reg_key_get_subkey_by_index(mem_ctx,
								      p,
								      i,
								      &keyname,
								      NULL,
								      NULL)); i++) {

	        SMB_ASSERT(strlen(keyname) > 0);
		if (!W_ERROR_IS_OK(reg_open_key(mem_ctx, p, keyname, &subkey)))
		        continue;

		print_tree(level+1, subkey, (fullpath && strlen(name))?
                                               talloc_asprintf(mem_ctx, "%s\\%s",
                                                               name, keyname):
                                               keyname, fullpath, novals);
		talloc_free(subkey);
	}
	talloc_free(mem_ctx);

	if(!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) {
		DEBUG(0, ("Error occurred while fetching subkeys for '%s': %s\n",
				  name, win_errstr(error)));
	}

	if (!novals) {
		mem_ctx = talloc_init("print_tree");
		for(i = 0; W_ERROR_IS_OK(error = reg_key_get_value_by_index(
			mem_ctx, p, i, &valuename, &valuetype, &valuedata));
			i++) {
			unsigned int j;
			for(j = 0; j < level+1; j++) putchar(' ');
			printf("%s\n",  reg_val_description(mem_ctx,
				valuename, valuetype, valuedata));
		}
		talloc_free(mem_ctx);

		if(!W_ERROR_EQUAL(error, WERR_NO_MORE_ITEMS)) {
			DEBUG(0, ("Error occurred while fetching values for '%s': %s\n",
				name, win_errstr(error)));
		}
	}

	mem_ctx = talloc_init("sec_desc");
	if (!W_ERROR_IS_OK(reg_get_sec_desc(mem_ctx, p, &sec_desc))) {
		DEBUG(0, ("Error getting security descriptor\n"));
	}
	talloc_free(mem_ctx);
}