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