Samba 3: added Samba 3.0.24 sources
[tomato.git] / release / src / router / samba3 / source / rpcclient / cmd_reg.c
blobe8038d094e62bae174165fdb8af0c89326f97bdd
1 /*
2 Unix SMB/CIFS implementation.
3 NT Domain Authentication SMB / MSRPC client
4 Copyright (C) Andrew Tridgell 1994-1997
5 Copyright (C) Luke Kenneth Casson Leighton 1996-1997
6 Copyright (C) Simo Sorce 2001
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "includes.h"
24 #include "rpcclient.h"
27 * keys. of the form:
28 * ----
30 * [HKLM]|[HKU]\[parent_keyname_components]\[subkey]|[value]
32 * reg_getsubkey() splits this down into:
33 * [HKLM]|[HKU]\[parent_keyname_components] and [subkey]|[value]
35 * do_reg_connect() splits the left side down further into:
36 * [HKLM]|[HKU] and [parent_keyname_components].
38 * HKLM is short for HKEY_LOCAL_MACHINE
39 * HKU is short for HKEY_USERS
41 * oh, and HKEY stands for "Hive Key".
45 #if 0 /* This whole file need to be rewritten for the current rpcclient interface */
47 /****************************************************************************
48 nt registry enum
49 ****************************************************************************/
50 static void cmd_reg_enum(struct client_info *info)
52 BOOL res = True;
53 BOOL res1 = True;
54 BOOL res2 = True;
55 int i;
57 POLICY_HND key_pol;
58 fstring full_keyname;
59 fstring key_name;
60 uint32 reg_type;
63 * query key info
66 fstring key_class;
67 uint32 max_class_len = 0;
68 uint32 num_subkeys;
69 uint32 max_subkeylen;
70 uint32 max_subkeysize;
71 uint32 num_values;
72 uint32 max_valnamelen;
73 uint32 max_valbufsize;
74 uint32 sec_desc;
75 NTTIME mod_time;
78 * unknown 0x1a request
81 uint32 unk_1a_response;
83 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
85 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
87 fprintf(out_hnd, "regenum <key_name>\n");
88 return;
91 if (!reg_split_key(full_keyname, &reg_type, key_name)) {
92 fprintf(out_hnd, "Unknown registry hive '%s'\n", key_name);
93 return;
96 /* open WINREG session. */
97 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
99 /* open registry receive a policy handle */
100 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
101 &info->dom.reg_pol_connect) : False;
103 if ((*key_name) != 0)
105 /* open an entry */
106 res1 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
107 key_name, 0x02000000, &key_pol) : False;
109 else
111 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
114 res1 = res1 ? do_reg_query_key(smb_cli,
115 &key_pol,
116 key_class, &max_class_len,
117 &num_subkeys, &max_subkeylen, &max_subkeysize,
118 &num_values, &max_valnamelen, &max_valbufsize,
119 &sec_desc, &mod_time) : False;
121 if (res1 && num_subkeys > 0)
123 fprintf(out_hnd,"Subkeys\n");
124 fprintf(out_hnd,"-------\n");
127 for (i = 0; i < num_subkeys; i++)
130 * enumerate key
133 fstring enum_name;
134 uint32 enum_unk1;
135 uint32 enum_unk2;
136 time_t key_mod_time;
138 /* unknown 1a it */
139 res2 = res1 ? do_reg_getversion(smb_cli, &key_pol,
140 &unk_1a_response) : False;
142 if (res2 && unk_1a_response != 5)
144 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
147 /* enum key */
148 res2 = res2 ? do_reg_enum_key(smb_cli, &key_pol,
149 i, enum_name,
150 &enum_unk1, &enum_unk2,
151 &key_mod_time) : False;
153 if (res2)
155 display_reg_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time);
156 display_reg_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time);
157 display_reg_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time);
162 if (num_values > 0)
164 fprintf(out_hnd,"Key Values\n");
165 fprintf(out_hnd,"----------\n");
168 for (i = 0; i < num_values; i++)
171 * enumerate key
174 uint32 val_type;
175 REGVAL_BUFFER value;
176 fstring val_name;
178 /* unknown 1a it */
179 res2 = res1 ? do_reg_getversion(smb_cli, &key_pol,
180 &unk_1a_response) : False;
182 if (res2 && unk_1a_response != 5)
184 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
187 /* enum key */
188 res2 = res2 ? do_reg_enum_val(smb_cli, &key_pol,
189 i, max_valnamelen, max_valbufsize,
190 val_name, &val_type, &value) : False;
192 if (res2)
194 display_reg_value_info(out_hnd, ACTION_HEADER , val_name, val_type, &value);
195 display_reg_value_info(out_hnd, ACTION_ENUMERATE, val_name, val_type, &value);
196 display_reg_value_info(out_hnd, ACTION_FOOTER , val_name, val_type, &value);
200 /* close the handles */
201 if ((*key_name) != 0)
203 res1 = res1 ? do_reg_close(smb_cli, &key_pol) : False;
205 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
207 /* close the session */
208 cli_nt_session_close(smb_cli);
210 if (res && res1 && res2)
212 DEBUG(5,("cmd_reg_enum: query succeeded\n"));
214 else
216 DEBUG(5,("cmd_reg_enum: query failed\n"));
220 /****************************************************************************
221 nt registry query key
222 ****************************************************************************/
223 static void cmd_reg_query_key(struct client_info *info)
225 BOOL res = True;
226 BOOL res1 = True;
228 POLICY_HND key_pol;
229 fstring full_keyname;
230 fstring key_name;
233 * query key info
236 fstring key_class;
237 uint32 key_class_len = 0;
238 uint32 num_subkeys;
239 uint32 max_subkeylen;
240 uint32 max_subkeysize;
241 uint32 num_values;
242 uint32 max_valnamelen;
243 uint32 max_valbufsize;
244 uint32 sec_desc;
245 NTTIME mod_time;
247 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
249 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
251 fprintf(out_hnd, "regquery key_name\n");
252 return;
255 /* open WINREG session. */
256 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
258 /* open registry receive a policy handle */
259 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
260 &info->dom.reg_pol_connect) : False;
262 if ((*key_name) != 0)
264 /* open an entry */
265 res1 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
266 key_name, 0x02000000, &key_pol) : False;
268 else
270 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
273 res1 = res1 ? do_reg_query_key(smb_cli,
274 &key_pol,
275 key_class, &key_class_len,
276 &num_subkeys, &max_subkeylen, &max_subkeysize,
277 &num_values, &max_valnamelen, &max_valbufsize,
278 &sec_desc, &mod_time) : False;
280 if (res1 && key_class_len != 0)
282 res1 = res1 ? do_reg_query_key(smb_cli,
283 &key_pol,
284 key_class, &key_class_len,
285 &num_subkeys, &max_subkeylen, &max_subkeysize,
286 &num_values, &max_valnamelen, &max_valbufsize,
287 &sec_desc, &mod_time) : False;
290 if (res1)
292 fprintf(out_hnd,"Registry Query Info Key\n");
293 fprintf(out_hnd,"key class: %s\n", key_class);
294 fprintf(out_hnd,"subkeys, max_len, max_size: %d %d %d\n", num_subkeys, max_subkeylen, max_subkeysize);
295 fprintf(out_hnd,"vals, max_len, max_size: 0x%x 0x%x 0x%x\n", num_values, max_valnamelen, max_valbufsize);
296 fprintf(out_hnd,"sec desc: 0x%x\n", sec_desc);
297 fprintf(out_hnd,"mod time: %s\n", http_timestring(nt_time_to_unix(&mod_time)));
300 /* close the handles */
301 if ((*key_name) != 0)
303 res1 = res1 ? do_reg_close(smb_cli, &key_pol) : False;
305 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
307 /* close the session */
308 cli_nt_session_close(smb_cli);
310 if (res && res1)
312 DEBUG(5,("cmd_reg_query: query succeeded\n"));
314 else
316 DEBUG(5,("cmd_reg_query: query failed\n"));
320 /****************************************************************************
321 nt registry create value
322 ****************************************************************************/
323 static void cmd_reg_set_val(struct client_info *info)
325 BOOL res = True;
326 BOOL res3 = True;
327 BOOL res4 = True;
329 POLICY_HND parent_pol;
330 fstring full_keyname;
331 fstring keyname;
332 fstring parent_name;
333 fstring val_name;
334 fstring tmp;
335 uint32 val_type;
336 RPC_DATA_BLOB value;
338 #if 0
339 uint32 unk_0;
340 uint32 unk_1;
341 /* query it */
342 res1 = res1 ? do_reg_query_info(smb_cli, &val_pol,
343 val_name, *val_type) : False;
344 #endif
346 DEBUG(5, ("cmd_reg_set_val: smb_cli->fd:%d\n", smb_cli->fd));
348 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
350 fprintf(out_hnd, "regcreate <val_name> <val_type> <val>\n");
351 return;
354 reg_get_subkey(full_keyname, keyname, val_name);
356 if (keyname[0] == 0 || val_name[0] == 0)
358 fprintf(out_hnd, "invalid key name\n");
359 return;
362 if (!next_token_nr(NULL, tmp, NULL, sizeof(tmp)))
364 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
365 return;
368 val_type = atoi(tmp);
370 if (val_type != 1 && val_type != 3 && val_type != 4)
372 fprintf(out_hnd, "val_type 1=UNISTR, 3=BYTES, 4=DWORD supported\n");
373 return;
376 if (!next_token_nr(NULL, tmp, NULL, sizeof(tmp)))
378 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
379 return;
382 switch (val_type)
384 case 0x01: /* UNISTR */
386 init_rpc_blob_str(&value, tmp, strlen(tmp)+1);
387 break;
389 case 0x03: /* BYTES */
391 init_rpc_blob_hex(&value, tmp);
392 break;
394 case 0x04: /* DWORD */
396 uint32 tmp_val;
397 if (strnequal(tmp, "0x", 2))
399 tmp_val = strtol(tmp, (char**)NULL, 16);
401 else
403 tmp_val = strtol(tmp, (char**)NULL, 10);
405 init_rpc_blob_uint32(&value, tmp_val);
406 break;
408 default:
410 fprintf(out_hnd, "i told you i only deal with UNISTR, DWORD and BYTES!\n");
411 return;
415 DEBUG(10,("key data:\n"));
416 dump_data(10, (char *)value.buffer, value.buf_len);
418 /* open WINREG session. */
419 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
421 /* open registry receive a policy handle */
422 res = res ? do_reg_connect(smb_cli, keyname, parent_name,
423 &info->dom.reg_pol_connect) : False;
425 if ((*val_name) != 0)
427 /* open an entry */
428 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
429 parent_name, 0x02000000, &parent_pol) : False;
431 else
433 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
436 /* create an entry */
437 res4 = res3 ? do_reg_set_val(smb_cli, &parent_pol,
438 val_name, val_type, &value) : False;
440 /* flush the modified key */
441 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
443 /* close the val handle */
444 if ((*val_name) != 0)
446 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
449 /* close the registry handles */
450 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
452 /* close the session */
453 cli_nt_session_close(smb_cli);
455 if (res && res3 && res4)
457 DEBUG(5,("cmd_reg_set_val: query succeeded\n"));
458 fprintf(out_hnd,"OK\n");
460 else
462 DEBUG(5,("cmd_reg_set_val: query failed\n"));
466 /****************************************************************************
467 nt registry delete value
468 ****************************************************************************/
469 static void cmd_reg_delete_val(struct client_info *info)
471 BOOL res = True;
472 BOOL res3 = True;
473 BOOL res4 = True;
475 POLICY_HND parent_pol;
476 fstring full_keyname;
477 fstring keyname;
478 fstring parent_name;
479 fstring val_name;
481 DEBUG(5, ("cmd_reg_delete_val: smb_cli->fd:%d\n", smb_cli->fd));
483 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
485 fprintf(out_hnd, "regdelete <val_name>\n");
486 return;
489 reg_get_subkey(full_keyname, keyname, val_name);
491 if (keyname[0] == 0 || val_name[0] == 0)
493 fprintf(out_hnd, "invalid key name\n");
494 return;
497 /* open WINREG session. */
498 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
500 /* open registry receive a policy handle */
501 res = res ? do_reg_connect(smb_cli, keyname, parent_name,
502 &info->dom.reg_pol_connect) : False;
504 if ((*val_name) != 0)
506 /* open an entry */
507 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
508 parent_name, 0x02000000, &parent_pol) : False;
510 else
512 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
515 /* delete an entry */
516 res4 = res3 ? do_reg_delete_val(smb_cli, &parent_pol, val_name) : False;
518 /* flush the modified key */
519 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
521 /* close the key handle */
522 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
524 /* close the registry handles */
525 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
527 /* close the session */
528 cli_nt_session_close(smb_cli);
530 if (res && res3 && res4)
532 DEBUG(5,("cmd_reg_delete_val: query succeeded\n"));
533 fprintf(out_hnd,"OK\n");
535 else
537 DEBUG(5,("cmd_reg_delete_val: query failed\n"));
541 /****************************************************************************
542 nt registry delete key
543 ****************************************************************************/
544 static void cmd_reg_delete_key(struct client_info *info)
546 BOOL res = True;
547 BOOL res3 = True;
548 BOOL res4 = True;
550 POLICY_HND parent_pol;
551 fstring full_keyname;
552 fstring parent_name;
553 fstring key_name;
554 fstring subkey_name;
556 DEBUG(5, ("cmd_reg_delete_key: smb_cli->fd:%d\n", smb_cli->fd));
558 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
560 fprintf(out_hnd, "regdeletekey <key_name>\n");
561 return;
564 reg_get_subkey(full_keyname, parent_name, subkey_name);
566 if (parent_name[0] == 0 || subkey_name[0] == 0)
568 fprintf(out_hnd, "invalid key name\n");
569 return;
572 /* open WINREG session. */
573 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
575 /* open registry receive a policy handle */
576 res = res ? do_reg_connect(smb_cli, parent_name, key_name,
577 &info->dom.reg_pol_connect) : False;
579 if ((*key_name) != 0)
581 /* open an entry */
582 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
583 key_name, 0x02000000, &parent_pol) : False;
585 else
587 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
590 /* create an entry */
591 res4 = res3 ? do_reg_delete_key(smb_cli, &parent_pol, subkey_name) : False;
593 /* flush the modified key */
594 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
596 /* close the key handle */
597 if ((*key_name) != 0)
599 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
602 /* close the registry handles */
603 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
605 /* close the session */
606 cli_nt_session_close(smb_cli);
608 if (res && res3 && res4)
610 DEBUG(5,("cmd_reg_delete_key: query succeeded\n"));
611 fprintf(out_hnd,"OK\n");
613 else
615 DEBUG(5,("cmd_reg_delete_key: query failed\n"));
619 /****************************************************************************
620 nt registry create key
621 ****************************************************************************/
622 static void cmd_reg_create_key(struct client_info *info)
624 BOOL res = True;
625 BOOL res3 = True;
626 BOOL res4 = True;
628 POLICY_HND parent_pol;
629 POLICY_HND key_pol;
630 fstring full_keyname;
631 fstring parent_key;
632 fstring parent_name;
633 fstring key_name;
634 fstring key_class;
635 SEC_ACCESS sam_access;
637 DEBUG(5, ("cmd_reg_create_key: smb_cli->fd:%d\n", smb_cli->fd));
639 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
641 fprintf(out_hnd, "regcreate <key_name> [key_class]\n");
642 return;
645 reg_get_subkey(full_keyname, parent_key, key_name);
647 if (parent_key[0] == 0 || key_name[0] == 0)
649 fprintf(out_hnd, "invalid key name\n");
650 return;
653 if (!next_token_nr(NULL, key_class, NULL, sizeof(key_class)))
655 memset(key_class, 0, sizeof(key_class));
658 /* set access permissions */
659 sam_access.mask = SEC_RIGHTS_READ;
661 /* open WINREG session. */
662 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
664 /* open registry receive a policy handle */
665 res = res ? do_reg_connect(smb_cli, parent_key, parent_name,
666 &info->dom.reg_pol_connect) : False;
668 if ((*parent_name) != 0)
670 /* open an entry */
671 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
672 parent_name, 0x02000000, &parent_pol) : False;
674 else
676 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
679 /* create an entry */
680 res4 = res3 ? do_reg_create_key(smb_cli, &parent_pol,
681 key_name, key_class, &sam_access, &key_pol) : False;
683 /* flush the modified key */
684 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
686 /* close the key handle */
687 res4 = res4 ? do_reg_close(smb_cli, &key_pol) : False;
689 /* close the key handle */
690 if ((*parent_name) != 0)
692 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
695 /* close the registry handles */
696 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
698 /* close the session */
699 cli_nt_session_close(smb_cli);
701 if (res && res3 && res4)
703 DEBUG(5,("cmd_reg_create_key: query succeeded\n"));
704 fprintf(out_hnd,"OK\n");
706 else
708 DEBUG(5,("cmd_reg_create_key: query failed\n"));
712 /****************************************************************************
713 nt registry security info
714 ****************************************************************************/
715 static void cmd_reg_test_key_sec(struct client_info *info)
717 BOOL res = True;
718 BOOL res3 = True;
719 BOOL res4 = True;
721 POLICY_HND key_pol;
722 fstring full_keyname;
723 fstring key_name;
726 * security info
729 uint32 sec_buf_size;
730 SEC_DESC_BUF *psdb;
732 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
734 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
736 fprintf(out_hnd, "reggetsec <key_name>\n");
737 return;
740 /* open WINREG session. */
741 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
743 /* open registry receive a policy handle */
744 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
745 &info->dom.reg_pol_connect) : False;
747 if ((*key_name) != 0)
749 /* open an entry */
750 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
751 key_name, 0x02000000, &key_pol) : False;
753 else
755 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
758 /* open an entry */
759 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
760 key_name, 0x02000000, &key_pol) : False;
762 /* query key sec info. first call sets sec_buf_size. */
764 sec_buf_size = 0;
765 res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
766 &sec_buf_size, &psdb) : False;
768 free_sec_desc_buf(&psdb);
770 res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
771 &sec_buf_size, &psdb) : False;
773 if (res4 && psdb->len > 0 && psdb->sec != NULL)
775 display_sec_desc(out_hnd, ACTION_HEADER , psdb->sec);
776 display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
777 display_sec_desc(out_hnd, ACTION_FOOTER , psdb->sec);
779 res4 = res4 ? do_reg_set_key_sec(smb_cli, &key_pol, psdb) : False;
782 free_sec_desc_buf(&psdb);
784 /* close the key handle */
785 if ((*key_name) != 0)
787 res3 = res3 ? do_reg_close(smb_cli, &key_pol) : False;
790 /* close the registry handles */
791 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
793 /* close the session */
794 cli_nt_session_close(smb_cli);
796 if (res && res3 && res4)
798 DEBUG(5,("cmd_reg_test2: query succeeded\n"));
799 fprintf(out_hnd,"Registry Test2\n");
801 else
803 DEBUG(5,("cmd_reg_test2: query failed\n"));
807 /****************************************************************************
808 nt registry security info
809 ****************************************************************************/
810 static void cmd_reg_get_key_sec(struct client_info *info)
812 BOOL res = True;
813 BOOL res3 = True;
814 BOOL res4 = True;
816 POLICY_HND key_pol;
817 fstring full_keyname;
818 fstring key_name;
821 * security info
824 uint32 sec_buf_size;
825 SEC_DESC_BUF *psdb;
827 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
829 if (!next_token_nr(NULL, full_keyname, NULL, sizeof(full_keyname)))
831 fprintf(out_hnd, "reggetsec <key_name>\n");
832 return;
835 /* open WINREG session. */
836 res = res ? cli_nt_session_open(smb_cli, PI_WINREG) : False;
838 /* open registry receive a policy handle */
839 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
840 &info->dom.reg_pol_connect) : False;
842 if ((*key_name) != 0)
844 /* open an entry */
845 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
846 key_name, 0x02000000, &key_pol) : False;
848 else
850 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
853 /* open an entry */
854 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
855 key_name, 0x02000000, &key_pol) : False;
857 /* Get the size. */
858 sec_buf_size = 0;
859 res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
860 &sec_buf_size, &psdb) : False;
862 free_sec_desc_buf(&psdb);
864 res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
865 &sec_buf_size, &psdb) : False;
867 if (res4 && psdb->len > 0 && psdb->sec != NULL)
869 display_sec_desc(out_hnd, ACTION_HEADER , psdb->sec);
870 display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
871 display_sec_desc(out_hnd, ACTION_FOOTER , psdb->sec);
874 free_sec_desc_buf(&psdb);
876 /* close the key handle */
877 if ((*key_name) != 0)
879 res3 = res3 ? do_reg_close(smb_cli, &key_pol) : False;
882 /* close the registry handles */
883 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
885 /* close the session */
886 cli_nt_session_close(smb_cli);
888 if (res && res3 && res4)
890 DEBUG(5,("cmd_reg_get_key_sec: query succeeded\n"));
892 else
894 DEBUG(5,("cmd_reg_get_key_sec: query failed\n"));
899 /****************************************************************************
900 nt registry shutdown
901 ****************************************************************************/
902 static NTSTATUS cmd_reg_shutdown(struct cli_state *cli, TALLOC_CTX *mem_ctx,
903 int argc, const char **argv)
905 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
906 fstring msg;
907 uint32 timeout = 20;
908 BOOL force = False;
909 BOOL reboot = False;
910 int opt;
912 *msg = 0;
913 optind = 0; /* TODO: test if this hack works on other systems too --simo */
915 while ((opt = getopt(argc, argv, "m:t:rf")) != EOF)
917 /*fprintf (stderr, "[%s]\n", argv[argc-1]);*/
919 switch (opt)
921 case 'm':
922 fstrcpy(msg, optarg);
923 /*fprintf (stderr, "[%s|%s]\n", optarg, msg);*/
924 break;
926 case 't':
927 timeout = atoi(optarg);
928 /*fprintf (stderr, "[%s|%d]\n", optarg, timeout);*/
929 break;
931 case 'r':
932 reboot = True;
933 break;
935 case 'f':
936 force = True;
937 break;
942 /* create an entry */
943 result = werror_to_ntstatus(cli_reg_shutdown(cli, mem_ctx, msg, timeout, reboot, force));
945 if (NT_STATUS_IS_OK(result))
946 DEBUG(5,("cmd_reg_shutdown: query succeeded\n"));
947 else
948 DEBUG(5,("cmd_reg_shutdown: query failed\n"));
950 return result;
953 /****************************************************************************
954 abort a shutdown
955 ****************************************************************************/
956 static NTSTATUS cmd_reg_abort_shutdown(struct cli_state *cli,
957 TALLOC_CTX *mem_ctx, int argc,
958 const char **argv)
960 NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
962 result = werror_to_ntstatus(cli_reg_abort_shutdown(cli, mem_ctx));
964 if (NT_STATUS_IS_OK(result))
965 DEBUG(5,("cmd_reg_abort_shutdown: query succeeded\n"));
966 else
967 DEBUG(5,("cmd_reg_abort_shutdown: query failed\n"));
969 return result;
972 #endif /* This whole file need to be rewritten for the cirrent rpcclient interface */
975 /* List of commands exported by this module */
976 struct cmd_set reg_commands[] = {
978 { "REG" },
979 #if 0
980 { "shutdown", RPC_RTYPE_NTSTATUS, cmd_reg_shutdown, NULL, PI_WINREG, "Remote Shutdown",
981 "syntax: shutdown [-m message] [-t timeout] [-r] [-h] [-f] (-r == reboot, -h == halt, -f == force)" },
983 { "abortshutdown", RPC_RTYPE_NTSTATUS, cmd_reg_abort_shutdown, NULL, PI_WINREG, "Abort Shutdown",
984 "syntax: abortshutdown" },
985 { "regenum", cmd_reg_enum, "Registry Enumeration", "<keyname>" },
986 { "regdeletekey", cmd_reg_delete_key, "Registry Key Delete", "<keyname>" },
987 { "regcreatekey", cmd_reg_create_key, "Registry Key Create", "<keyname> [keyclass]" },
988 { "regqueryval", cmd_reg_query_info, "Registry Value Query", "<valname>" },
989 { "regquerykey", cmd_reg_query_key, "Registry Key Query", "<keyname>" },
990 { "regdeleteval", cmd_reg_delete_val, "Registry Value Delete", "<valname>" },
991 { "regsetval", cmd_reg_set_val, "Registry Key Create", "<valname> <valtype> <value>" },
992 { "reggetsec", cmd_reg_get_key_sec, "Registry Key Security", "<keyname>" },
993 { "regtestsec", cmd_reg_test_key_sec, "Test Registry Key Security", "<keyname>" },
994 #endif
995 { NULL }