WERROR reg_delete_path(const struct security_token *token, const char *orig_path) { struct registry_key *hive; char *path, *p; WERROR err; if (!(path = SMB_STRDUP(orig_path))) { return WERR_NOMEM; } p = strchr(path, '\\'); if ((p == NULL) || (p[1] == '\0')) { SAFE_FREE(path); return WERR_INVALID_PARAM; } *p = '\0'; err = reg_openhive(NULL, path, (strchr(p+1, '\\') != NULL) ? KEY_ENUMERATE_SUB_KEYS : KEY_CREATE_SUB_KEY, token, &hive); if (!W_ERROR_IS_OK(err)) { SAFE_FREE(path); return err; } err = reg_deletekey_recursive(hive, p+1); SAFE_FREE(path); TALLOC_FREE(hive); return err; }
static int net_registry_deletekey_internal(struct net_context *c, int argc, const char **argv, bool recursive) { WERROR werr; char *subkeyname; struct registry_key *hivekey = NULL; TALLOC_CTX *ctx = talloc_stackframe(); int ret = -1; if (argc != 1 || c->display_usage) { d_printf("%s\n%s", _("Usage:"), _("net registry deletekey <path>\n")); d_printf("%s\n%s", _("Example:"), _("net registry deletekey " "'HKLM\\Software\\Samba\\smbconf.127.0.0.1'\n")); goto done; } if (strlen(argv[0]) == 0) { d_fprintf(stderr, _("error: zero length key name given\n")); goto done; } werr = open_hive(ctx, argv[0], REG_KEY_WRITE, &hivekey, &subkeyname); if (!W_ERROR_IS_OK(werr)) { d_fprintf(stderr, "open_hive %s: %s\n", _("failed"), win_errstr(werr)); goto done; } if (recursive) { werr = reg_deletekey_recursive(hivekey, subkeyname); } else { werr = reg_deletekey(hivekey, subkeyname); } if (!W_ERROR_IS_OK(werr) && !(c->opt_force && W_ERROR_EQUAL(werr, WERR_BADFILE))) { d_fprintf(stderr, "reg_deletekey %s: %s\n", _("failed"), win_errstr(werr)); goto done; } ret = 0; done: TALLOC_FREE(ctx); return ret; }
static WERROR gp_reg_del_groupmembership(TALLOC_CTX *mem_ctx, struct registry_key *key, const struct security_token *token, uint32_t flags) { const char *path = NULL; path = gp_reg_groupmembership_path(mem_ctx, &token->sids[0], flags); W_ERROR_HAVE_NO_MEMORY(path); return reg_deletekey_recursive(key, path); }
/** * delete a service from configuration */ static sbcErr smbconf_reg_delete_share(struct smbconf_ctx *ctx, const char *servicename) { WERROR werr; sbcErr err = SBC_ERR_OK; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (servicename != NULL) { werr = reg_deletekey_recursive(rpd(ctx)->base_key, servicename); if (!W_ERROR_IS_OK(werr)) { err = SBC_ERR_ACCESS_DENIED; } } else { err = smbconf_reg_delete_values(rpd(ctx)->base_key); } talloc_free(mem_ctx); return err; }
static WERROR scripts_apply(TALLOC_CTX *mem_ctx, const struct security_token *token, struct registry_key *root_key, uint32_t flags, const char *section, const struct GROUP_POLICY_OBJECT *gpo, struct gp_registry_entry *entries, size_t num_entries) { struct gp_registry_context *reg_ctx = NULL; WERROR werr; size_t i; const char *keystr = NULL; int count = 0; if (num_entries == 0) { return WERR_OK; } #if 0 if (flags & GPO_INFO_FLAG_MACHINE) { struct security_token *tmp_token; tmp_token = registry_create_system_token(mem_ctx); W_ERROR_HAVE_NO_MEMORY(tmp_token); werr = gp_init_reg_ctx(mem_ctx, KEY_HKLM, REG_KEY_WRITE, tmp_token, ®_ctx); } else { werr = gp_init_reg_ctx(mem_ctx, KEY_HKCU, REG_KEY_WRITE, token, ®_ctx); } W_ERROR_NOT_OK_RETURN(werr); #endif keystr = talloc_asprintf(mem_ctx, "%s\\%s\\%d", KEY_GP_SCRIPTS, section, count++); W_ERROR_HAVE_NO_MEMORY(keystr); reg_deletekey_recursive(root_key, keystr); werr = gp_store_reg_subkey(mem_ctx, keystr, root_key, &root_key); if (!W_ERROR_IS_OK(werr)) { goto done; } werr = scripts_store_reg_gpovals(mem_ctx, root_key, gpo); if (!W_ERROR_IS_OK(werr)) { goto done; } for (i=0; i<num_entries; i++) { werr = reg_apply_registry_entry(mem_ctx, root_key, reg_ctx, &(entries)[i], token, flags); if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("failed to apply registry: %s\n", win_errstr(werr))); goto done; } } done: gp_free_reg_ctx(reg_ctx); return werr; }