diff options
Diffstat (limited to 'source3/utils/net_rpc_conf.c')
-rw-r--r-- | source3/utils/net_rpc_conf.c | 153 |
1 files changed, 151 insertions, 2 deletions
diff --git a/source3/utils/net_rpc_conf.c b/source3/utils/net_rpc_conf.c index ed7f1b45d7..ddf56772b3 100644 --- a/source3/utils/net_rpc_conf.c +++ b/source3/utils/net_rpc_conf.c @@ -99,6 +99,14 @@ static int rpc_conf_getincludes_usage(struct net_context *c, int argc, return -1; } +static int rpc_conf_delincludes_usage(struct net_context *c, int argc, + const char **argv) +{ + d_printf("%s\nnet rpc conf delincludes <sharename>\n", + _("Usage:")); + return -1; +} + static NTSTATUS rpc_conf_get_share(TALLOC_CTX *mem_ctx, struct dcerpc_binding_handle *b, struct policy_handle *parent_hnd, @@ -1068,6 +1076,147 @@ error: return status; } + +static NTSTATUS rpc_conf_delincludes_internal(struct net_context *c, + const struct dom_sid *domain_sid, + const char *domain_name, + struct cli_state *cli, + struct rpc_pipe_client *pipe_hnd, + TALLOC_CTX *mem_ctx, + int argc, + const char **argv ) +{ + TALLOC_CTX *frame = talloc_stackframe(); + NTSTATUS status = NT_STATUS_OK; + WERROR werr = WERR_OK; + WERROR _werr; + + struct dcerpc_binding_handle *b = pipe_hnd->binding_handle; + + /* key info */ + struct policy_handle hive_hnd, key_hnd, subkey_hnd; + + bool key_exists = false; + uint32_t i, num_subkeys; + const char **subkeys; + struct winreg_String valuename; + struct winreg_String keyname; + + + ZERO_STRUCT(hive_hnd); + ZERO_STRUCT(key_hnd); + ZERO_STRUCT(subkey_hnd); + + ZERO_STRUCT(keyname); + ZERO_STRUCT(valuename); + + keyname.name = argv[0]; + valuename.name = "includes"; + + if (argc != 1 || c->display_usage) { + rpc_conf_delincludes_usage(c, argc, argv); + goto error; + } +/* try REG_KEY_WRITE */ + status = rpc_conf_open_conf(frame, + b, + REG_KEY_READ, + &hive_hnd, + &key_hnd, + &werr); + + if (!(NT_STATUS_IS_OK(status))) { + goto error; + } + + if (!(W_ERROR_IS_OK(werr))) { + goto error; + } + + status = dcerpc_winreg_enum_keys(frame, + b, + &key_hnd, + &num_subkeys, + &subkeys, + &werr); + + if (!(NT_STATUS_IS_OK(status))) { + d_fprintf(stderr, _("Failed to enumerate keys: %s\n"), + nt_errstr(status)); + goto error; + } + + if (!(W_ERROR_IS_OK(werr))) { + d_fprintf(stderr, _("Failed to enumerate keys: %s\n"), + win_errstr(werr)); + goto error; + } + + for (i = 0; i < num_subkeys; i++) { + if (strcmp(subkeys[i], argv[0]) == 0) { + key_exists = true; + } + } + + if (!key_exists) { + d_fprintf(stderr, _("ERROR: Share '%s' does not exist\n"), + argv[0]); + werr = WERR_BADFILE; + goto error; + } + + status = dcerpc_winreg_OpenKey(b, frame, &key_hnd, keyname, 0, + REG_KEY_WRITE, &subkey_hnd, &werr); + + if (!(NT_STATUS_IS_OK(status))) { + d_fprintf(stderr, _("Failed to open key '%s': %s\n"), + keyname.name, nt_errstr(status)); + goto error; + } + + if (!(W_ERROR_IS_OK(werr))) { + d_fprintf(stderr, _("Failed to open key '%s': %s\n"), + keyname.name, win_errstr(werr)); + goto error; + } + + status = dcerpc_winreg_DeleteValue(b, + frame, + &subkey_hnd, + valuename, + &werr); + + if (!(NT_STATUS_IS_OK(status))) { + d_fprintf(stderr, _("Failed to delete value %s\n"), + nt_errstr(status)); + goto error; + } + + if (!(W_ERROR_IS_OK(werr))) { + if (W_ERROR_EQUAL(werr, WERR_BADFILE)){ + werr = WERR_OK; + goto error; + } + + d_fprintf(stderr, _("Failed to delete value %s\n"), + win_errstr(werr)); + goto error; + } +error: + + if (!(W_ERROR_IS_OK(werr))) { + status = werror_to_ntstatus(werr); + } + + dcerpc_winreg_CloseKey(b, frame, &hive_hnd, &_werr); + dcerpc_winreg_CloseKey(b, frame, &key_hnd, &_werr); + dcerpc_winreg_CloseKey(b, frame, &subkey_hnd, &_werr); + + TALLOC_FREE(frame); + return status; + +} + static int rpc_conf_drop(struct net_context *c, int argc, const char **argv) { @@ -1121,8 +1270,8 @@ static int rpc_conf_getincludes(struct net_context *c, int argc, static int rpc_conf_delincludes(struct net_context *c, int argc, const char **argv) { - d_printf("Function not yet implemented\n"); - return 0; + return run_rpc_command(c, NULL, &ndr_table_winreg.syntax_id, 0, + rpc_conf_delincludes_internal, argc, argv ); } /* function calls */ int net_rpc_conf(struct net_context *c, int argc, |