2 Unix SMB/Netbios implementation.
4 NT Domain Authentication SMB / MSRPC client
5 Copyright (C) Andrew Tridgell 1994-1997
6 Copyright (C) Luke Kenneth Casson Leighton 1996-1997
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.
32 extern int DEBUGLEVEL;
34 extern struct cli_state *smb_cli;
43 * [HKLM]|[HKU]\[parent_keyname_components]\[subkey]|[value]
45 * reg_getsubkey() splits this down into:
46 * [HKLM]|[HKU]\[parent_keyname_components] and [subkey]|[value]
48 * do_reg_connect() splits the left side down further into:
49 * [HKLM]|[HKU] and [parent_keyname_components].
51 * HKLM is short for HKEY_LOCAL_MACHINE
52 * HKU is short for HKEY_USERS
54 * oh, and HKEY stands for "Hive Key".
58 /****************************************************************************
60 ****************************************************************************/
61 void cmd_reg_enum(struct client_info *info)
78 uint32 max_class_len = 0;
81 uint32 max_subkeysize;
83 uint32 max_valnamelen;
84 uint32 max_valbufsize;
89 * unknown 0x1a request
92 uint32 unk_1a_response;
94 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
96 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
98 fprintf(out_hnd, "regenum <key_name>\n");
102 /* open WINREG session. */
103 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
105 /* open registry receive a policy handle */
106 res = res ? do_reg_connect(smb_cli, fnum, full_keyname, key_name,
107 &info->dom.reg_pol_connect) : False;
109 if ((*key_name) != 0)
112 res1 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
113 key_name, 0x02000000, &key_pol) : False;
117 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
120 res1 = res1 ? do_reg_query_key(smb_cli, fnum,
122 key_class, &max_class_len,
123 &num_subkeys, &max_subkeylen, &max_subkeysize,
124 &num_values, &max_valnamelen, &max_valbufsize,
125 &sec_desc, &mod_time) : False;
127 if (res1 && num_subkeys > 0)
129 fprintf(out_hnd,"Subkeys\n");
130 fprintf(out_hnd,"-------\n");
133 for (i = 0; i < num_subkeys; i++)
145 res2 = res1 ? do_reg_unknown_1a(smb_cli, fnum, &key_pol,
146 &unk_1a_response) : False;
148 if (res2 && unk_1a_response != 5)
150 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
154 res2 = res2 ? do_reg_enum_key(smb_cli, fnum, &key_pol,
156 &enum_unk1, &enum_unk2,
157 &key_mod_time) : False;
161 display_reg_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time);
162 display_reg_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time);
163 display_reg_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time);
170 fprintf(out_hnd,"Key Values\n");
171 fprintf(out_hnd,"----------\n");
174 for (i = 0; i < num_values; i++)
185 res2 = res1 ? do_reg_unknown_1a(smb_cli, fnum, &key_pol,
186 &unk_1a_response) : False;
188 if (res2 && unk_1a_response != 5)
190 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
194 res2 = res2 ? do_reg_enum_val(smb_cli, fnum, &key_pol,
195 i, max_valnamelen, max_valbufsize,
196 val_name, &val_type, &value) : False;
200 display_reg_value_info(out_hnd, ACTION_HEADER , val_name, val_type, &value);
201 display_reg_value_info(out_hnd, ACTION_ENUMERATE, val_name, val_type, &value);
202 display_reg_value_info(out_hnd, ACTION_FOOTER , val_name, val_type, &value);
206 /* close the handles */
207 if ((*key_name) != 0)
209 res1 = res1 ? do_reg_close(smb_cli, fnum, &key_pol) : False;
211 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
213 /* close the session */
214 cli_nt_session_close(smb_cli, fnum);
216 if (res && res1 && res2)
218 DEBUG(5,("cmd_reg_enum: query succeeded\n"));
222 DEBUG(5,("cmd_reg_enum: query failed\n"));
226 /****************************************************************************
227 nt registry query key
228 ****************************************************************************/
229 void cmd_reg_query_key(struct client_info *info)
236 fstring full_keyname;
244 uint32 key_class_len = 0;
246 uint32 max_subkeylen;
247 uint32 max_subkeysize;
249 uint32 max_valnamelen;
250 uint32 max_valbufsize;
254 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
256 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
258 fprintf(out_hnd, "regquery key_name\n");
262 /* open WINREG session. */
263 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
265 /* open registry receive a policy handle */
266 res = res ? do_reg_connect(smb_cli, fnum, full_keyname, key_name,
267 &info->dom.reg_pol_connect) : False;
269 if ((*key_name) != 0)
272 res1 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
273 key_name, 0x02000000, &key_pol) : False;
277 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
280 res1 = res1 ? do_reg_query_key(smb_cli, fnum,
282 key_class, &key_class_len,
283 &num_subkeys, &max_subkeylen, &max_subkeysize,
284 &num_values, &max_valnamelen, &max_valbufsize,
285 &sec_desc, &mod_time) : False;
287 if (res1 && key_class_len != 0)
289 res1 = res1 ? do_reg_query_key(smb_cli, fnum,
291 key_class, &key_class_len,
292 &num_subkeys, &max_subkeylen, &max_subkeysize,
293 &num_values, &max_valnamelen, &max_valbufsize,
294 &sec_desc, &mod_time) : False;
299 fprintf(out_hnd,"Registry Query Info Key\n");
300 fprintf(out_hnd,"key class: %s\n", key_class);
301 fprintf(out_hnd,"subkeys, max_len, max_size: %d %d %d\n", num_subkeys, max_subkeylen, max_subkeysize);
302 fprintf(out_hnd,"vals, max_len, max_size: 0x%x 0x%x 0x%x\n", num_values, max_valnamelen, max_valbufsize);
303 fprintf(out_hnd,"sec desc: 0x%x\n", sec_desc);
304 fprintf(out_hnd,"mod time: %s\n", http_timestring(nt_time_to_unix(&mod_time)));
307 /* close the handles */
308 if ((*key_name) != 0)
310 res1 = res1 ? do_reg_close(smb_cli, fnum, &key_pol) : False;
312 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
314 /* close the session */
315 cli_nt_session_close(smb_cli, fnum);
319 DEBUG(5,("cmd_reg_query: query succeeded\n"));
323 DEBUG(5,("cmd_reg_query: query failed\n"));
327 /****************************************************************************
328 nt registry create value
329 ****************************************************************************/
330 void cmd_reg_create_val(struct client_info *info)
337 POLICY_HND parent_pol;
338 fstring full_keyname;
350 res1 = res1 ? do_reg_query_info(smb_cli, fnum, &val_pol,
351 type, &unk_0, &unk_1) : False;
354 DEBUG(5, ("cmd_reg_create_val: smb_cli->fd:%d\n", smb_cli->fd));
356 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
358 fprintf(out_hnd, "regcreate <val_name> <val_type> <val>\n");
362 reg_get_subkey(full_keyname, keyname, val_name);
364 if (keyname[0] == 0 || val_name[0] == 0)
366 fprintf(out_hnd, "invalid key name\n");
370 if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
372 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
376 val_type = atoi(tmp);
378 if (val_type != 1 && val_type != 3 && val_type != 4)
380 fprintf(out_hnd, "val_type 1=UNISTR, 3=BYTES, 4=DWORD supported\n");
384 if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
386 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
392 case 0x01: /* UNISTR */
394 make_buffer3_str(&value, tmp, strlen(tmp)+1);
397 case 0x03: /* BYTES */
399 make_buffer3_hex(&value, tmp);
402 case 0x04: /* DWORD */
405 if (strnequal(tmp, "0x", 2))
407 tmp_val = strtol(tmp, (char**)NULL, 16);
411 tmp_val = strtol(tmp, (char**)NULL, 10);
413 make_buffer3_uint32(&value, tmp_val);
418 fprintf(out_hnd, "i told you i only deal with UNISTR, DWORD and BYTES!\n");
423 DEBUG(10,("key data:\n"));
424 dump_data(10, (char *)value.buffer, value.buf_len);
426 /* open WINREG session. */
427 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
429 /* open registry receive a policy handle */
430 res = res ? do_reg_connect(smb_cli, fnum, keyname, parent_name,
431 &info->dom.reg_pol_connect) : False;
433 if ((*val_name) != 0)
436 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
437 parent_name, 0x02000000, &parent_pol) : False;
441 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
444 /* create an entry */
445 res4 = res3 ? do_reg_create_val(smb_cli, fnum, &parent_pol,
446 val_name, val_type, &value) : False;
448 /* flush the modified key */
449 res4 = res4 ? do_reg_flush_key(smb_cli, fnum, &parent_pol) : False;
451 /* close the val handle */
452 if ((*val_name) != 0)
454 res3 = res3 ? do_reg_close(smb_cli, fnum, &parent_pol) : False;
457 /* close the registry handles */
458 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
460 /* close the session */
461 cli_nt_session_close(smb_cli, fnum);
463 if (res && res3 && res4)
465 DEBUG(5,("cmd_reg_create_val: query succeeded\n"));
466 fprintf(out_hnd,"OK\n");
470 DEBUG(5,("cmd_reg_create_val: query failed\n"));
474 /****************************************************************************
475 nt registry delete value
476 ****************************************************************************/
477 void cmd_reg_delete_val(struct client_info *info)
484 POLICY_HND parent_pol;
485 fstring full_keyname;
490 DEBUG(5, ("cmd_reg_delete_val: smb_cli->fd:%d\n", smb_cli->fd));
492 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
494 fprintf(out_hnd, "regdelete <val_name>\n");
498 reg_get_subkey(full_keyname, keyname, val_name);
500 if (keyname[0] == 0 || val_name[0] == 0)
502 fprintf(out_hnd, "invalid key name\n");
506 /* open WINREG session. */
507 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
509 /* open registry receive a policy handle */
510 res = res ? do_reg_connect(smb_cli, fnum, keyname, parent_name,
511 &info->dom.reg_pol_connect) : False;
513 if ((*val_name) != 0)
516 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
517 parent_name, 0x02000000, &parent_pol) : False;
521 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
524 /* delete an entry */
525 res4 = res3 ? do_reg_delete_val(smb_cli, fnum, &parent_pol, val_name) : False;
527 /* flush the modified key */
528 res4 = res4 ? do_reg_flush_key(smb_cli, fnum, &parent_pol) : False;
530 /* close the key handle */
531 res3 = res3 ? do_reg_close(smb_cli, fnum, &parent_pol) : False;
533 /* close the registry handles */
534 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
536 /* close the session */
537 cli_nt_session_close(smb_cli, fnum);
539 if (res && res3 && res4)
541 DEBUG(5,("cmd_reg_delete_val: query succeeded\n"));
542 fprintf(out_hnd,"OK\n");
546 DEBUG(5,("cmd_reg_delete_val: query failed\n"));
550 /****************************************************************************
551 nt registry delete key
552 ****************************************************************************/
553 void cmd_reg_delete_key(struct client_info *info)
560 POLICY_HND parent_pol;
561 fstring full_keyname;
566 DEBUG(5, ("cmd_reg_delete_key: smb_cli->fd:%d\n", smb_cli->fd));
568 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
570 fprintf(out_hnd, "regdeletekey <key_name>\n");
574 reg_get_subkey(full_keyname, parent_name, subkey_name);
576 if (parent_name[0] == 0 || subkey_name[0] == 0)
578 fprintf(out_hnd, "invalid key name\n");
582 /* open WINREG session. */
583 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
585 /* open registry receive a policy handle */
586 res = res ? do_reg_connect(smb_cli, fnum, parent_name, key_name,
587 &info->dom.reg_pol_connect) : False;
589 if ((*key_name) != 0)
592 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
593 key_name, 0x02000000, &parent_pol) : False;
597 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
600 /* create an entry */
601 res4 = res3 ? do_reg_delete_key(smb_cli, fnum, &parent_pol, subkey_name) : False;
603 /* flush the modified key */
604 res4 = res4 ? do_reg_flush_key(smb_cli, fnum, &parent_pol) : False;
606 /* close the key handle */
607 if ((*key_name) != 0)
609 res3 = res3 ? do_reg_close(smb_cli, fnum, &parent_pol) : False;
612 /* close the registry handles */
613 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
615 /* close the session */
616 cli_nt_session_close(smb_cli, fnum);
618 if (res && res3 && res4)
620 DEBUG(5,("cmd_reg_delete_key: query succeeded\n"));
621 fprintf(out_hnd,"OK\n");
625 DEBUG(5,("cmd_reg_delete_key: query failed\n"));
629 /****************************************************************************
630 nt registry create key
631 ****************************************************************************/
632 void cmd_reg_create_key(struct client_info *info)
639 POLICY_HND parent_pol;
641 fstring full_keyname;
646 SEC_ACCESS sam_access;
648 DEBUG(5, ("cmd_reg_create_key: smb_cli->fd:%d\n", smb_cli->fd));
650 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
652 fprintf(out_hnd, "regcreate <key_name> [key_class]\n");
656 reg_get_subkey(full_keyname, parent_key, key_name);
658 if (parent_key[0] == 0 || key_name[0] == 0)
660 fprintf(out_hnd, "invalid key name\n");
664 if (!next_token(NULL, key_class, NULL, sizeof(key_class)))
666 memset(key_class, 0, sizeof(key_class));
669 /* set access permissions */
670 sam_access.mask = SEC_RIGHTS_READ;
672 /* open WINREG session. */
673 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
675 /* open registry receive a policy handle */
676 res = res ? do_reg_connect(smb_cli, fnum, parent_key, parent_name,
677 &info->dom.reg_pol_connect) : False;
679 if ((*parent_name) != 0)
682 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
683 parent_name, 0x02000000, &parent_pol) : False;
687 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
690 /* create an entry */
691 res4 = res3 ? do_reg_create_key(smb_cli, fnum, &parent_pol,
692 key_name, key_class, &sam_access, &key_pol) : False;
694 /* flush the modified key */
695 res4 = res4 ? do_reg_flush_key(smb_cli, fnum, &parent_pol) : False;
697 /* close the key handle */
698 res4 = res4 ? do_reg_close(smb_cli, fnum, &key_pol) : False;
700 /* close the key handle */
701 if ((*parent_name) != 0)
703 res3 = res3 ? do_reg_close(smb_cli, fnum, &parent_pol) : False;
706 /* close the registry handles */
707 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
709 /* close the session */
710 cli_nt_session_close(smb_cli, fnum);
712 if (res && res3 && res4)
714 DEBUG(5,("cmd_reg_create_key: query succeeded\n"));
715 fprintf(out_hnd,"OK\n");
719 DEBUG(5,("cmd_reg_create_key: query failed\n"));
723 /****************************************************************************
724 nt registry security info
725 ****************************************************************************/
726 void cmd_reg_test_key_sec(struct client_info *info)
734 fstring full_keyname;
742 SEC_DESC_BUF sec_buf;
744 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
746 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
748 fprintf(out_hnd, "reggetsec <key_name>\n");
752 /* open WINREG session. */
753 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
755 /* open registry receive a policy handle */
756 res = res ? do_reg_connect(smb_cli, fnum, full_keyname, key_name,
757 &info->dom.reg_pol_connect) : False;
759 if ((*key_name) != 0)
762 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
763 key_name, 0x02000000, &key_pol) : False;
767 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
771 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
772 key_name, 0x02000000, &key_pol) : False;
774 /* query key sec info. first call sets sec_buf_size. */
776 ZERO_STRUCT(sec_buf);
778 res4 = res3 ? do_reg_get_key_sec(smb_cli, fnum, &key_pol,
779 &sec_buf_size, &sec_buf) : False;
783 free_sec_desc_buf(&sec_buf);
786 res4 = res4 ? do_reg_get_key_sec(smb_cli, fnum, &key_pol,
787 &sec_buf_size, &sec_buf) : False;
789 if (res4 && sec_buf.len > 0 && sec_buf.sec != NULL)
791 display_sec_desc(out_hnd, ACTION_HEADER , sec_buf.sec);
792 display_sec_desc(out_hnd, ACTION_ENUMERATE, sec_buf.sec);
793 display_sec_desc(out_hnd, ACTION_FOOTER , sec_buf.sec);
795 res4 = res4 ? do_reg_set_key_sec(smb_cli, fnum, &key_pol,
796 sec_buf_size, sec_buf.sec) : False;
798 free_sec_desc_buf(&sec_buf);
801 /* close the key handle */
802 if ((*key_name) != 0)
804 res3 = res3 ? do_reg_close(smb_cli, fnum, &key_pol) : False;
807 /* close the registry handles */
808 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
810 /* close the session */
811 cli_nt_session_close(smb_cli, fnum);
813 if (res && res3 && res4)
815 DEBUG(5,("cmd_reg_test2: query succeeded\n"));
816 fprintf(out_hnd,"Registry Test2\n");
820 DEBUG(5,("cmd_reg_test2: query failed\n"));
824 /****************************************************************************
825 nt registry security info
826 ****************************************************************************/
827 void cmd_reg_get_key_sec(struct client_info *info)
835 fstring full_keyname;
843 SEC_DESC_BUF sec_buf;
845 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
847 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
849 fprintf(out_hnd, "reggetsec <key_name>\n");
853 /* open WINREG session. */
854 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG, &fnum) : False;
856 /* open registry receive a policy handle */
857 res = res ? do_reg_connect(smb_cli, fnum, full_keyname, key_name,
858 &info->dom.reg_pol_connect) : False;
860 if ((*key_name) != 0)
863 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
864 key_name, 0x02000000, &key_pol) : False;
868 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
872 res3 = res ? do_reg_open_entry(smb_cli, fnum, &info->dom.reg_pol_connect,
873 key_name, 0x02000000, &key_pol) : False;
875 /* query key sec info. first call sets sec_buf_size. */
877 ZERO_STRUCT(sec_buf);
879 res4 = res3 ? do_reg_get_key_sec(smb_cli, fnum, &key_pol,
880 &sec_buf_size, &sec_buf) : False;
884 free_sec_desc_buf(&sec_buf);
887 res4 = res4 ? do_reg_get_key_sec(smb_cli, fnum, &key_pol,
888 &sec_buf_size, &sec_buf) : False;
890 if (res4 && sec_buf.len > 0 && sec_buf.sec != NULL)
892 display_sec_desc(out_hnd, ACTION_HEADER , sec_buf.sec);
893 display_sec_desc(out_hnd, ACTION_ENUMERATE, sec_buf.sec);
894 display_sec_desc(out_hnd, ACTION_FOOTER , sec_buf.sec);
899 /* close the key handle */
900 if ((*key_name) != 0)
902 res3 = res3 ? do_reg_close(smb_cli, fnum, &key_pol) : False;
905 /* close the registry handles */
906 res = res ? do_reg_close(smb_cli, fnum, &info->dom.reg_pol_connect) : False;
908 /* close the session */
909 cli_nt_session_close(smb_cli, fnum);
911 if (res && res3 && res4)
913 DEBUG(5,("cmd_reg_get_key_sec: query succeeded\n"));
917 DEBUG(5,("cmd_reg_get_key_sec: query failed\n"));