Correct PPTP server firewall rules chain.
[tomato/davidwu.git] / release / src / router / samba / source / rpcclient / cmd_reg.c
blobfcc12c530cc62258637602a543748daa211c7cb4
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
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.
25 #ifdef SYSLOG
26 #undef SYSLOG
27 #endif
29 #include "includes.h"
30 #include "nterr.h"
32 extern int DEBUGLEVEL;
34 extern struct cli_state *smb_cli;
35 extern int smb_tidx;
37 extern FILE* out_hnd;
40 * keys. of the form:
41 * ----
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 /****************************************************************************
59 nt registry enum
60 ****************************************************************************/
61 void cmd_reg_enum(struct client_info *info)
63 BOOL res = True;
64 BOOL res1 = True;
65 BOOL res2 = True;
66 int i;
68 POLICY_HND key_pol;
69 fstring full_keyname;
70 fstring key_name;
73 * query key info
76 fstring key_class;
77 uint32 max_class_len = 0;
78 uint32 num_subkeys;
79 uint32 max_subkeylen;
80 uint32 max_subkeysize;
81 uint32 num_values;
82 uint32 max_valnamelen;
83 uint32 max_valbufsize;
84 uint32 sec_desc;
85 NTTIME mod_time;
88 * unknown 0x1a request
91 uint32 unk_1a_response;
93 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
95 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
97 fprintf(out_hnd, "regenum <key_name>\n");
98 return;
101 /* open WINREG session. */
102 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
104 /* open registry receive a policy handle */
105 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
106 &info->dom.reg_pol_connect) : False;
108 if ((*key_name) != 0)
110 /* open an entry */
111 res1 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
112 key_name, 0x02000000, &key_pol) : False;
114 else
116 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
119 res1 = res1 ? do_reg_query_key(smb_cli,
120 &key_pol,
121 key_class, &max_class_len,
122 &num_subkeys, &max_subkeylen, &max_subkeysize,
123 &num_values, &max_valnamelen, &max_valbufsize,
124 &sec_desc, &mod_time) : False;
126 if (res1 && num_subkeys > 0)
128 fprintf(out_hnd,"Subkeys\n");
129 fprintf(out_hnd,"-------\n");
132 for (i = 0; i < num_subkeys; i++)
135 * enumerate key
138 fstring enum_name;
139 uint32 enum_unk1;
140 uint32 enum_unk2;
141 time_t key_mod_time;
143 /* unknown 1a it */
144 res2 = res1 ? do_reg_unknown_1a(smb_cli, &key_pol,
145 &unk_1a_response) : False;
147 if (res2 && unk_1a_response != 5)
149 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
152 /* enum key */
153 res2 = res2 ? do_reg_enum_key(smb_cli, &key_pol,
154 i, enum_name,
155 &enum_unk1, &enum_unk2,
156 &key_mod_time) : False;
158 if (res2)
160 display_reg_key_info(out_hnd, ACTION_HEADER , enum_name, key_mod_time);
161 display_reg_key_info(out_hnd, ACTION_ENUMERATE, enum_name, key_mod_time);
162 display_reg_key_info(out_hnd, ACTION_FOOTER , enum_name, key_mod_time);
167 if (num_values > 0)
169 fprintf(out_hnd,"Key Values\n");
170 fprintf(out_hnd,"----------\n");
173 for (i = 0; i < num_values; i++)
176 * enumerate key
179 uint32 val_type;
180 BUFFER2 value;
181 fstring val_name;
183 /* unknown 1a it */
184 res2 = res1 ? do_reg_unknown_1a(smb_cli, &key_pol,
185 &unk_1a_response) : False;
187 if (res2 && unk_1a_response != 5)
189 fprintf(out_hnd,"Unknown 1a response: %x\n", unk_1a_response);
192 /* enum key */
193 res2 = res2 ? do_reg_enum_val(smb_cli, &key_pol,
194 i, max_valnamelen, max_valbufsize,
195 val_name, &val_type, &value) : False;
197 if (res2)
199 display_reg_value_info(out_hnd, ACTION_HEADER , val_name, val_type, &value);
200 display_reg_value_info(out_hnd, ACTION_ENUMERATE, val_name, val_type, &value);
201 display_reg_value_info(out_hnd, ACTION_FOOTER , val_name, val_type, &value);
205 /* close the handles */
206 if ((*key_name) != 0)
208 res1 = res1 ? do_reg_close(smb_cli, &key_pol) : False;
210 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
212 /* close the session */
213 cli_nt_session_close(smb_cli);
215 if (res && res1 && res2)
217 DEBUG(5,("cmd_reg_enum: query succeeded\n"));
219 else
221 DEBUG(5,("cmd_reg_enum: query failed\n"));
225 /****************************************************************************
226 nt registry query key
227 ****************************************************************************/
228 void cmd_reg_query_key(struct client_info *info)
230 BOOL res = True;
231 BOOL res1 = True;
233 POLICY_HND key_pol;
234 fstring full_keyname;
235 fstring key_name;
238 * query key info
241 fstring key_class;
242 uint32 key_class_len = 0;
243 uint32 num_subkeys;
244 uint32 max_subkeylen;
245 uint32 max_subkeysize;
246 uint32 num_values;
247 uint32 max_valnamelen;
248 uint32 max_valbufsize;
249 uint32 sec_desc;
250 NTTIME mod_time;
252 DEBUG(5, ("cmd_reg_enum: smb_cli->fd:%d\n", smb_cli->fd));
254 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
256 fprintf(out_hnd, "regquery key_name\n");
257 return;
260 /* open WINREG session. */
261 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
263 /* open registry receive a policy handle */
264 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
265 &info->dom.reg_pol_connect) : False;
267 if ((*key_name) != 0)
269 /* open an entry */
270 res1 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
271 key_name, 0x02000000, &key_pol) : False;
273 else
275 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
278 res1 = res1 ? do_reg_query_key(smb_cli,
279 &key_pol,
280 key_class, &key_class_len,
281 &num_subkeys, &max_subkeylen, &max_subkeysize,
282 &num_values, &max_valnamelen, &max_valbufsize,
283 &sec_desc, &mod_time) : False;
285 if (res1 && key_class_len != 0)
287 res1 = res1 ? do_reg_query_key(smb_cli,
288 &key_pol,
289 key_class, &key_class_len,
290 &num_subkeys, &max_subkeylen, &max_subkeysize,
291 &num_values, &max_valnamelen, &max_valbufsize,
292 &sec_desc, &mod_time) : False;
295 if (res1)
297 fprintf(out_hnd,"Registry Query Info Key\n");
298 fprintf(out_hnd,"key class: %s\n", key_class);
299 fprintf(out_hnd,"subkeys, max_len, max_size: %d %d %d\n", num_subkeys, max_subkeylen, max_subkeysize);
300 fprintf(out_hnd,"vals, max_len, max_size: 0x%x 0x%x 0x%x\n", num_values, max_valnamelen, max_valbufsize);
301 fprintf(out_hnd,"sec desc: 0x%x\n", sec_desc);
302 fprintf(out_hnd,"mod time: %s\n", http_timestring(nt_time_to_unix(&mod_time)));
305 /* close the handles */
306 if ((*key_name) != 0)
308 res1 = res1 ? do_reg_close(smb_cli, &key_pol) : False;
310 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
312 /* close the session */
313 cli_nt_session_close(smb_cli);
315 if (res && res1)
317 DEBUG(5,("cmd_reg_query: query succeeded\n"));
319 else
321 DEBUG(5,("cmd_reg_query: query failed\n"));
325 /****************************************************************************
326 nt registry create value
327 ****************************************************************************/
328 void cmd_reg_create_val(struct client_info *info)
330 BOOL res = True;
331 BOOL res3 = True;
332 BOOL res4 = True;
334 POLICY_HND parent_pol;
335 fstring full_keyname;
336 fstring keyname;
337 fstring parent_name;
338 fstring val_name;
339 fstring tmp;
340 uint32 val_type;
341 BUFFER3 value;
343 #if 0
344 uint32 unk_0;
345 uint32 unk_1;
346 /* query it */
347 res1 = res1 ? do_reg_query_info(smb_cli, &val_pol,
348 type, &unk_0, &unk_1) : False;
349 #endif
351 DEBUG(5, ("cmd_reg_create_val: smb_cli->fd:%d\n", smb_cli->fd));
353 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
355 fprintf(out_hnd, "regcreate <val_name> <val_type> <val>\n");
356 return;
359 reg_get_subkey(full_keyname, keyname, val_name);
361 if (keyname[0] == 0 || val_name[0] == 0)
363 fprintf(out_hnd, "invalid key name\n");
364 return;
367 if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
369 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
370 return;
373 val_type = atoi(tmp);
375 if (val_type != 1 && val_type != 3 && val_type != 4)
377 fprintf(out_hnd, "val_type 1=UNISTR, 3=BYTES, 4=DWORD supported\n");
378 return;
381 if (!next_token(NULL, tmp, NULL, sizeof(tmp)))
383 fprintf(out_hnd, "regcreate <val_name> <val_type (1|4)> <val>\n");
384 return;
387 switch (val_type)
389 case 0x01: /* UNISTR */
391 init_buffer3_str(&value, tmp, strlen(tmp)+1);
392 break;
394 case 0x03: /* BYTES */
396 init_buffer3_hex(&value, tmp);
397 break;
399 case 0x04: /* DWORD */
401 uint32 tmp_val;
402 if (strnequal(tmp, "0x", 2))
404 tmp_val = strtol(tmp, (char**)NULL, 16);
406 else
408 tmp_val = strtol(tmp, (char**)NULL, 10);
410 init_buffer3_uint32(&value, tmp_val);
411 break;
413 default:
415 fprintf(out_hnd, "i told you i only deal with UNISTR, DWORD and BYTES!\n");
416 return;
420 DEBUG(10,("key data:\n"));
421 dump_data(10, (char *)value.buffer, value.buf_len);
423 /* open WINREG session. */
424 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
426 /* open registry receive a policy handle */
427 res = res ? do_reg_connect(smb_cli, keyname, parent_name,
428 &info->dom.reg_pol_connect) : False;
430 if ((*val_name) != 0)
432 /* open an entry */
433 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
434 parent_name, 0x02000000, &parent_pol) : False;
436 else
438 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
441 /* create an entry */
442 res4 = res3 ? do_reg_create_val(smb_cli, &parent_pol,
443 val_name, val_type, &value) : False;
445 /* flush the modified key */
446 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
448 /* close the val handle */
449 if ((*val_name) != 0)
451 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
454 /* close the registry handles */
455 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
457 /* close the session */
458 cli_nt_session_close(smb_cli);
460 if (res && res3 && res4)
462 DEBUG(5,("cmd_reg_create_val: query succeeded\n"));
463 fprintf(out_hnd,"OK\n");
465 else
467 DEBUG(5,("cmd_reg_create_val: query failed\n"));
471 /****************************************************************************
472 nt registry delete value
473 ****************************************************************************/
474 void cmd_reg_delete_val(struct client_info *info)
476 BOOL res = True;
477 BOOL res3 = True;
478 BOOL res4 = True;
480 POLICY_HND parent_pol;
481 fstring full_keyname;
482 fstring keyname;
483 fstring parent_name;
484 fstring val_name;
486 DEBUG(5, ("cmd_reg_delete_val: smb_cli->fd:%d\n", smb_cli->fd));
488 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
490 fprintf(out_hnd, "regdelete <val_name>\n");
491 return;
494 reg_get_subkey(full_keyname, keyname, val_name);
496 if (keyname[0] == 0 || val_name[0] == 0)
498 fprintf(out_hnd, "invalid key name\n");
499 return;
502 /* open WINREG session. */
503 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
505 /* open registry receive a policy handle */
506 res = res ? do_reg_connect(smb_cli, keyname, parent_name,
507 &info->dom.reg_pol_connect) : False;
509 if ((*val_name) != 0)
511 /* open an entry */
512 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
513 parent_name, 0x02000000, &parent_pol) : False;
515 else
517 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
520 /* delete an entry */
521 res4 = res3 ? do_reg_delete_val(smb_cli, &parent_pol, val_name) : False;
523 /* flush the modified key */
524 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
526 /* close the key handle */
527 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
529 /* close the registry handles */
530 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
532 /* close the session */
533 cli_nt_session_close(smb_cli);
535 if (res && res3 && res4)
537 DEBUG(5,("cmd_reg_delete_val: query succeeded\n"));
538 fprintf(out_hnd,"OK\n");
540 else
542 DEBUG(5,("cmd_reg_delete_val: query failed\n"));
546 /****************************************************************************
547 nt registry delete key
548 ****************************************************************************/
549 void cmd_reg_delete_key(struct client_info *info)
551 BOOL res = True;
552 BOOL res3 = True;
553 BOOL res4 = True;
555 POLICY_HND parent_pol;
556 fstring full_keyname;
557 fstring parent_name;
558 fstring key_name;
559 fstring subkey_name;
561 DEBUG(5, ("cmd_reg_delete_key: smb_cli->fd:%d\n", smb_cli->fd));
563 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
565 fprintf(out_hnd, "regdeletekey <key_name>\n");
566 return;
569 reg_get_subkey(full_keyname, parent_name, subkey_name);
571 if (parent_name[0] == 0 || subkey_name[0] == 0)
573 fprintf(out_hnd, "invalid key name\n");
574 return;
577 /* open WINREG session. */
578 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
580 /* open registry receive a policy handle */
581 res = res ? do_reg_connect(smb_cli, parent_name, key_name,
582 &info->dom.reg_pol_connect) : False;
584 if ((*key_name) != 0)
586 /* open an entry */
587 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
588 key_name, 0x02000000, &parent_pol) : False;
590 else
592 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
595 /* create an entry */
596 res4 = res3 ? do_reg_delete_key(smb_cli, &parent_pol, subkey_name) : False;
598 /* flush the modified key */
599 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
601 /* close the key handle */
602 if ((*key_name) != 0)
604 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
607 /* close the registry handles */
608 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
610 /* close the session */
611 cli_nt_session_close(smb_cli);
613 if (res && res3 && res4)
615 DEBUG(5,("cmd_reg_delete_key: query succeeded\n"));
616 fprintf(out_hnd,"OK\n");
618 else
620 DEBUG(5,("cmd_reg_delete_key: query failed\n"));
624 /****************************************************************************
625 nt registry create key
626 ****************************************************************************/
627 void cmd_reg_create_key(struct client_info *info)
629 BOOL res = True;
630 BOOL res3 = True;
631 BOOL res4 = True;
633 POLICY_HND parent_pol;
634 POLICY_HND key_pol;
635 fstring full_keyname;
636 fstring parent_key;
637 fstring parent_name;
638 fstring key_name;
639 fstring key_class;
640 SEC_ACCESS sam_access;
642 DEBUG(5, ("cmd_reg_create_key: smb_cli->fd:%d\n", smb_cli->fd));
644 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
646 fprintf(out_hnd, "regcreate <key_name> [key_class]\n");
647 return;
650 reg_get_subkey(full_keyname, parent_key, key_name);
652 if (parent_key[0] == 0 || key_name[0] == 0)
654 fprintf(out_hnd, "invalid key name\n");
655 return;
658 if (!next_token(NULL, key_class, NULL, sizeof(key_class)))
660 memset(key_class, 0, sizeof(key_class));
663 /* set access permissions */
664 sam_access.mask = SEC_RIGHTS_READ;
666 /* open WINREG session. */
667 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
669 /* open registry receive a policy handle */
670 res = res ? do_reg_connect(smb_cli, parent_key, parent_name,
671 &info->dom.reg_pol_connect) : False;
673 if ((*parent_name) != 0)
675 /* open an entry */
676 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
677 parent_name, 0x02000000, &parent_pol) : False;
679 else
681 memcpy(&parent_pol, &info->dom.reg_pol_connect, sizeof(parent_pol));
684 /* create an entry */
685 res4 = res3 ? do_reg_create_key(smb_cli, &parent_pol,
686 key_name, key_class, &sam_access, &key_pol) : False;
688 /* flush the modified key */
689 res4 = res4 ? do_reg_flush_key(smb_cli, &parent_pol) : False;
691 /* close the key handle */
692 res4 = res4 ? do_reg_close(smb_cli, &key_pol) : False;
694 /* close the key handle */
695 if ((*parent_name) != 0)
697 res3 = res3 ? do_reg_close(smb_cli, &parent_pol) : False;
700 /* close the registry handles */
701 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
703 /* close the session */
704 cli_nt_session_close(smb_cli);
706 if (res && res3 && res4)
708 DEBUG(5,("cmd_reg_create_key: query succeeded\n"));
709 fprintf(out_hnd,"OK\n");
711 else
713 DEBUG(5,("cmd_reg_create_key: query failed\n"));
717 /****************************************************************************
718 nt registry security info
719 ****************************************************************************/
720 void cmd_reg_test_key_sec(struct client_info *info)
722 BOOL res = True;
723 BOOL res3 = True;
724 BOOL res4 = True;
726 POLICY_HND key_pol;
727 fstring full_keyname;
728 fstring key_name;
731 * security info
734 uint32 sec_buf_size;
735 SEC_DESC_BUF *psdb;
737 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
739 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
741 fprintf(out_hnd, "reggetsec <key_name>\n");
742 return;
745 /* open WINREG session. */
746 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
748 /* open registry receive a policy handle */
749 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
750 &info->dom.reg_pol_connect) : False;
752 if ((*key_name) != 0)
754 /* open an entry */
755 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
756 key_name, 0x02000000, &key_pol) : False;
758 else
760 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
763 /* open an entry */
764 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
765 key_name, 0x02000000, &key_pol) : False;
767 /* query key sec info. first call sets sec_buf_size. */
769 sec_buf_size = 0;
770 res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
771 &sec_buf_size, &psdb) : False;
773 free_sec_desc_buf(&psdb);
775 res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
776 &sec_buf_size, &psdb) : False;
778 if (res4 && psdb->len > 0 && psdb->sec != NULL)
780 display_sec_desc(out_hnd, ACTION_HEADER , psdb->sec);
781 display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
782 display_sec_desc(out_hnd, ACTION_FOOTER , psdb->sec);
784 res4 = res4 ? do_reg_set_key_sec(smb_cli, &key_pol, psdb) : False;
787 free_sec_desc_buf(&psdb);
789 /* close the key handle */
790 if ((*key_name) != 0)
792 res3 = res3 ? do_reg_close(smb_cli, &key_pol) : False;
795 /* close the registry handles */
796 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
798 /* close the session */
799 cli_nt_session_close(smb_cli);
801 if (res && res3 && res4)
803 DEBUG(5,("cmd_reg_test2: query succeeded\n"));
804 fprintf(out_hnd,"Registry Test2\n");
806 else
808 DEBUG(5,("cmd_reg_test2: query failed\n"));
812 /****************************************************************************
813 nt registry security info
814 ****************************************************************************/
815 void cmd_reg_get_key_sec(struct client_info *info)
817 BOOL res = True;
818 BOOL res3 = True;
819 BOOL res4 = True;
821 POLICY_HND key_pol;
822 fstring full_keyname;
823 fstring key_name;
826 * security info
829 uint32 sec_buf_size;
830 SEC_DESC_BUF *psdb;
832 DEBUG(5, ("cmd_reg_get_key_sec: smb_cli->fd:%d\n", smb_cli->fd));
834 if (!next_token(NULL, full_keyname, NULL, sizeof(full_keyname)))
836 fprintf(out_hnd, "reggetsec <key_name>\n");
837 return;
840 /* open WINREG session. */
841 res = res ? cli_nt_session_open(smb_cli, PIPE_WINREG) : False;
843 /* open registry receive a policy handle */
844 res = res ? do_reg_connect(smb_cli, full_keyname, key_name,
845 &info->dom.reg_pol_connect) : False;
847 if ((*key_name) != 0)
849 /* open an entry */
850 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
851 key_name, 0x02000000, &key_pol) : False;
853 else
855 memcpy(&key_pol, &info->dom.reg_pol_connect, sizeof(key_pol));
858 /* open an entry */
859 res3 = res ? do_reg_open_entry(smb_cli, &info->dom.reg_pol_connect,
860 key_name, 0x02000000, &key_pol) : False;
862 /* Get the size. */
863 sec_buf_size = 0;
864 res4 = res3 ? do_reg_get_key_sec(smb_cli, &key_pol,
865 &sec_buf_size, &psdb) : False;
867 free_sec_desc_buf(&psdb);
869 res4 = res4 ? do_reg_get_key_sec(smb_cli, &key_pol,
870 &sec_buf_size, &psdb) : False;
872 if (res4 && psdb->len > 0 && psdb->sec != NULL)
874 display_sec_desc(out_hnd, ACTION_HEADER , psdb->sec);
875 display_sec_desc(out_hnd, ACTION_ENUMERATE, psdb->sec);
876 display_sec_desc(out_hnd, ACTION_FOOTER , psdb->sec);
879 free_sec_desc_buf(&psdb);
881 /* close the key handle */
882 if ((*key_name) != 0)
884 res3 = res3 ? do_reg_close(smb_cli, &key_pol) : False;
887 /* close the registry handles */
888 res = res ? do_reg_close(smb_cli, &info->dom.reg_pol_connect) : False;
890 /* close the session */
891 cli_nt_session_close(smb_cli);
893 if (res && res3 && res4)
895 DEBUG(5,("cmd_reg_get_key_sec: query succeeded\n"));
897 else
899 DEBUG(5,("cmd_reg_get_key_sec: query failed\n"));