Remove accidential commit.
[ira/wip.git] / source3 / rpcclient / cmd_netlogon.c
1 /* 
2    Unix SMB/CIFS implementation.
3    RPC pipe client
4
5    Copyright (C) Tim Potter 2000
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "includes.h"
22 #include "rpcclient.h"
23
24 static WERROR cmd_netlogon_logon_ctrl2(struct rpc_pipe_client *cli,
25                                        TALLOC_CTX *mem_ctx, int argc,
26                                        const char **argv)
27 {
28         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
29         WERROR werr;
30         const char *logon_server = cli->cli->desthost;
31         enum netr_LogonControlCode function_code = NETLOGON_CONTROL_REDISCOVER;
32         uint32_t level = 1;
33         union netr_CONTROL_DATA_INFORMATION data;
34         union netr_CONTROL_QUERY_INFORMATION query;
35         const char *domain = lp_workgroup();
36
37         if (argc > 5) {
38                 fprintf(stderr, "Usage: %s <logon_server> <function_code> "
39                         "<level> <domain>\n", argv[0]);
40                 return WERR_OK;
41         }
42
43         if (argc >= 2) {
44                 logon_server = argv[1];
45         }
46
47         if (argc >= 3) {
48                 function_code = atoi(argv[2]);
49         }
50
51         if (argc >= 4) {
52                 level = atoi(argv[3]);
53         }
54
55         if (argc >= 5) {
56                 domain = argv[4];
57         }
58
59         switch (function_code) {
60                 case NETLOGON_CONTROL_REDISCOVER:
61                 case NETLOGON_CONTROL_TC_QUERY:
62                         data.domain = domain;
63                         break;
64                 default:
65                         break;
66         }
67
68         status = rpccli_netr_LogonControl2(cli, mem_ctx,
69                                           logon_server,
70                                           function_code,
71                                           level,
72                                           &data,
73                                           &query,
74                                           &werr);
75         if (!NT_STATUS_IS_OK(status)) {
76                 return ntstatus_to_werror(status);
77         }
78
79         if (!W_ERROR_IS_OK(werr)) {
80                 return werr;
81         }
82
83         /* Display results */
84
85         return werr;
86 }
87
88 static WERROR cmd_netlogon_getanydcname(struct rpc_pipe_client *cli, 
89                                         TALLOC_CTX *mem_ctx, int argc, 
90                                         const char **argv)
91 {
92         const char *dcname = NULL;
93         WERROR werr;
94         NTSTATUS status;
95         int old_timeout;
96
97         if (argc != 2) {
98                 fprintf(stderr, "Usage: %s domainname\n", argv[0]);
99                 return WERR_OK;
100         }
101
102         /* Make sure to wait for our DC's reply */
103         old_timeout = cli_set_timeout(cli->cli, MAX(cli->cli->timeout,30000)); /* 30 seconds. */
104
105         status = rpccli_netr_GetAnyDCName(cli, mem_ctx,
106                                           cli->cli->desthost,
107                                           argv[1],
108                                           &dcname,
109                                           &werr);
110         cli_set_timeout(cli->cli, old_timeout);
111
112         if (!NT_STATUS_IS_OK(status)) {
113                 return ntstatus_to_werror(status);
114         }
115
116         if (!W_ERROR_IS_OK(werr)) {
117                 return werr;
118         }
119
120         /* Display results */
121
122         printf("%s\n", dcname);
123
124         return werr;
125 }
126
127 static WERROR cmd_netlogon_getdcname(struct rpc_pipe_client *cli,
128                                      TALLOC_CTX *mem_ctx, int argc,
129                                      const char **argv)
130 {
131         const char *dcname = NULL;
132         NTSTATUS status;
133         WERROR werr;
134         int old_timeout;
135
136         if (argc != 2) {
137                 fprintf(stderr, "Usage: %s domainname\n", argv[0]);
138                 return WERR_OK;
139         }
140
141         /* Make sure to wait for our DC's reply */
142         old_timeout = cli_set_timeout(cli->cli, MAX(cli->cli->timeout,30000)); /* 30 seconds. */
143
144         status = rpccli_netr_GetDcName(cli, mem_ctx,
145                                        cli->cli->desthost,
146                                        argv[1],
147                                        &dcname,
148                                        &werr);
149         cli_set_timeout(cli->cli, old_timeout);
150
151         if (!NT_STATUS_IS_OK(status)) {
152                 return ntstatus_to_werror(status);
153         }
154
155         if (!W_ERROR_IS_OK(werr)) {
156                 return werr;
157         }
158
159         /* Display results */
160
161         printf("%s\n", dcname);
162
163         return werr;
164 }
165
166 static WERROR cmd_netlogon_dsr_getdcname(struct rpc_pipe_client *cli,
167                                          TALLOC_CTX *mem_ctx, int argc,
168                                          const char **argv)
169 {
170         NTSTATUS result;
171         WERROR werr = WERR_OK;
172         uint32 flags = DS_RETURN_DNS_NAME;
173         const char *server_name = cli->cli->desthost;
174         const char *domain_name;
175         struct GUID domain_guid = GUID_zero();
176         struct GUID site_guid = GUID_zero();
177         struct netr_DsRGetDCNameInfo *info = NULL;
178
179         if (argc < 2) {
180                 fprintf(stderr, "Usage: %s [domain_name] [domain_guid] "
181                                 "[site_guid] [flags]\n", argv[0]);
182                 return WERR_OK;
183         }
184
185         if (argc >= 2)
186                 domain_name = argv[1];
187
188         if (argc >= 3) {
189                 if (!NT_STATUS_IS_OK(GUID_from_string(argv[2], &domain_guid))) {
190                         return WERR_NOMEM;
191                 }
192         }
193
194         if (argc >= 4) {
195                 if (!NT_STATUS_IS_OK(GUID_from_string(argv[3], &site_guid))) {
196                         return WERR_NOMEM;
197                 }
198         }
199
200         if (argc >= 5)
201                 sscanf(argv[4], "%x", &flags);
202
203         debug_dsdcinfo_flags(1,flags);
204
205         result = rpccli_netr_DsRGetDCName(cli, mem_ctx,
206                                           server_name,
207                                           domain_name,
208                                           &domain_guid,
209                                           &site_guid,
210                                           flags,
211                                           &info,
212                                           &werr);
213
214         if (W_ERROR_IS_OK(werr)) {
215                 d_printf("DsGetDcName gave: %s\n",
216                 NDR_PRINT_STRUCT_STRING(mem_ctx, netr_DsRGetDCNameInfo, info));
217                 return WERR_OK;
218         }
219
220         printf("rpccli_netlogon_dsr_getdcname returned %s\n",
221                dos_errstr(werr));
222
223         return werr;
224 }
225
226 static WERROR cmd_netlogon_dsr_getdcnameex(struct rpc_pipe_client *cli,
227                                            TALLOC_CTX *mem_ctx, int argc,
228                                            const char **argv)
229 {
230         WERROR result;
231         NTSTATUS status;
232         uint32_t flags = DS_RETURN_DNS_NAME;
233         const char *server_name = cli->cli->desthost;
234         const char *domain_name;
235         const char *site_name = NULL;
236         struct GUID domain_guid = GUID_zero();
237         struct netr_DsRGetDCNameInfo *info = NULL;
238
239         if (argc < 2) {
240                 fprintf(stderr, "Usage: %s [domain_name] [domain_guid] "
241                                 "[site_name] [flags]\n", argv[0]);
242                 return WERR_OK;
243         }
244
245         domain_name = argv[1];
246
247         if (argc >= 3) {
248                 if (!NT_STATUS_IS_OK(GUID_from_string(argv[2], &domain_guid))) {
249                         return WERR_NOMEM;
250                 }
251         }
252
253         if (argc >= 4) {
254                 site_name = argv[3];
255         }
256
257         if (argc >= 5) {
258                 sscanf(argv[4], "%x", &flags);
259         }
260
261         debug_dsdcinfo_flags(1,flags);
262
263         status = rpccli_netr_DsRGetDCNameEx(cli, mem_ctx,
264                                             server_name,
265                                             domain_name,
266                                             &domain_guid,
267                                             site_name,
268                                             flags,
269                                             &info,
270                                             &result);
271         if (!NT_STATUS_IS_OK(status)) {
272                 return ntstatus_to_werror(status);
273         }
274
275         if (!W_ERROR_IS_OK(result)) {
276                 return result;
277         }
278
279         d_printf("DsRGetDCNameEx gave %s\n",
280                 NDR_PRINT_STRUCT_STRING(mem_ctx, netr_DsRGetDCNameInfo, info));
281
282         return result;
283 }
284
285 static WERROR cmd_netlogon_dsr_getdcnameex2(struct rpc_pipe_client *cli,
286                                             TALLOC_CTX *mem_ctx, int argc,
287                                             const char **argv)
288 {
289         WERROR result;
290         NTSTATUS status;
291         uint32_t flags = DS_RETURN_DNS_NAME;
292         const char *server_name = cli->cli->desthost;
293         const char *domain_name = NULL;
294         const char *client_account = NULL;
295         uint32_t mask = 0;
296         const char *site_name = NULL;
297         struct GUID domain_guid = GUID_zero();
298         struct netr_DsRGetDCNameInfo *info = NULL;
299
300         if (argc < 2) {
301                 fprintf(stderr, "Usage: %s [client_account] [acb_mask] "
302                                 "[domain_name] [domain_guid] [site_name] "
303                                 "[flags]\n", argv[0]);
304                 return WERR_OK;
305         }
306
307         if (argc >= 2) {
308                 client_account = argv[1];
309         }
310
311         if (argc >= 3) {
312                 mask = atoi(argv[2]);
313         }
314
315         if (argc >= 4) {
316                 domain_name = argv[3];
317         }
318
319         if (argc >= 5) {
320                 if (!NT_STATUS_IS_OK(GUID_from_string(argv[4], &domain_guid))) {
321                         return WERR_NOMEM;
322                 }
323         }
324
325         if (argc >= 6) {
326                 site_name = argv[5];
327         }
328
329         if (argc >= 7) {
330                 sscanf(argv[6], "%x", &flags);
331         }
332
333         debug_dsdcinfo_flags(1,flags);
334
335         status = rpccli_netr_DsRGetDCNameEx2(cli, mem_ctx,
336                                              server_name,
337                                              client_account,
338                                              mask,
339                                              domain_name,
340                                              &domain_guid,
341                                              site_name,
342                                              flags,
343                                              &info,
344                                              &result);
345         if (!NT_STATUS_IS_OK(status)) {
346                 return ntstatus_to_werror(status);
347         }
348
349         if (!W_ERROR_IS_OK(result)) {
350                 return result;
351         }
352
353         d_printf("DsRGetDCNameEx2 gave %s\n",
354                 NDR_PRINT_STRUCT_STRING(mem_ctx, netr_DsRGetDCNameInfo, info));
355
356         return result;
357 }
358
359
360 static WERROR cmd_netlogon_dsr_getsitename(struct rpc_pipe_client *cli,
361                                            TALLOC_CTX *mem_ctx, int argc,
362                                            const char **argv)
363 {
364         WERROR werr;
365         NTSTATUS status;
366         const char *sitename = NULL;
367
368         if (argc != 2) {
369                 fprintf(stderr, "Usage: %s computername\n", argv[0]);
370                 return WERR_OK;
371         }
372
373         status = rpccli_netr_DsRGetSiteName(cli, mem_ctx,
374                                             argv[1],
375                                             &sitename,
376                                             &werr);
377         if (!NT_STATUS_IS_OK(status)) {
378                 return ntstatus_to_werror(status);
379         }
380
381         if (!W_ERROR_IS_OK(werr)) {
382                 printf("rpccli_netlogon_dsr_gesitename returned %s\n",
383                        nt_errstr(werror_to_ntstatus(werr)));
384                 return werr;
385         }
386
387         printf("Computer %s is on Site: %s\n", argv[1], sitename);
388
389         return WERR_OK;
390 }
391
392 static WERROR cmd_netlogon_logon_ctrl(struct rpc_pipe_client *cli,
393                                       TALLOC_CTX *mem_ctx, int argc,
394                                       const char **argv)
395 {
396         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
397         WERROR werr;
398         const char *logon_server = cli->cli->desthost;
399         enum netr_LogonControlCode function_code = 1;
400         uint32_t level = 1;
401         union netr_CONTROL_QUERY_INFORMATION info;
402
403         if (argc > 4) {
404                 fprintf(stderr, "Usage: %s <logon_server> <function_code> "
405                         "<level>\n", argv[0]);
406                 return WERR_OK;
407         }
408
409         if (argc >= 2) {
410                 logon_server = argv[1];
411         }
412
413         if (argc >= 3) {
414                 function_code = atoi(argv[2]);
415         }
416
417         if (argc >= 4) {
418                 level = atoi(argv[3]);
419         }
420
421         status = rpccli_netr_LogonControl(cli, mem_ctx,
422                                           logon_server,
423                                           function_code,
424                                           level,
425                                           &info,
426                                           &werr);
427         if (!NT_STATUS_IS_OK(status)) {
428                 return ntstatus_to_werror(status);
429         }
430
431         if (!W_ERROR_IS_OK(werr)) {
432                 return werr;
433         }
434
435         /* Display results */
436
437         return werr;
438 }
439
440 /* Display sam synchronisation information */
441
442 static void display_sam_sync(uint32 num_deltas, SAM_DELTA_HDR *hdr_deltas,
443                              SAM_DELTA_CTR *deltas)
444 {
445         fstring name;
446         uint32 i, j;
447
448         for (i = 0; i < num_deltas; i++) {
449                 switch (hdr_deltas[i].type) {
450                 case SAM_DELTA_DOMAIN_INFO:
451                         unistr2_to_ascii(name,
452                                          &deltas[i].domain_info.uni_dom_name,
453                                          sizeof(name));
454                         printf("Domain: %s\n", name);
455                         break;
456                 case SAM_DELTA_GROUP_INFO:
457                         unistr2_to_ascii(name,
458                                          &deltas[i].group_info.uni_grp_name,
459                                          sizeof(name));
460                         printf("Group: %s\n", name);
461                         break;
462                 case SAM_DELTA_ACCOUNT_INFO:
463                         unistr2_to_ascii(name, 
464                                          &deltas[i].account_info.uni_acct_name,
465                                          sizeof(name));
466                         printf("Account: %s\n", name);
467                         break;
468                 case SAM_DELTA_ALIAS_INFO:
469                         unistr2_to_ascii(name, 
470                                          &deltas[i].alias_info.uni_als_name,
471                                          sizeof(name));
472                         printf("Alias: %s\n", name);
473                         break;
474                 case SAM_DELTA_ALIAS_MEM: {
475                         SAM_ALIAS_MEM_INFO *alias = &deltas[i].als_mem_info;
476
477                         for (j = 0; j < alias->num_members; j++) {
478                                 fstring sid_str;
479
480                                 sid_to_fstring(sid_str, &alias->sids[j].sid);
481
482                                 printf("%s\n", sid_str);
483                         }
484                         break;
485                 }
486                 case SAM_DELTA_GROUP_MEM: {
487                         SAM_GROUP_MEM_INFO *group = &deltas[i].grp_mem_info;
488
489                         for (j = 0; j < group->num_members; j++)
490                                 printf("rid 0x%x, attrib 0x%08x\n", 
491                                           group->rids[j], group->attribs[j]);
492                         break;
493                 }
494                 case SAM_DELTA_MODIFIED_COUNT: {
495                         SAM_DELTA_MOD_COUNT *mc = &deltas[i].mod_count;
496
497                         printf("sam sequence update: 0x%04x\n", mc->seqnum);
498                         break;
499                 }                                  
500                 default:
501                         printf("unknown delta type 0x%02x\n", 
502                                   hdr_deltas[i].type);
503                         break;
504                 }
505         }
506 }
507
508 /* Perform sam synchronisation */
509
510 static NTSTATUS cmd_netlogon_sam_sync(struct rpc_pipe_client *cli, 
511                                       TALLOC_CTX *mem_ctx, int argc,
512                                       const char **argv)
513 {
514         NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
515         uint32 database_id = 0, num_deltas;
516         SAM_DELTA_HDR *hdr_deltas;
517         SAM_DELTA_CTR *deltas;
518
519         if (argc > 2) {
520                 fprintf(stderr, "Usage: %s [database_id]\n", argv[0]);
521                 return NT_STATUS_OK;
522         }
523
524         if (argc == 2)
525                 database_id = atoi(argv[1]);
526
527         /* Synchronise sam database */
528
529         result = rpccli_netlogon_sam_sync(cli, mem_ctx, database_id,
530                                        0, &num_deltas, &hdr_deltas, &deltas);
531
532         if (!NT_STATUS_IS_OK(result))
533                 goto done;
534
535         /* Display results */
536
537         display_sam_sync(num_deltas, hdr_deltas, deltas);
538
539  done:
540         return result;
541 }
542
543 /* Perform sam delta synchronisation */
544
545 static NTSTATUS cmd_netlogon_sam_deltas(struct rpc_pipe_client *cli, 
546                                         TALLOC_CTX *mem_ctx, int argc,
547                                         const char **argv)
548 {
549         NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
550         uint32 database_id, num_deltas, tmp;
551         SAM_DELTA_HDR *hdr_deltas;
552         SAM_DELTA_CTR *deltas;
553         uint64 seqnum;
554
555         if (argc != 3) {
556                 fprintf(stderr, "Usage: %s database_id seqnum\n", argv[0]);
557                 return NT_STATUS_OK;
558         }
559
560         database_id = atoi(argv[1]);
561         tmp = atoi(argv[2]);
562
563         seqnum = tmp & 0xffff;
564
565         result = rpccli_netlogon_sam_deltas(cli, mem_ctx, database_id,
566                                          seqnum, &num_deltas, 
567                                          &hdr_deltas, &deltas);
568
569         if (!NT_STATUS_IS_OK(result))
570                 goto done;
571
572         /* Display results */
573
574         display_sam_sync(num_deltas, hdr_deltas, deltas);
575         
576  done:
577         return result;
578 }
579
580 /* Log on a domain user */
581
582 static NTSTATUS cmd_netlogon_sam_logon(struct rpc_pipe_client *cli, 
583                                        TALLOC_CTX *mem_ctx, int argc,
584                                        const char **argv)
585 {
586         NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
587         int logon_type = NET_LOGON_TYPE;
588         const char *username, *password;
589         int auth_level = 2;
590         uint32 logon_param = 0;
591         const char *workstation = NULL;
592
593         /* Check arguments */
594
595         if (argc < 3 || argc > 7) {
596                 fprintf(stderr, "Usage: samlogon <username> <password> [workstation]"
597                         "[logon_type (1 or 2)] [auth level (2 or 3)] [logon_parameter]\n");
598                 return NT_STATUS_OK;
599         }
600
601         username = argv[1];
602         password = argv[2];
603
604         if (argc >= 4) 
605                 workstation = argv[3];
606
607         if (argc >= 5)
608                 sscanf(argv[4], "%i", &logon_type);
609
610         if (argc >= 6)
611                 sscanf(argv[5], "%i", &auth_level);
612
613         if (argc == 7)
614                 sscanf(argv[6], "%x", &logon_param);
615
616         /* Perform the sam logon */
617
618         result = rpccli_netlogon_sam_logon(cli, mem_ctx, logon_param, lp_workgroup(), username, password, workstation, logon_type);
619
620         if (!NT_STATUS_IS_OK(result))
621                 goto done;
622
623  done:
624         return result;
625 }
626
627 /* Change the trust account password */
628
629 static NTSTATUS cmd_netlogon_change_trust_pw(struct rpc_pipe_client *cli, 
630                                              TALLOC_CTX *mem_ctx, int argc,
631                                              const char **argv)
632 {
633         NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
634
635         /* Check arguments */
636
637         if (argc > 1) {
638                 fprintf(stderr, "Usage: change_trust_pw");
639                 return NT_STATUS_OK;
640         }
641
642         /* Perform the sam logon */
643
644         result = trust_pw_find_change_and_store_it(cli, mem_ctx,
645                                                    lp_workgroup());
646
647         if (!NT_STATUS_IS_OK(result))
648                 goto done;
649
650  done:
651         return result;
652 }
653
654 static WERROR cmd_netlogon_gettrustrid(struct rpc_pipe_client *cli,
655                                        TALLOC_CTX *mem_ctx, int argc,
656                                        const char **argv)
657 {
658         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
659         WERROR werr = WERR_GENERAL_FAILURE;
660         const char *server_name = cli->cli->desthost;
661         const char *domain_name = lp_workgroup();
662         uint32_t rid = 0;
663
664         if (argc < 1 || argc > 3) {
665                 fprintf(stderr, "Usage: %s <server_name> <domain_name>\n",
666                         argv[0]);
667                 return WERR_OK;
668         }
669
670         if (argc >= 2) {
671                 server_name = argv[1];
672         }
673
674         if (argc >= 3) {
675                 domain_name = argv[2];
676         }
677
678         status = rpccli_netr_LogonGetTrustRid(cli, mem_ctx,
679                                               server_name,
680                                               domain_name,
681                                               &rid,
682                                               &werr);
683         if (!NT_STATUS_IS_OK(status)) {
684                 goto done;
685         }
686
687         if (W_ERROR_IS_OK(werr)) {
688                 printf("Rid: %d\n", rid);
689         }
690  done:
691         return werr;
692 }
693
694 static WERROR cmd_netlogon_dsr_enumtrustdom(struct rpc_pipe_client *cli,
695                                             TALLOC_CTX *mem_ctx, int argc,
696                                             const char **argv)
697 {
698         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
699         WERROR werr = WERR_GENERAL_FAILURE;
700         const char *server_name = cli->cli->desthost;
701         uint32_t trust_flags = NETR_TRUST_FLAG_IN_FOREST;
702         struct netr_DomainTrustList trusts;
703
704         if (argc < 1 || argc > 3) {
705                 fprintf(stderr, "Usage: %s <server_name> <trust_flags>\n",
706                         argv[0]);
707                 return WERR_OK;
708         }
709
710         if (argc >= 2) {
711                 server_name = argv[1];
712         }
713
714         if (argc >= 3) {
715                 sscanf(argv[2], "%x", &trust_flags);
716         }
717
718         status = rpccli_netr_DsrEnumerateDomainTrusts(cli, mem_ctx,
719                                                       server_name,
720                                                       trust_flags,
721                                                       &trusts,
722                                                       &werr);
723         if (!NT_STATUS_IS_OK(status)) {
724                 goto done;
725         }
726
727         if (W_ERROR_IS_OK(werr)) {
728                 int i;
729
730                 printf("%d domains returned\n", trusts.count);
731
732                 for (i=0; i<trusts.count; i++ ) {
733                         printf("%s (%s)\n",
734                                 trusts.array[i].dns_name,
735                                 trusts.array[i].netbios_name);
736                 }
737         }
738  done:
739         return werr;
740 }
741
742 static WERROR cmd_netlogon_deregisterdnsrecords(struct rpc_pipe_client *cli,
743                                                 TALLOC_CTX *mem_ctx, int argc,
744                                                 const char **argv)
745 {
746         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
747         WERROR werr = WERR_GENERAL_FAILURE;
748         const char *server_name = cli->cli->desthost;
749         const char *domain = lp_workgroup();
750         const char *dns_host = NULL;
751
752         if (argc < 1 || argc > 4) {
753                 fprintf(stderr, "Usage: %s <server_name> <domain_name> "
754                         "<dns_host>\n", argv[0]);
755                 return WERR_OK;
756         }
757
758         if (argc >= 2) {
759                 server_name = argv[1];
760         }
761
762         if (argc >= 3) {
763                 domain = argv[2];
764         }
765
766         if (argc >= 4) {
767                 dns_host = argv[3];
768         }
769
770         status = rpccli_netr_DsrDeregisterDNSHostRecords(cli, mem_ctx,
771                                                          server_name,
772                                                          domain,
773                                                          NULL,
774                                                          NULL,
775                                                          dns_host,
776                                                          &werr);
777         if (!NT_STATUS_IS_OK(status)) {
778                 goto done;
779         }
780
781         if (W_ERROR_IS_OK(werr)) {
782                 printf("success\n");
783         }
784  done:
785         return werr;
786 }
787
788 static WERROR cmd_netlogon_dsr_getforesttrustinfo(struct rpc_pipe_client *cli,
789                                                   TALLOC_CTX *mem_ctx, int argc,
790                                                   const char **argv)
791 {
792         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
793         WERROR werr = WERR_GENERAL_FAILURE;
794         const char *server_name = cli->cli->desthost;
795         const char *trusted_domain_name = NULL;
796         struct lsa_ForestTrustInformation *info = NULL;
797         uint32_t flags = 0;
798
799         if (argc < 1 || argc > 4) {
800                 fprintf(stderr, "Usage: %s <server_name> <trusted_domain_name> "
801                         "<flags>\n", argv[0]);
802                 return WERR_OK;
803         }
804
805         if (argc >= 2) {
806                 server_name = argv[1];
807         }
808
809         if (argc >= 3) {
810                 trusted_domain_name = argv[2];
811         }
812
813         if (argc >= 4) {
814                 sscanf(argv[3], "%x", &flags);
815         }
816
817         status = rpccli_netr_DsRGetForestTrustInformation(cli, mem_ctx,
818                                                          server_name,
819                                                          trusted_domain_name,
820                                                          flags,
821                                                          &info,
822                                                          &werr);
823         if (!NT_STATUS_IS_OK(status)) {
824                 goto done;
825         }
826
827         if (W_ERROR_IS_OK(werr)) {
828                 printf("success\n");
829         }
830  done:
831         return werr;
832 }
833
834 static WERROR cmd_netlogon_enumtrusteddomains(struct rpc_pipe_client *cli,
835                                               TALLOC_CTX *mem_ctx, int argc,
836                                               const char **argv)
837 {
838         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
839         WERROR werr = WERR_GENERAL_FAILURE;
840         const char *server_name = cli->cli->desthost;
841         struct netr_Blob blob;
842
843
844         if (argc < 1 || argc > 3) {
845                 fprintf(stderr, "Usage: %s <server_name>\n", argv[0]);
846                 return WERR_OK;
847         }
848
849         if (argc >= 2) {
850                 server_name = argv[1];
851         }
852
853         status = rpccli_netr_NetrEnumerateTrustedDomains(cli, mem_ctx,
854                                                          server_name,
855                                                          &blob,
856                                                          &werr);
857         if (!NT_STATUS_IS_OK(status)) {
858                 goto done;
859         }
860
861         if (W_ERROR_IS_OK(werr)) {
862                 printf("success\n");
863                 dump_data(1, blob.data, blob.length);
864         }
865  done:
866         return werr;
867 }
868
869 static WERROR cmd_netlogon_enumtrusteddomainsex(struct rpc_pipe_client *cli,
870                                                 TALLOC_CTX *mem_ctx, int argc,
871                                                 const char **argv)
872 {
873         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
874         WERROR werr = WERR_GENERAL_FAILURE;
875         const char *server_name = cli->cli->desthost;
876         struct netr_DomainTrustList list;
877
878         if (argc < 1 || argc > 3) {
879                 fprintf(stderr, "Usage: %s <server_name>\n", argv[0]);
880                 return WERR_OK;
881         }
882
883         if (argc >= 2) {
884                 server_name = argv[1];
885         }
886
887         status = rpccli_netr_NetrEnumerateTrustedDomainsEx(cli, mem_ctx,
888                                                            server_name,
889                                                            &list,
890                                                            &werr);
891         if (!NT_STATUS_IS_OK(status)) {
892                 goto done;
893         }
894
895         if (W_ERROR_IS_OK(werr)) {
896                 printf("success\n");
897         }
898  done:
899         return werr;
900 }
901
902
903 /* List of commands exported by this module */
904
905 struct cmd_set netlogon_commands[] = {
906
907         { "NETLOGON" },
908
909         { "logonctrl2", RPC_RTYPE_WERROR, NULL, cmd_netlogon_logon_ctrl2, PI_NETLOGON, NULL, "Logon Control 2",     "" },
910         { "getanydcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_getanydcname, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
911         { "getdcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_getdcname, PI_NETLOGON, NULL, "Get trusted PDC name",     "" },
912         { "dsr_getdcname", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcname, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
913         { "dsr_getdcnameex", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcnameex, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
914         { "dsr_getdcnameex2", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getdcnameex2, PI_NETLOGON, NULL, "Get trusted DC name",     "" },
915         { "dsr_getsitename", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getsitename, PI_NETLOGON, NULL, "Get sitename",     "" },
916         { "dsr_getforesttrustinfo", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_getforesttrustinfo, PI_NETLOGON, NULL, "Get Forest Trust Info",     "" },
917         { "logonctrl",  RPC_RTYPE_WERROR, NULL, cmd_netlogon_logon_ctrl, PI_NETLOGON, NULL, "Logon Control",       "" },
918         { "samsync",    RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_sync,    NULL, PI_NETLOGON, NULL, "Sam Synchronisation", "" },
919         { "samdeltas",  RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_deltas,  NULL, PI_NETLOGON, NULL, "Query Sam Deltas",    "" },
920         { "samlogon",   RPC_RTYPE_NTSTATUS, cmd_netlogon_sam_logon,   NULL, PI_NETLOGON, NULL, "Sam Logon",           "" },
921         { "change_trust_pw",   RPC_RTYPE_NTSTATUS, cmd_netlogon_change_trust_pw,   NULL, PI_NETLOGON, NULL, "Change Trust Account Password",           "" },
922         { "gettrustrid", RPC_RTYPE_WERROR, NULL, cmd_netlogon_gettrustrid, PI_NETLOGON, NULL, "Get trust rid",     "" },
923         { "dsr_enumtrustdom", RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_enumtrustdom, PI_NETLOGON, NULL, "Enumerate trusted domains",     "" },
924         { "dsenumdomtrusts",  RPC_RTYPE_WERROR, NULL, cmd_netlogon_dsr_enumtrustdom, PI_NETLOGON, NULL, "Enumerate all trusted domains in an AD forest",     "" },
925         { "deregisterdnsrecords", RPC_RTYPE_WERROR, NULL, cmd_netlogon_deregisterdnsrecords, PI_NETLOGON, NULL, "Deregister DNS records",     "" },
926         { "netrenumtrusteddomains", RPC_RTYPE_WERROR, NULL, cmd_netlogon_enumtrusteddomains, PI_NETLOGON, NULL, "Enumerate trusted domains",     "" },
927         { "netrenumtrusteddomainsex", RPC_RTYPE_WERROR, NULL, cmd_netlogon_enumtrusteddomainsex, PI_NETLOGON, NULL, "Enumerate trusted domains",     "" },
928
929         { NULL }
930 };