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