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; }
/** * 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); }