mirror of
https://github.com/samba-team/samba.git
synced 2025-02-04 17:47:26 +03:00
bug-fixing registry commands and the rpcclient "rpcclient" command.
the rpcclient "rpcclient" command allows user options to be reset (e.g the username / password) _without_ terminating rpcclient. try this: rpcclient -S srv1 -U% -l log srv1$ rpcclient -S srv2 srv2$ :-) (This used to be commit c049865782d87ca09744ecdefb387b7852ec2ae7)
This commit is contained in:
parent
9b68305475
commit
4c92992b4e
@ -3571,6 +3571,7 @@ void cmd_sam_sync(struct client_info *info, int argc, char *argv[]);
|
||||
|
||||
/*The following definitions come from rpcclient/cmd_reg.c */
|
||||
|
||||
void split_server_keyname(char *srv_name, char *key, const char* arg);
|
||||
BOOL msrpc_reg_enum_key(const char* srv_name, const char* full_keyname,
|
||||
REG_FN(reg_fn),
|
||||
REG_KEY_FN(reg_key_fn),
|
||||
|
@ -37,15 +37,16 @@ extern FILE* out_hnd;
|
||||
* keys. of the form:
|
||||
* ----
|
||||
*
|
||||
* [HKLM]|[HKU]\[parent_keyname_components]\[subkey]|[value]
|
||||
* [HKLM]|[HKU]|[HKCR]\[parent_keyname]\[subkey]|[value]
|
||||
*
|
||||
* reg_getsubkey() splits this down into:
|
||||
* [HKLM]|[HKU]\[parent_keyname_components] and [subkey]|[value]
|
||||
* [HKLM]|[HKU]|[HKCR]\[parent_keyname_components] and [subkey]|[value]
|
||||
*
|
||||
* reg_connect() splits the left side down further into:
|
||||
* [HKLM]|[HKU] and [parent_keyname_components].
|
||||
* [HKLM]|[HKU]|[HKCR] and [parent_keyname_components].
|
||||
*
|
||||
* HKLM is short for HKEY_LOCAL_MACHINE
|
||||
* HKCR is short for HKEY_CLASSES_ROOT
|
||||
* HKU is short for HKEY_USERS
|
||||
*
|
||||
* oh, and HKEY stands for "Hive Key".
|
||||
@ -94,6 +95,25 @@ static void reg_display_key(int val, const char *full_keyname, int num)
|
||||
}
|
||||
}
|
||||
|
||||
void split_server_keyname(char *srv_name, char *key, const char* arg)
|
||||
{
|
||||
pstrcpy(key, arg);
|
||||
|
||||
if (strnequal("\\\\", key, 2))
|
||||
{
|
||||
char *p = strchr(&key[2], '\\');
|
||||
if (p == NULL)
|
||||
{
|
||||
key[0] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
*p = 0;
|
||||
|
||||
fstrcpy(srv_name, key);
|
||||
pstrcpy(key, &arg[strlen(srv_name)+1]);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
nt registry enum
|
||||
@ -150,8 +170,7 @@ BOOL msrpc_reg_enum_key(const char* srv_name, const char* full_keyname,
|
||||
memcpy(&key_pol, &pol_con, sizeof(key_pol));
|
||||
}
|
||||
|
||||
res1 = res1 ? reg_query_key(
|
||||
&key_pol,
|
||||
res1 = res1 ? reg_query_key(&key_pol,
|
||||
key_class, &max_class_len,
|
||||
&num_subkeys, &max_subkeylen, &max_subkeysize,
|
||||
&num_values, &max_valnamelen, &max_valbufsize,
|
||||
@ -278,7 +297,7 @@ nt registry enum
|
||||
****************************************************************************/
|
||||
void cmd_reg_enum(struct client_info *info, int argc, char *argv[])
|
||||
{
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
|
||||
fstring srv_name;
|
||||
|
||||
@ -292,7 +311,7 @@ void cmd_reg_enum(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
(void)(msrpc_reg_enum_key(srv_name, full_keyname,
|
||||
reg_display_key,
|
||||
@ -310,7 +329,7 @@ void cmd_reg_query_info(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND key_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring key_name;
|
||||
fstring keyname;
|
||||
fstring val_name;
|
||||
@ -334,7 +353,7 @@ void cmd_reg_query_info(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
reg_get_subkey(full_keyname, keyname, val_name);
|
||||
|
||||
@ -395,7 +414,7 @@ void cmd_reg_query_key(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND key_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring key_name;
|
||||
|
||||
/*
|
||||
@ -425,7 +444,7 @@ void cmd_reg_query_key(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
/* open registry receive a policy handle */
|
||||
res = res ? reg_connect(srv_name, full_keyname, key_name,
|
||||
@ -442,8 +461,7 @@ void cmd_reg_query_key(struct client_info *info, int argc, char *argv[])
|
||||
memcpy(&key_pol, &pol_con, sizeof(key_pol));
|
||||
}
|
||||
|
||||
res1 = res1 ? reg_query_key(
|
||||
&key_pol,
|
||||
res1 = res1 ? reg_query_key(&key_pol,
|
||||
key_class, &key_class_len,
|
||||
&num_subkeys, &max_subkeylen, &max_subkeysize,
|
||||
&num_values, &max_valnamelen, &max_valbufsize,
|
||||
@ -451,8 +469,7 @@ void cmd_reg_query_key(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
if (res1 && key_class_len != 0)
|
||||
{
|
||||
res1 = res1 ? reg_query_key(
|
||||
&key_pol,
|
||||
res1 = res1 ? reg_query_key(&key_pol,
|
||||
key_class, &key_class_len,
|
||||
&num_subkeys, &max_subkeylen, &max_subkeysize,
|
||||
&num_values, &max_valnamelen, &max_valbufsize,
|
||||
@ -497,7 +514,7 @@ void cmd_reg_create_val(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND parent_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring keyname;
|
||||
fstring parent_name;
|
||||
fstring val_name;
|
||||
@ -525,13 +542,13 @@ void cmd_reg_create_val(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
full_keyname = argv[0];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
reg_get_subkey(full_keyname, keyname, val_name);
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
if (keyname[0] == 0 || val_name[0] == 0)
|
||||
{
|
||||
report(out_hnd, "invalid key name\n");
|
||||
@ -637,7 +654,7 @@ void cmd_reg_delete_val(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND parent_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring keyname;
|
||||
fstring parent_name;
|
||||
fstring val_name;
|
||||
@ -654,7 +671,7 @@ void cmd_reg_delete_val(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
reg_get_subkey(full_keyname, keyname, val_name);
|
||||
|
||||
@ -713,7 +730,7 @@ void cmd_reg_delete_key(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND parent_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring parent_name;
|
||||
fstring key_name;
|
||||
fstring subkey_name;
|
||||
@ -730,7 +747,7 @@ void cmd_reg_delete_key(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
reg_get_subkey(full_keyname, parent_name, subkey_name);
|
||||
|
||||
@ -793,7 +810,7 @@ void cmd_reg_create_key(struct client_info *info, int argc, char *argv[])
|
||||
POLICY_HND parent_pol;
|
||||
POLICY_HND key_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring parent_key;
|
||||
fstring parent_name;
|
||||
fstring key_name;
|
||||
@ -812,7 +829,7 @@ void cmd_reg_create_key(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
reg_get_subkey(full_keyname, parent_key, key_name);
|
||||
|
||||
@ -890,7 +907,7 @@ void cmd_reg_test_key_sec(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND key_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring key_name;
|
||||
|
||||
/*
|
||||
@ -913,7 +930,7 @@ void cmd_reg_test_key_sec(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
/* open registry receive a policy handle */
|
||||
res = res ? reg_connect(srv_name, full_keyname, key_name,
|
||||
@ -994,7 +1011,7 @@ void cmd_reg_get_key_sec(struct client_info *info, int argc, char *argv[])
|
||||
|
||||
POLICY_HND key_pol;
|
||||
POLICY_HND pol_con;
|
||||
char *full_keyname;
|
||||
pstring full_keyname;
|
||||
fstring key_name;
|
||||
|
||||
/*
|
||||
@ -1017,7 +1034,7 @@ void cmd_reg_get_key_sec(struct client_info *info, int argc, char *argv[])
|
||||
return;
|
||||
}
|
||||
|
||||
full_keyname = argv[1];
|
||||
split_server_keyname(srv_name, full_keyname, argv[1]);
|
||||
|
||||
/* open registry receive a policy handle */
|
||||
res = res ? reg_connect(srv_name, full_keyname, key_name,
|
||||
|
@ -649,18 +649,13 @@ static int process_tok(char *tok)
|
||||
return(-2);
|
||||
}
|
||||
|
||||
/* command options mask */
|
||||
static uint32 cmd_set_options = 0xffffffff;
|
||||
|
||||
/****************************************************************************
|
||||
process commands from the client
|
||||
turn command line into command argument array
|
||||
****************************************************************************/
|
||||
static BOOL do_command(struct client_info *info, char *line)
|
||||
static BOOL get_cmd_args(char *line)
|
||||
{
|
||||
int i;
|
||||
char *ptr = line;
|
||||
pstring tok;
|
||||
|
||||
cmd_argc = 0;
|
||||
cmd_argv = NULL;
|
||||
|
||||
@ -676,6 +671,21 @@ static BOOL do_command(struct client_info *info, char *line)
|
||||
|
||||
} while (next_token(NULL, tok, NULL, sizeof(tok)));
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* command options mask */
|
||||
static uint32 cmd_set_options = 0xffffffff;
|
||||
|
||||
/****************************************************************************
|
||||
process commands from the client
|
||||
****************************************************************************/
|
||||
static BOOL do_command(struct client_info *info, char *line)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!get_cmd_args(line)) return False;
|
||||
|
||||
if (cmd_argc == 0)
|
||||
{
|
||||
return False;
|
||||
@ -693,11 +703,13 @@ static BOOL do_command(struct client_info *info, char *line)
|
||||
}
|
||||
else if (i == -2)
|
||||
{
|
||||
fprintf(out_hnd, "%s: command abbreviation ambiguous\n", CNV_LANG(tok));
|
||||
fprintf(out_hnd, "%s: command abbreviation ambiguous\n",
|
||||
CNV_LANG(cmd_argv[0]));
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(out_hnd, "%s: command not found\n", CNV_LANG(tok));
|
||||
fprintf(out_hnd, "%s: command not found\n",
|
||||
CNV_LANG(cmd_argv[0]));
|
||||
}
|
||||
|
||||
free_char_array(cmd_argc, cmd_argv);
|
||||
@ -916,10 +928,16 @@ static char *complete_regenum(char *text, int state)
|
||||
if (state == 0)
|
||||
{
|
||||
fstring srv_name;
|
||||
fstrcpy(srv_name, "\\\\");
|
||||
fstrcat(srv_name, cli_info.dest_host);
|
||||
strupper(srv_name);
|
||||
|
||||
if (cmd_argc >= 2 && cmd_argv != NULL && cmd_argv[1] != NULL)
|
||||
{
|
||||
char *sep;
|
||||
pstrcpy(full_keyname, cmd_argv[1]);
|
||||
split_server_keyname(srv_name, full_keyname,
|
||||
cmd_argv[1]);
|
||||
|
||||
sep = strrchr(full_keyname, '\\');
|
||||
if (sep != NULL)
|
||||
{
|
||||
@ -927,10 +945,6 @@ static char *complete_regenum(char *text, int state)
|
||||
}
|
||||
}
|
||||
|
||||
fstrcpy(srv_name, "\\\\");
|
||||
fstrcat(srv_name, cli_info.dest_host);
|
||||
strupper(srv_name);
|
||||
|
||||
/* Iterate all keys / values */
|
||||
if (!msrpc_reg_enum_key(srv_name, full_keyname,
|
||||
reg_init, reg_key_list, reg_val_list))
|
||||
@ -1249,6 +1263,8 @@ static char **completion_fn(char *text, int start, int end)
|
||||
int i;
|
||||
char lastch = ' ';
|
||||
|
||||
(void)get_cmd_args(rl_line_buffer);
|
||||
|
||||
safe_strcpy(cmd_partial, rl_line_buffer,
|
||||
MAX(sizeof(cmd_partial),end)-1);
|
||||
|
||||
@ -1354,7 +1370,6 @@ static void set_user_password(struct user_credentials *u,
|
||||
}
|
||||
}
|
||||
|
||||
#define CMD_INTER 0x0
|
||||
#define CMD_STR 0x1
|
||||
#define CMD_DBF 0x2
|
||||
#define CMD_SVC 0x4
|
||||
@ -1372,6 +1387,7 @@ static void set_user_password(struct user_credentials *u,
|
||||
#define CMD_NAME 0x4000
|
||||
#define CMD_DBG 0x8000
|
||||
#define CMD_SCOPE 0x10000
|
||||
#define CMD_INTER 0x20000
|
||||
|
||||
static void cmd_set(struct client_info *info, int argc, char *argv[])
|
||||
{
|
||||
@ -1390,7 +1406,7 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
|
||||
*term_code = 0;
|
||||
#endif /* KANJI */
|
||||
|
||||
if (*argv[1] != '-')
|
||||
if (argc > 1 && *argv[1] != '-')
|
||||
{
|
||||
if (argc > 1 && (*argv[1] != '-'))
|
||||
{
|
||||
@ -1457,6 +1473,10 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
|
||||
cmd_set_options |= CMD_PASS;
|
||||
memset(strchr(optarg,'%')+1,'X',strlen(password));
|
||||
}
|
||||
if (usr.user_name[0] == 0 && password[0] == 0)
|
||||
{
|
||||
cmd_set_options |= CMD_NOPW;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1554,13 +1574,18 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG(10,("cmd_set: options: %x\n", cmd_set_options));
|
||||
|
||||
if (IS_BITS_SET_ALL(cmd_set_options, CMD_HELP))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
setup_logging(debugf, interactive);
|
||||
reopen_logs();
|
||||
if (IS_BITS_SET_ALL(cmd_set_options, CMD_INTER))
|
||||
{
|
||||
setup_logging(debugf, interactive);
|
||||
reopen_logs();
|
||||
}
|
||||
|
||||
if (IS_BITS_SET_ALL(cmd_set_options, CMD_NOPW))
|
||||
{
|
||||
@ -1577,12 +1602,19 @@ static void cmd_set(struct client_info *info, int argc, char *argv[])
|
||||
strupper(global_myname);
|
||||
fstrcpy(cli_info.myhostname, global_myname);
|
||||
|
||||
if (!lp_load(servicesf,True, False, False))
|
||||
if (IS_BITS_SET_ALL(cmd_set_options, CMD_SVC))
|
||||
{
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf);
|
||||
if (!lp_load(servicesf,True, False, False))
|
||||
{
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
load_interfaces();
|
||||
if (IS_BITS_SET_ALL(cmd_set_options, CMD_INTER))
|
||||
{
|
||||
load_interfaces();
|
||||
}
|
||||
|
||||
fstrcpy(cli_info.mach_acct, cli_info.myhostname);
|
||||
strupper(cli_info.mach_acct);
|
||||
@ -1636,6 +1668,26 @@ static void read_user_env(struct user_credentials *u)
|
||||
bzero(password, sizeof(password));
|
||||
}
|
||||
|
||||
void readline_init(void)
|
||||
{
|
||||
#ifdef HAVE_LIBREADLINE
|
||||
|
||||
/* Initialise GNU Readline */
|
||||
|
||||
rl_readline_name = "rpcclient";
|
||||
rl_attempted_completion_function = completion_fn;
|
||||
rl_completion_entry_function = (Function *)complete_cmd_null;
|
||||
|
||||
/* Initialise history list */
|
||||
|
||||
using_history();
|
||||
|
||||
#else
|
||||
int x;
|
||||
x = 0; /* stop compiler warnings */
|
||||
#endif /* HAVE_LIBREADLINE */
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
main program
|
||||
****************************************************************************/
|
||||
@ -1666,20 +1718,7 @@ static void read_user_env(struct user_credentials *u)
|
||||
fstrcpy(cli_info.dom.level3_dom, "");
|
||||
fstrcpy(cli_info.dom.level5_dom, "");
|
||||
|
||||
#ifdef HAVE_LIBREADLINE
|
||||
|
||||
/* Initialise GNU Readline */
|
||||
|
||||
rl_readline_name = "rpcclient";
|
||||
rl_attempted_completion_function = completion_fn;
|
||||
rl_completion_entry_function = (Function *)complete_cmd_null;
|
||||
|
||||
/* Initialise history list */
|
||||
|
||||
using_history();
|
||||
|
||||
#endif /* HAVE_LIBREADLINE */
|
||||
|
||||
readline_init();
|
||||
TimeInit();
|
||||
charset_initialise();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user