1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-15 23:24:37 +03:00

Service Control Manager - service enumeration.

(This used to be commit f4dd8f6b566961890b2933b7a413241bf9b93797)
This commit is contained in:
Luke Leighton 1999-01-27 20:31:58 +00:00
parent f6c646467d
commit 0504064085
4 changed files with 65 additions and 41 deletions

View File

@ -1785,8 +1785,9 @@ BOOL do_svc_open_sc_man(struct cli_state *cli, uint16 fnum,
BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
POLICY_HND *hnd, POLICY_HND *hnd,
uint32 services_type, uint32 services_state, uint32 services_type, uint32 services_state,
uint32 buf_size, uint32 *resume_hnd, uint32 *buf_size, uint32 *resume_hnd,
ENUM_SRVC_STATUS **svcs); uint32 *dos_error,
ENUM_SRVC_STATUS **svcs, uint32 *num_svcs);
BOOL do_svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd); BOOL do_svc_close(struct cli_state *cli, uint16 fnum, POLICY_HND *hnd);
/*The following definitions come from rpc_client/cli_wkssvc.c */ /*The following definitions come from rpc_client/cli_wkssvc.c */
@ -2768,6 +2769,7 @@ void display_reg_value_info(FILE *out_hnd, enum action_type action,
char *val_name, uint32 val_type, BUFFER2 *value); char *val_name, uint32 val_type, BUFFER2 *value);
void display_reg_key_info(FILE *out_hnd, enum action_type action, void display_reg_key_info(FILE *out_hnd, enum action_type action,
char *key_name, time_t key_mod_time); char *key_name, time_t key_mod_time);
void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc);
/*The following definitions come from rpcclient/rpcclient.c */ /*The following definitions come from rpcclient/rpcclient.c */

View File

@ -97,15 +97,19 @@ do a SVC Enumerate Services
BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum, BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
POLICY_HND *hnd, POLICY_HND *hnd,
uint32 services_type, uint32 services_state, uint32 services_type, uint32 services_state,
uint32 buf_size, uint32 *resume_hnd, uint32 *buf_size, uint32 *resume_hnd,
ENUM_SRVC_STATUS **svcs) uint32 *dos_error,
ENUM_SRVC_STATUS **svcs, uint32 *num_svcs)
{ {
prs_struct rbuf; prs_struct rbuf;
prs_struct buf; prs_struct buf;
SVC_Q_ENUM_SVCS_STATUS q_o; SVC_Q_ENUM_SVCS_STATUS q_o;
BOOL valid_pol = False; BOOL valid_pol = False;
if (hnd == NULL) return False; if (hnd == NULL || buf_size == NULL || dos_error == NULL || num_svcs == NULL)
{
return False;
}
prs_init(&buf , 1024, 4, SAFETY_MARGIN, False); prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True ); prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True );
@ -116,7 +120,7 @@ BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
make_svc_q_enum_svcs_status(&q_o, hnd, make_svc_q_enum_svcs_status(&q_o, hnd,
services_type, services_state, services_type, services_state,
buf_size, *resume_hnd); *buf_size, *resume_hnd);
/* turn parameters into data stream */ /* turn parameters into data stream */
svc_io_q_enum_svcs_status("", &q_o, &buf, 0); svc_io_q_enum_svcs_status("", &q_o, &buf, 0);
@ -136,13 +140,16 @@ BOOL do_svc_enum_svcs(struct cli_state *cli, uint16 fnum,
{ {
/* report error code */ /* report error code */
DEBUG(0,("SVC_ENUM_SVCS_STATUS: %s\n", smb_err_msg(ERRDOS, r_o.dos_status))); DEBUG(0,("SVC_ENUM_SVCS_STATUS: %s\n", smb_err_msg(ERRDOS, r_o.dos_status)));
p = r_o.dos_status != ERRmoredata; p = r_o.dos_status == ERRmoredata;
} }
if (p) if (p)
{ {
(*svcs) = r_o.svcs; (*svcs) = r_o.svcs;
(*num_svcs) = r_o.num_svcs;
(*resume_hnd) = get_enum_hnd(&r_o.resume_hnd); (*resume_hnd) = get_enum_hnd(&r_o.resume_hnd);
(*buf_size) = r_o.more_buf_size;
(*dos_error) = r_o.dos_status;
valid_pol = True; valid_pol = True;
} }
} }

View File

@ -46,10 +46,13 @@ void cmd_svc_enum(struct client_info *info)
BOOL res1 = True; BOOL res1 = True;
int i; int i;
uint32 resume_hnd = 0; uint32 resume_hnd = 0;
uint32 buf_size = 0;
uint32 dos_error = 0;
ENUM_SRVC_STATUS *svcs = NULL; ENUM_SRVC_STATUS *svcs = NULL;
uint32 num_svcs = 0;
POLICY_HND sc_man_pol; POLICY_HND sc_man_pol;
fstring full_keyname;
fstring srv_name; fstring srv_name;
fstrcpy(srv_name, "\\\\"); fstrcpy(srv_name, "\\\\");
@ -68,50 +71,38 @@ void cmd_svc_enum(struct client_info *info)
do do
{ {
buf_size += 0x800;
/* enumerate services */ /* enumerate services */
res1 = res ? do_svc_enum_svcs(smb_cli, fnum, res1 = res ? do_svc_enum_svcs(smb_cli, fnum,
&sc_man_pol, &sc_man_pol,
0x00000030, 0x00000003, 0x00000030, 0x00000003,
0x00000080, &resume_hnd, &svcs) : False; &buf_size, &resume_hnd, &dos_error,
&svcs, &num_svcs) : False;
} while (resume_hnd != 0); } while (dos_error == ERRmoredata);
if (res1 && dos_error == 0x0 && num_svcs > 0 && svcs != NULL)
{
fprintf(out_hnd,"Services\n");
fprintf(out_hnd,"--------\n");
}
for (i = 0; i < num_svcs && svcs != NULL; i++)
{
if (res1)
{
display_svc_info(out_hnd, ACTION_HEADER , &svcs[i]);
display_svc_info(out_hnd, ACTION_ENUMERATE, &svcs[i]);
display_svc_info(out_hnd, ACTION_FOOTER , &svcs[i]);
}
}
if (svcs != NULL) if (svcs != NULL)
{ {
free(svcs); free(svcs);
} }
#if 0
if (res1 && num_subkeys > 0)
{
fprintf(out_hnd,"Subkeys\n");
fprintf(out_hnd,"-------\n");
}
for (i = 0; i < num_subkeys; i++)
{
BOOL res2 = True;
/*
* enumerate key
*/
/* enum key */
res2 = res2 ? do_svc_enum_key(smb_cli, fnum, &key_pol,
i, enum_name,
&enum_unk1, &enum_unk2,
&key_mod_time) : False;
if (res2)
{
display_svc_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time);
display_svc_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time);
display_svc_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time);
}
}
}
#endif
res = res ? do_svc_close(smb_cli, fnum, &sc_man_pol) : False; res = res ? do_svc_close(smb_cli, fnum, &sc_man_pol) : False;
/* close the session */ /* close the session */

View File

@ -1535,6 +1535,30 @@ void display_reg_key_info(FILE *out_hnd, enum action_type action,
} }
} }
/****************************************************************************
display structure
****************************************************************************/
void display_svc_info(FILE *out_hnd, enum action_type action, ENUM_SRVC_STATUS *svc)
{
switch (action)
{
case ACTION_HEADER:
{
break;
}
case ACTION_ENUMERATE:
{
fprintf(out_hnd, "\t%s:", unistr2(svc->uni_srvc_name .buffer)); /* service name unicode string */
fprintf(out_hnd, "\t%s\n", unistr2(svc->uni_disp_name .buffer)); /* display name unicode string */
break;
}
case ACTION_FOOTER:
{
break;
}
}
}
#if COPY_THIS_TEMPLATE #if COPY_THIS_TEMPLATE
/**************************************************************************** /****************************************************************************
display structure display structure