503e0fba76a56d535dcff6ab96c1593bdaecbb52
[obnox/samba/samba-obnox.git] / source3 / rpcclient / cmd_lsarpc.c
1 /*
2    Unix SMB/CIFS implementation.
3    RPC pipe client
4
5    Copyright (C) Tim Potter              2000
6    Copyright (C) Rafal Szczesniak        2002
7    Copyright (C) Guenther Deschner       2008
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 */
22
23 #include "includes.h"
24 #include "rpcclient.h"
25 #include "../libcli/auth/libcli_auth.h"
26 #include "../librpc/gen_ndr/ndr_lsa.h"
27 #include "../librpc/gen_ndr/ndr_lsa_c.h"
28 #include "rpc_client/cli_lsarpc.h"
29 #include "rpc_client/init_lsa.h"
30 #include "../libcli/security/security.h"
31
32 /* useful function to allow entering a name instead of a SID and
33  * looking it up automatically */
34 static NTSTATUS name_to_sid(struct rpc_pipe_client *cli, 
35                             TALLOC_CTX *mem_ctx,
36                             struct dom_sid *sid, const char *name)
37 {
38         struct policy_handle pol;
39         enum lsa_SidType *sid_types;
40         NTSTATUS status, result;
41         struct dom_sid *sids;
42         struct dcerpc_binding_handle *b = cli->binding_handle;
43
44         /* maybe its a raw SID */
45         if (strncmp(name, "S-", 2) == 0 &&
46             string_to_sid(sid, name)) {
47                 return NT_STATUS_OK;
48         }
49
50         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
51                                      SEC_FLAG_MAXIMUM_ALLOWED,
52                                      &pol);
53         if (!NT_STATUS_IS_OK(status))
54                 goto done;
55
56         status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, 1, &name, NULL, 1, &sids, &sid_types);
57         if (!NT_STATUS_IS_OK(status))
58                 goto done;
59
60         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
61
62         *sid = sids[0];
63
64 done:
65         return status;
66 }
67
68 static void display_query_info_1(struct lsa_AuditLogInfo *r)
69 {
70         d_printf("percent_full:\t%d\n", r->percent_full);
71         d_printf("maximum_log_size:\t%d\n", r->maximum_log_size);
72         d_printf("retention_time:\t%lld\n", (long long)r->retention_time);
73         d_printf("shutdown_in_progress:\t%d\n", r->shutdown_in_progress);
74         d_printf("time_to_shutdown:\t%lld\n", (long long)r->time_to_shutdown);
75         d_printf("next_audit_record:\t%d\n", r->next_audit_record);
76 }
77
78 static void display_query_info_2(struct lsa_AuditEventsInfo *r)
79 {
80         int i;
81         d_printf("Auditing enabled:\t%d\n", r->auditing_mode);
82         d_printf("Auditing categories:\t%d\n", r->count);
83         d_printf("Auditsettings:\n");
84         for (i=0; i<r->count; i++) {
85                 const char *val = audit_policy_str(talloc_tos(), r->settings[i]);
86                 const char *policy = audit_description_str(i);
87                 d_printf("%s:\t%s\n", policy, val);
88         }
89 }
90
91 static void display_query_info_3(struct lsa_DomainInfo *r)
92 {
93         d_printf("Domain Name: %s\n", r->name.string);
94         d_printf("Domain Sid: %s\n", sid_string_tos(r->sid));
95 }
96
97 static void display_query_info_5(struct lsa_DomainInfo *r)
98 {
99         d_printf("Domain Name: %s\n", r->name.string);
100         d_printf("Domain Sid: %s\n", sid_string_tos(r->sid));
101 }
102
103 static void display_query_info_10(struct lsa_AuditFullSetInfo *r)
104 {
105         d_printf("Shutdown on full: %d\n", r->shutdown_on_full);
106 }
107
108 static void display_query_info_11(struct lsa_AuditFullQueryInfo *r)
109 {
110         d_printf("Shutdown on full: %d\n", r->shutdown_on_full);
111         d_printf("Log is full: %d\n", r->log_is_full);
112 }
113
114 static void display_query_info_12(struct lsa_DnsDomainInfo *r)
115 {
116         d_printf("Domain NetBios Name: %s\n", r->name.string);
117         d_printf("Domain DNS Name: %s\n", r->dns_domain.string);
118         d_printf("Domain Forest Name: %s\n", r->dns_forest.string);
119         d_printf("Domain Sid: %s\n", sid_string_tos(r->sid));
120         d_printf("Domain GUID: %s\n", GUID_string(talloc_tos(),
121                                                       &r->domain_guid));
122 }
123
124 static void display_lsa_query_info(union lsa_PolicyInformation *info,
125                                    enum lsa_PolicyInfo level)
126 {
127         switch (level) {
128                 case 1:
129                         display_query_info_1(&info->audit_log);
130                         break;
131                 case 2:
132                         display_query_info_2(&info->audit_events);
133                         break;
134                 case 3:
135                         display_query_info_3(&info->domain);
136                         break;
137                 case 5:
138                         display_query_info_5(&info->account_domain);
139                         break;
140                 case 10:
141                         display_query_info_10(&info->auditfullset);
142                         break;
143                 case 11:
144                         display_query_info_11(&info->auditfullquery);
145                         break;
146                 case 12:
147                         display_query_info_12(&info->dns);
148                         break;
149                 default:
150                         printf("can't display info level: %d\n", level);
151                         break;
152         }
153 }
154
155 static NTSTATUS cmd_lsa_query_info_policy(struct rpc_pipe_client *cli, 
156                                           TALLOC_CTX *mem_ctx, int argc, 
157                                           const char **argv) 
158 {
159         struct policy_handle pol;
160         NTSTATUS status, result;
161         union lsa_PolicyInformation *info = NULL;
162         struct dcerpc_binding_handle *b = cli->binding_handle;
163
164         uint32 info_class = 3;
165
166         if (argc > 2) {
167                 printf("Usage: %s [info_class]\n", argv[0]);
168                 return NT_STATUS_OK;
169         }
170
171         if (argc == 2)
172                 info_class = atoi(argv[1]);
173
174         switch (info_class) {
175         case 12:
176                 status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
177                                                  SEC_FLAG_MAXIMUM_ALLOWED,
178                                                  &pol);
179
180                 if (!NT_STATUS_IS_OK(status))
181                         goto done;
182
183                 status = dcerpc_lsa_QueryInfoPolicy2(b, mem_ctx,
184                                                      &pol,
185                                                      info_class,
186                                                      &info,
187                                                      &result);
188                 break;
189         default:
190                 status = rpccli_lsa_open_policy(cli, mem_ctx, True,
191                                                 SEC_FLAG_MAXIMUM_ALLOWED,
192                                                 &pol);
193
194                 if (!NT_STATUS_IS_OK(status))
195                         goto done;
196
197                 status = dcerpc_lsa_QueryInfoPolicy(b, mem_ctx,
198                                                     &pol,
199                                                     info_class,
200                                                     &info,
201                                                     &result);
202         }
203
204         if (!NT_STATUS_IS_OK(status)) {
205                 goto done;
206         }
207         status = result;
208         if (NT_STATUS_IS_OK(result)) {
209                 display_lsa_query_info(info, info_class);
210         }
211
212         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
213
214  done:
215         return status;
216 }
217
218 /* Resolve a list of names to a list of sids */
219
220 static NTSTATUS cmd_lsa_lookup_names(struct rpc_pipe_client *cli, 
221                                      TALLOC_CTX *mem_ctx, int argc, 
222                                      const char **argv)
223 {
224         struct policy_handle pol;
225         NTSTATUS status, result;
226         struct dom_sid *sids;
227         enum lsa_SidType *types;
228         int i;
229         struct dcerpc_binding_handle *b = cli->binding_handle;
230
231         if (argc == 1) {
232                 printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);
233                 return NT_STATUS_OK;
234         }
235
236         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
237                                      SEC_FLAG_MAXIMUM_ALLOWED,
238                                      &pol);
239
240         if (!NT_STATUS_IS_OK(status))
241                 goto done;
242
243         status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, argc - 1,
244                                       (const char**)(argv + 1), NULL, 1, &sids, &types);
245
246         if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
247             NT_STATUS_V(STATUS_SOME_UNMAPPED))
248                 goto done;
249
250         status = NT_STATUS_OK;
251
252         /* Print results */
253
254         for (i = 0; i < (argc - 1); i++) {
255                 fstring sid_str;
256                 sid_to_fstring(sid_str, &sids[i]);
257                 printf("%s %s (%s: %d)\n", argv[i + 1], sid_str,
258                        sid_type_lookup(types[i]), types[i]);
259         }
260
261         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
262
263  done:
264         return status;
265 }
266
267 /* Resolve a list of names to a list of sids */
268
269 static NTSTATUS cmd_lsa_lookup_names_level(struct rpc_pipe_client *cli, 
270                                            TALLOC_CTX *mem_ctx, int argc, 
271                                            const char **argv)
272 {
273         struct policy_handle pol;
274         NTSTATUS status, result;
275         struct dom_sid *sids;
276         enum lsa_SidType *types;
277         int i, level;
278         struct dcerpc_binding_handle *b = cli->binding_handle;
279
280         if (argc < 3) {
281                 printf("Usage: %s [level] [name1 [name2 [...]]]\n", argv[0]);
282                 return NT_STATUS_OK;
283         }
284
285         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
286                                      SEC_FLAG_MAXIMUM_ALLOWED,
287                                      &pol);
288
289         if (!NT_STATUS_IS_OK(status))
290                 goto done;
291
292         level = atoi(argv[1]);
293
294         status = rpccli_lsa_lookup_names(cli, mem_ctx, &pol, argc - 2,
295                                       (const char**)(argv + 2), NULL, level, &sids, &types);
296
297         if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
298             NT_STATUS_V(STATUS_SOME_UNMAPPED))
299                 goto done;
300
301         status = NT_STATUS_OK;
302
303         /* Print results */
304
305         for (i = 0; i < (argc - 2); i++) {
306                 fstring sid_str;
307                 sid_to_fstring(sid_str, &sids[i]);
308                 printf("%s %s (%s: %d)\n", argv[i + 2], sid_str,
309                        sid_type_lookup(types[i]), types[i]);
310         }
311
312         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
313
314  done:
315         return status;
316 }
317
318 static NTSTATUS cmd_lsa_lookup_names4(struct rpc_pipe_client *cli,
319                                       TALLOC_CTX *mem_ctx, int argc,
320                                       const char **argv)
321 {
322         NTSTATUS status, result;
323
324         uint32_t num_names;
325         struct lsa_String *names;
326         struct lsa_RefDomainList *domains;
327         struct lsa_TransSidArray3 sids;
328         uint32_t count = 0;
329         int i;
330         struct dcerpc_binding_handle *b = cli->binding_handle;
331
332         if (argc == 1) {
333                 printf("Usage: %s [name1 [name2 [...]]]\n", argv[0]);
334                 return NT_STATUS_OK;
335         }
336
337         ZERO_STRUCT(sids);
338
339         num_names = argc-1;
340         names = talloc_array(mem_ctx, struct lsa_String, num_names);
341         NT_STATUS_HAVE_NO_MEMORY(names);
342
343         for (i=0; i < num_names; i++) {
344                 init_lsa_String(&names[i], argv[i+1]);
345         }
346
347         status = dcerpc_lsa_LookupNames4(b, mem_ctx,
348                                          num_names,
349                                          names,
350                                          &domains,
351                                          &sids,
352                                          1,
353                                          &count,
354                                          0,
355                                          0,
356                                          &result);
357         if (!NT_STATUS_IS_OK(status)) {
358                 return status;
359         }
360         if (!NT_STATUS_IS_OK(result)) {
361                 return result;
362         }
363
364         for (i = 0; i < sids.count; i++) {
365                 fstring sid_str;
366                 sid_to_fstring(sid_str, sids.sids[i].sid);
367                 printf("%s %s (%s: %d)\n", argv[i+1], sid_str,
368                        sid_type_lookup(sids.sids[i].sid_type),
369                        sids.sids[i].sid_type);
370         }
371
372         return status;
373 }
374
375 /* Resolve a list of SIDs to a list of names */
376
377 static NTSTATUS cmd_lsa_lookup_sids(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
378                                     int argc, const char **argv)
379 {
380         struct policy_handle pol;
381         NTSTATUS status, result;
382         struct dom_sid *sids;
383         char **domains;
384         char **names;
385         enum lsa_SidType *types;
386         int i;
387         struct dcerpc_binding_handle *b = cli->binding_handle;
388
389         if (argc == 1) {
390                 printf("Usage: %s [sid1 [sid2 [...]]]\n", argv[0]);
391                 return NT_STATUS_OK;
392         }
393
394         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
395                                      SEC_FLAG_MAXIMUM_ALLOWED,
396                                      &pol);
397
398         if (!NT_STATUS_IS_OK(status))
399                 goto done;
400
401         /* Convert arguments to sids */
402
403         sids = talloc_array(mem_ctx, struct dom_sid, argc - 1);
404
405         if (!sids) {
406                 printf("could not allocate memory for %d sids\n", argc - 1);
407                 goto done;
408         }
409
410         for (i = 0; i < argc - 1; i++) 
411                 if (!string_to_sid(&sids[i], argv[i + 1])) {
412                         status = NT_STATUS_INVALID_SID;
413                         goto done;
414                 }
415
416         /* Lookup the SIDs */
417
418         status = rpccli_lsa_lookup_sids(cli, mem_ctx, &pol, argc - 1, sids,
419                                      &domains, &names, &types);
420
421         if (!NT_STATUS_IS_OK(status) && NT_STATUS_V(status) !=
422             NT_STATUS_V(STATUS_SOME_UNMAPPED))
423                 goto done;
424
425         status = NT_STATUS_OK;
426
427         /* Print results */
428
429         for (i = 0; i < (argc - 1); i++) {
430                 fstring sid_str;
431
432                 sid_to_fstring(sid_str, &sids[i]);
433                 if (types[i] == SID_NAME_DOMAIN) {
434                         printf("%s %s (%d)\n", sid_str,
435                                domains[i] ? domains[i] : "*unknown*",
436                                types[i]);
437                 } else {
438                         printf("%s %s\\%s (%d)\n", sid_str,
439                                domains[i] ? domains[i] : "*unknown*",
440                                names[i] ? names[i] : "*unknown*",
441                                types[i]);
442                 }
443         }
444
445         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
446
447  done:
448         return status;
449 }
450
451 /* Resolve a list of SIDs to a list of names */
452
453 static NTSTATUS cmd_lsa_lookup_sids3(struct rpc_pipe_client *cli,
454                                      TALLOC_CTX *mem_ctx,
455                                      int argc, const char **argv)
456 {
457         NTSTATUS status = NT_STATUS_UNSUCCESSFUL, result;
458         int i;
459         struct lsa_SidArray sids;
460         struct lsa_RefDomainList *domains;
461         struct lsa_TransNameArray2 names;
462         uint32_t count = 0;
463         struct dcerpc_binding_handle *b = cli->binding_handle;
464
465         if (argc == 1) {
466                 printf("Usage: %s [sid1 [sid2 [...]]]\n", argv[0]);
467                 return NT_STATUS_OK;
468         }
469
470         ZERO_STRUCT(names);
471
472         /* Convert arguments to sids */
473
474         sids.num_sids = argc-1;
475         sids.sids = talloc_array(mem_ctx, struct lsa_SidPtr, sids.num_sids);
476         if (!sids.sids) {
477                 printf("could not allocate memory for %d sids\n", sids.num_sids);
478                 goto done;
479         }
480
481         for (i = 0; i < sids.num_sids; i++) {
482                 sids.sids[i].sid = talloc(sids.sids, struct dom_sid);
483                 if (sids.sids[i].sid == NULL) {
484                         status = NT_STATUS_NO_MEMORY;
485                         goto done;
486                 }
487                 if (!string_to_sid(sids.sids[i].sid, argv[i+1])) {
488                         status = NT_STATUS_INVALID_SID;
489                         goto done;
490                 }
491         }
492
493         /* Lookup the SIDs */
494         status = dcerpc_lsa_LookupSids3(b, mem_ctx,
495                                         &sids,
496                                         &domains,
497                                         &names,
498                                         1,
499                                         &count,
500                                         0,
501                                         0,
502                                         &result);
503         if (!NT_STATUS_IS_OK(status)) {
504                 goto done;
505         }
506         if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) !=
507             NT_STATUS_V(STATUS_SOME_UNMAPPED)) {
508                 status = result;
509                 goto done;
510         }
511
512         status = NT_STATUS_OK;
513
514         /* Print results */
515
516         for (i = 0; i < count; i++) {
517                 fstring sid_str;
518
519                 sid_to_fstring(sid_str, sids.sids[i].sid);
520                 printf("%s %s (%d)\n", sid_str,
521                        names.names[i].name.string,
522                        names.names[i].sid_type);
523         }
524
525  done:
526         return status;
527 }
528
529
530 /* Enumerate list of trusted domains */
531
532 static NTSTATUS cmd_lsa_enum_trust_dom(struct rpc_pipe_client *cli, 
533                                        TALLOC_CTX *mem_ctx, int argc, 
534                                        const char **argv)
535 {
536         struct policy_handle pol;
537         NTSTATUS status, result;
538         struct lsa_DomainList domain_list;
539         struct dcerpc_binding_handle *b = cli->binding_handle;
540
541         /* defaults, but may be changed using params */
542         uint32 enum_ctx = 0;
543         int i;
544         uint32_t max_size = (uint32_t)-1;
545
546         if (argc > 2) {
547                 printf("Usage: %s [enum context (0)]\n", argv[0]);
548                 return NT_STATUS_OK;
549         }
550
551         if (argc == 2 && argv[1]) {
552                 enum_ctx = atoi(argv[2]);
553         }       
554
555         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
556                                      LSA_POLICY_VIEW_LOCAL_INFORMATION,
557                                      &pol);
558
559         if (!NT_STATUS_IS_OK(status))
560                 goto done;
561
562         status = STATUS_MORE_ENTRIES;
563
564         while (NT_STATUS_EQUAL(status, STATUS_MORE_ENTRIES)) {
565
566                 /* Lookup list of trusted domains */
567
568                 status = dcerpc_lsa_EnumTrustDom(b, mem_ctx,
569                                                  &pol,
570                                                  &enum_ctx,
571                                                  &domain_list,
572                                                  max_size,
573                                                  &result);
574                 if (!NT_STATUS_IS_OK(status)) {
575                         goto done;
576                 }
577                 if (!NT_STATUS_IS_OK(result) &&
578                     !NT_STATUS_EQUAL(result, NT_STATUS_NO_MORE_ENTRIES) &&
579                     !NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)) {
580                         status = result;
581                         goto done;
582                 }
583
584                 /* Print results: list of names and sids returned in this
585                  * response. */  
586                 for (i = 0; i < domain_list.count; i++) {
587                         fstring sid_str;
588
589                         sid_to_fstring(sid_str, domain_list.domains[i].sid);
590                         printf("%s %s\n",
591                                 domain_list.domains[i].name.string ?
592                                 domain_list.domains[i].name.string : "*unknown*",
593                                 sid_str);
594                 }
595         }
596
597         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
598  done:
599         return status;
600 }
601
602 /* Enumerates privileges */
603
604 static NTSTATUS cmd_lsa_enum_privilege(struct rpc_pipe_client *cli, 
605                                        TALLOC_CTX *mem_ctx, int argc, 
606                                        const char **argv) 
607 {
608         struct policy_handle pol;
609         NTSTATUS status, result;
610         struct lsa_PrivArray priv_array;
611         struct dcerpc_binding_handle *b = cli->binding_handle;
612
613         uint32 enum_context=0;
614         uint32 pref_max_length=0x1000;
615         int i;
616
617         if (argc > 3) {
618                 printf("Usage: %s [enum context] [max length]\n", argv[0]);
619                 return NT_STATUS_OK;
620         }
621
622         if (argc>=2)
623                 enum_context=atoi(argv[1]);
624
625         if (argc==3)
626                 pref_max_length=atoi(argv[2]);
627
628         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
629                                      SEC_FLAG_MAXIMUM_ALLOWED,
630                                      &pol);
631
632         if (!NT_STATUS_IS_OK(status))
633                 goto done;
634
635         status = dcerpc_lsa_EnumPrivs(b, mem_ctx,
636                                       &pol,
637                                       &enum_context,
638                                       &priv_array,
639                                       pref_max_length,
640                                       &result);
641         if (!NT_STATUS_IS_OK(status))
642                 goto done;
643         if (!NT_STATUS_IS_OK(result)) {
644                 status = result;
645                 goto done;
646         }
647
648         /* Print results */
649         printf("found %d privileges\n\n", priv_array.count);
650
651         for (i = 0; i < priv_array.count; i++) {
652                 printf("%s \t\t%d:%d (0x%x:0x%x)\n",
653                        priv_array.privs[i].name.string ? priv_array.privs[i].name.string : "*unknown*",
654                        priv_array.privs[i].luid.high,
655                        priv_array.privs[i].luid.low,
656                        priv_array.privs[i].luid.high,
657                        priv_array.privs[i].luid.low);
658         }
659
660         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
661  done:
662         return status;
663 }
664
665 /* Get privilege name */
666
667 static NTSTATUS cmd_lsa_get_dispname(struct rpc_pipe_client *cli, 
668                                      TALLOC_CTX *mem_ctx, int argc, 
669                                      const char **argv) 
670 {
671         struct policy_handle pol;
672         NTSTATUS status, result;
673         struct dcerpc_binding_handle *b = cli->binding_handle;
674
675         uint16 lang_id=0;
676         uint16 lang_id_sys=0;
677         uint16 lang_id_desc;
678         struct lsa_String lsa_name;
679         struct lsa_StringLarge *description = NULL;
680
681         if (argc != 2) {
682                 printf("Usage: %s privilege name\n", argv[0]);
683                 return NT_STATUS_OK;
684         }
685
686         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
687                                      SEC_FLAG_MAXIMUM_ALLOWED,
688                                      &pol);
689
690         if (!NT_STATUS_IS_OK(status))
691                 goto done;
692
693         init_lsa_String(&lsa_name, argv[1]);
694
695         status = dcerpc_lsa_LookupPrivDisplayName(b, mem_ctx,
696                                                   &pol,
697                                                   &lsa_name,
698                                                   lang_id,
699                                                   lang_id_sys,
700                                                   &description,
701                                                   &lang_id_desc,
702                                                   &result);
703         if (!NT_STATUS_IS_OK(status))
704                 goto done;
705         if (!NT_STATUS_IS_OK(result)) {
706                 status = result;
707                 goto done;
708         }
709
710         /* Print results */
711         printf("%s -> %s (language: 0x%x)\n", argv[1], description->string, lang_id_desc);
712
713         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
714  done:
715         return status;
716 }
717
718 /* Enumerate the LSA SIDS */
719
720 static NTSTATUS cmd_lsa_enum_sids(struct rpc_pipe_client *cli, 
721                                   TALLOC_CTX *mem_ctx, int argc, 
722                                   const char **argv) 
723 {
724         struct policy_handle pol;
725         NTSTATUS status, result;
726         struct dcerpc_binding_handle *b = cli->binding_handle;
727
728         uint32 enum_context=0;
729         uint32 pref_max_length=0x1000;
730         struct lsa_SidArray sid_array;
731         int i;
732
733         if (argc > 3) {
734                 printf("Usage: %s [enum context] [max length]\n", argv[0]);
735                 return NT_STATUS_OK;
736         }
737
738         if (argc>=2)
739                 enum_context=atoi(argv[1]);
740
741         if (argc==3)
742                 pref_max_length=atoi(argv[2]);
743
744         status = rpccli_lsa_open_policy(cli, mem_ctx, True,
745                                      SEC_FLAG_MAXIMUM_ALLOWED,
746                                      &pol);
747
748         if (!NT_STATUS_IS_OK(status))
749                 goto done;
750
751         status = dcerpc_lsa_EnumAccounts(b, mem_ctx,
752                                          &pol,
753                                          &enum_context,
754                                          &sid_array,
755                                          pref_max_length,
756                                          &result);
757         if (!NT_STATUS_IS_OK(status))
758                 goto done;
759         if (!NT_STATUS_IS_OK(result)) {
760                 status = result;
761                 goto done;
762         }
763
764         /* Print results */
765         printf("found %d SIDs\n\n", sid_array.num_sids);
766
767         for (i = 0; i < sid_array.num_sids; i++) {
768                 fstring sid_str;
769
770                 sid_to_fstring(sid_str, sid_array.sids[i].sid);
771                 printf("%s\n", sid_str);
772         }
773
774         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
775  done:
776         return status;
777 }
778
779 /* Create a new account */
780
781 static NTSTATUS cmd_lsa_create_account(struct rpc_pipe_client *cli, 
782                                            TALLOC_CTX *mem_ctx, int argc, 
783                                            const char **argv) 
784 {
785         struct policy_handle dom_pol;
786         struct policy_handle user_pol;
787         NTSTATUS status, result;
788         uint32 des_access = 0x000f000f;
789         struct dcerpc_binding_handle *b = cli->binding_handle;
790
791         struct dom_sid sid;
792
793         if (argc != 2 ) {
794                 printf("Usage: %s SID\n", argv[0]);
795                 return NT_STATUS_OK;
796         }
797
798         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
799         if (!NT_STATUS_IS_OK(status))
800                 goto done;      
801
802         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
803                                      SEC_FLAG_MAXIMUM_ALLOWED,
804                                      &dom_pol);
805
806         if (!NT_STATUS_IS_OK(status))
807                 goto done;
808
809         status = dcerpc_lsa_CreateAccount(b, mem_ctx,
810                                           &dom_pol,
811                                           &sid,
812                                           des_access,
813                                           &user_pol,
814                                           &result);
815         if (!NT_STATUS_IS_OK(status))
816                 goto done;
817         if (!NT_STATUS_IS_OK(result)) {
818                 status = result;
819                 goto done;
820         }
821
822         printf("Account for SID %s successfully created\n\n", argv[1]);
823         status = NT_STATUS_OK;
824
825         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
826  done:
827         return status;
828 }
829
830
831 /* Enumerate the privileges of an SID */
832
833 static NTSTATUS cmd_lsa_enum_privsaccounts(struct rpc_pipe_client *cli, 
834                                            TALLOC_CTX *mem_ctx, int argc, 
835                                            const char **argv) 
836 {
837         struct policy_handle dom_pol;
838         struct policy_handle user_pol;
839         NTSTATUS status, result;
840         uint32 access_desired = 0x000f000f;
841         struct dom_sid sid;
842         struct lsa_PrivilegeSet *privs = NULL;
843         int i;
844         struct dcerpc_binding_handle *b = cli->binding_handle;
845
846         if (argc != 2 ) {
847                 printf("Usage: %s SID\n", argv[0]);
848                 return NT_STATUS_OK;
849         }
850
851         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
852         if (!NT_STATUS_IS_OK(status))
853                 goto done;      
854
855         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
856                                      SEC_FLAG_MAXIMUM_ALLOWED,
857                                      &dom_pol);
858
859         if (!NT_STATUS_IS_OK(status))
860                 goto done;
861
862         status = dcerpc_lsa_OpenAccount(b, mem_ctx,
863                                         &dom_pol,
864                                         &sid,
865                                         access_desired,
866                                         &user_pol,
867                                         &result);
868         if (!NT_STATUS_IS_OK(status))
869                 goto done;
870         if (!NT_STATUS_IS_OK(result)) {
871                 status = result;
872                 goto done;
873         }
874
875         status = dcerpc_lsa_EnumPrivsAccount(b, mem_ctx,
876                                              &user_pol,
877                                              &privs,
878                                              &result);
879         if (!NT_STATUS_IS_OK(status))
880                 goto done;
881         if (!NT_STATUS_IS_OK(result)) {
882                 status = result;
883                 goto done;
884         }
885
886         /* Print results */
887         printf("found %d privileges for SID %s\n\n", privs->count, argv[1]);
888         printf("high\tlow\tattribute\n");
889
890         for (i = 0; i < privs->count; i++) {
891                 printf("%u\t%u\t%u\n",
892                         privs->set[i].luid.high,
893                         privs->set[i].luid.low,
894                         privs->set[i].attribute);
895         }
896
897         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
898  done:
899         return status;
900 }
901
902
903 /* Enumerate the privileges of an SID via LsaEnumerateAccountRights */
904
905 static NTSTATUS cmd_lsa_enum_acct_rights(struct rpc_pipe_client *cli, 
906                                          TALLOC_CTX *mem_ctx, int argc, 
907                                          const char **argv) 
908 {
909         struct policy_handle dom_pol;
910         NTSTATUS status, result;
911         struct dom_sid sid;
912         struct lsa_RightSet rights;
913         struct dcerpc_binding_handle *b = cli->binding_handle;
914
915         int i;
916
917         if (argc != 2 ) {
918                 printf("Usage: %s SID\n", argv[0]);
919                 return NT_STATUS_OK;
920         }
921
922         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
923         if (!NT_STATUS_IS_OK(status))
924                 goto done;      
925
926         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
927                                      SEC_FLAG_MAXIMUM_ALLOWED,
928                                      &dom_pol);
929
930         if (!NT_STATUS_IS_OK(status))
931                 goto done;
932
933         status = dcerpc_lsa_EnumAccountRights(b, mem_ctx,
934                                               &dom_pol,
935                                               &sid,
936                                               &rights,
937                                               &result);
938         if (!NT_STATUS_IS_OK(status))
939                 goto done;
940         if (!NT_STATUS_IS_OK(result)) {
941                 status = result;
942                 goto done;
943         }
944
945         printf("found %d privileges for SID %s\n", rights.count,
946                sid_string_tos(&sid));
947
948         for (i = 0; i < rights.count; i++) {
949                 printf("\t%s\n", rights.names[i].string);
950         }
951
952         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
953  done:
954         return status;
955 }
956
957
958 /* add some privileges to a SID via LsaAddAccountRights */
959
960 static NTSTATUS cmd_lsa_add_acct_rights(struct rpc_pipe_client *cli, 
961                                         TALLOC_CTX *mem_ctx, int argc, 
962                                         const char **argv) 
963 {
964         struct policy_handle dom_pol;
965         NTSTATUS status, result;
966         struct lsa_RightSet rights;
967         struct dom_sid sid;
968         int i;
969         struct dcerpc_binding_handle *b = cli->binding_handle;
970
971         if (argc < 3 ) {
972                 printf("Usage: %s SID [rights...]\n", argv[0]);
973                 return NT_STATUS_OK;
974         }
975
976         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
977         if (!NT_STATUS_IS_OK(status))
978                 goto done;      
979
980         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
981                                      SEC_FLAG_MAXIMUM_ALLOWED,
982                                      &dom_pol);
983
984         if (!NT_STATUS_IS_OK(status))
985                 goto done;
986
987         rights.count = argc-2;
988         rights.names = talloc_array(mem_ctx, struct lsa_StringLarge,
989                                     rights.count);
990         if (!rights.names) {
991                 return NT_STATUS_NO_MEMORY;
992         }
993
994         for (i=0; i<argc-2; i++) {
995                 init_lsa_StringLarge(&rights.names[i], argv[i+2]);
996         }
997
998         status = dcerpc_lsa_AddAccountRights(b, mem_ctx,
999                                              &dom_pol,
1000                                              &sid,
1001                                              &rights,
1002                                              &result);
1003         if (!NT_STATUS_IS_OK(status))
1004                 goto done;
1005         if (!NT_STATUS_IS_OK(result)) {
1006                 status = result;
1007                 goto done;
1008         }
1009
1010         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1011  done:
1012         return status;
1013 }
1014
1015
1016 /* remove some privileges to a SID via LsaRemoveAccountRights */
1017
1018 static NTSTATUS cmd_lsa_remove_acct_rights(struct rpc_pipe_client *cli, 
1019                                         TALLOC_CTX *mem_ctx, int argc, 
1020                                         const char **argv) 
1021 {
1022         struct policy_handle dom_pol;
1023         NTSTATUS status, result;
1024         struct lsa_RightSet rights;
1025         struct dom_sid sid;
1026         int i;
1027         struct dcerpc_binding_handle *b = cli->binding_handle;
1028
1029         if (argc < 3 ) {
1030                 printf("Usage: %s SID [rights...]\n", argv[0]);
1031                 return NT_STATUS_OK;
1032         }
1033
1034         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1035         if (!NT_STATUS_IS_OK(status))
1036                 goto done;      
1037
1038         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
1039                                      SEC_FLAG_MAXIMUM_ALLOWED,
1040                                      &dom_pol);
1041
1042         if (!NT_STATUS_IS_OK(status))
1043                 goto done;
1044
1045         rights.count = argc-2;
1046         rights.names = talloc_array(mem_ctx, struct lsa_StringLarge,
1047                                     rights.count);
1048         if (!rights.names) {
1049                 return NT_STATUS_NO_MEMORY;
1050         }
1051
1052         for (i=0; i<argc-2; i++) {
1053                 init_lsa_StringLarge(&rights.names[i], argv[i+2]);
1054         }
1055
1056         status = dcerpc_lsa_RemoveAccountRights(b, mem_ctx,
1057                                                 &dom_pol,
1058                                                 &sid,
1059                                                 false,
1060                                                 &rights,
1061                                                 &result);
1062         if (!NT_STATUS_IS_OK(status))
1063                 goto done;
1064         if (!NT_STATUS_IS_OK(result)) {
1065                 status = result;
1066                 goto done;
1067         }
1068
1069         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1070
1071  done:
1072         return status;
1073 }
1074
1075
1076 /* Get a privilege value given its name */
1077
1078 static NTSTATUS cmd_lsa_lookup_priv_value(struct rpc_pipe_client *cli, 
1079                                         TALLOC_CTX *mem_ctx, int argc, 
1080                                         const char **argv) 
1081 {
1082         struct policy_handle pol;
1083         NTSTATUS status, result;
1084         struct lsa_LUID luid;
1085         struct lsa_String name;
1086         struct dcerpc_binding_handle *b = cli->binding_handle;
1087
1088         if (argc != 2 ) {
1089                 printf("Usage: %s name\n", argv[0]);
1090                 return NT_STATUS_OK;
1091         }
1092
1093         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
1094                                      SEC_FLAG_MAXIMUM_ALLOWED,
1095                                      &pol);
1096
1097         if (!NT_STATUS_IS_OK(status))
1098                 goto done;
1099
1100         init_lsa_String(&name, argv[1]);
1101
1102         status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1103                                             &pol,
1104                                             &name,
1105                                             &luid,
1106                                             &result);
1107         if (!NT_STATUS_IS_OK(status))
1108                 goto done;
1109         if (!NT_STATUS_IS_OK(result)) {
1110                 status = result;
1111                 goto done;
1112         }
1113
1114         /* Print results */
1115
1116         printf("%u:%u (0x%x:0x%x)\n", luid.high, luid.low, luid.high, luid.low);
1117
1118         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1119  done:
1120         return status;
1121 }
1122
1123 /* Query LSA security object */
1124
1125 static NTSTATUS cmd_lsa_query_secobj(struct rpc_pipe_client *cli, 
1126                                      TALLOC_CTX *mem_ctx, int argc, 
1127                                      const char **argv) 
1128 {
1129         struct policy_handle pol;
1130         NTSTATUS status, result;
1131         struct sec_desc_buf *sdb;
1132         uint32 sec_info = SECINFO_DACL;
1133         struct dcerpc_binding_handle *b = cli->binding_handle;
1134
1135         if (argc < 1 || argc > 2) {
1136                 printf("Usage: %s [sec_info]\n", argv[0]);
1137                 return NT_STATUS_OK;
1138         }
1139
1140         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
1141                                       SEC_FLAG_MAXIMUM_ALLOWED,
1142                                       &pol);
1143
1144         if (argc == 2) 
1145                 sscanf(argv[1], "%x", &sec_info);
1146
1147         if (!NT_STATUS_IS_OK(status))
1148                 goto done;
1149
1150         status = dcerpc_lsa_QuerySecurity(b, mem_ctx,
1151                                           &pol,
1152                                           sec_info,
1153                                           &sdb,
1154                                           &result);
1155         if (!NT_STATUS_IS_OK(status))
1156                 goto done;
1157         if (!NT_STATUS_IS_OK(result)) {
1158                 status = result;
1159                 goto done;
1160         }
1161
1162         /* Print results */
1163
1164         display_sec_desc(sdb->sd);
1165
1166         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1167  done:
1168         return status;
1169 }
1170
1171 static void display_trust_dom_info_4(struct lsa_TrustDomainInfoPassword *p,
1172                                      DATA_BLOB session_key)
1173 {
1174         char *pwd, *pwd_old;
1175
1176         DATA_BLOB data     = data_blob_const(p->password->data, p->password->length);
1177         DATA_BLOB data_old = data_blob_const(p->old_password->data, p->old_password->length);
1178
1179         pwd     = sess_decrypt_string(talloc_tos(), &data, &session_key);
1180         pwd_old = sess_decrypt_string(talloc_tos(), &data_old, &session_key);
1181
1182         d_printf("Password:\t%s\n", pwd);
1183         d_printf("Old Password:\t%s\n", pwd_old);
1184
1185         talloc_free(pwd);
1186         talloc_free(pwd_old);
1187 }
1188
1189 static void display_trust_dom_info(TALLOC_CTX *mem_ctx,
1190                                    union lsa_TrustedDomainInfo *info,
1191                                    enum lsa_TrustDomInfoEnum info_class,
1192                                    DATA_BLOB session_key)
1193 {
1194         switch (info_class) {
1195                 case LSA_TRUSTED_DOMAIN_INFO_PASSWORD:
1196                         display_trust_dom_info_4(&info->password, session_key);
1197                         break;
1198                 default: {
1199                         const char *str = NULL;
1200                         str = NDR_PRINT_UNION_STRING(mem_ctx,
1201                                                      lsa_TrustedDomainInfo,
1202                                                      info_class, info);
1203                         if (str) {
1204                                 d_printf("%s\n", str);
1205                         }
1206                         break;
1207                 }
1208         }
1209 }
1210
1211 static NTSTATUS cmd_lsa_query_trustdominfobysid(struct rpc_pipe_client *cli,
1212                                                 TALLOC_CTX *mem_ctx, int argc, 
1213                                                 const char **argv) 
1214 {
1215         struct policy_handle pol;
1216         NTSTATUS status, result;
1217         struct dom_sid dom_sid;
1218         uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1219         union lsa_TrustedDomainInfo *info = NULL;
1220         enum lsa_TrustDomInfoEnum info_class = 1;
1221         DATA_BLOB session_key;
1222         struct dcerpc_binding_handle *b = cli->binding_handle;
1223
1224         if (argc > 3 || argc < 2) {
1225                 printf("Usage: %s [sid] [info_class]\n", argv[0]);
1226                 return NT_STATUS_OK;
1227         }
1228
1229         if (!string_to_sid(&dom_sid, argv[1]))
1230                 return NT_STATUS_NO_MEMORY;
1231
1232         if (argc == 3)
1233                 info_class = atoi(argv[2]);
1234
1235         status = rpccli_lsa_open_policy2(cli, mem_ctx, True, access_mask, &pol);
1236
1237         if (!NT_STATUS_IS_OK(status))
1238                 goto done;
1239
1240         status = dcerpc_lsa_QueryTrustedDomainInfoBySid(b, mem_ctx,
1241                                                         &pol,
1242                                                         &dom_sid,
1243                                                         info_class,
1244                                                         &info,
1245                                                         &result);
1246         if (!NT_STATUS_IS_OK(status))
1247                 goto done;
1248         if (!NT_STATUS_IS_OK(result)) {
1249                 status = result;
1250                 goto done;
1251         }
1252
1253         status = cli_get_session_key(mem_ctx, cli, &session_key);
1254         if (!NT_STATUS_IS_OK(status)) {
1255                 DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1256                 goto done;
1257         }
1258
1259         display_trust_dom_info(mem_ctx, info, info_class, session_key);
1260
1261  done:
1262         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1263
1264         return status;
1265 }
1266
1267 static NTSTATUS cmd_lsa_query_trustdominfobyname(struct rpc_pipe_client *cli,
1268                                                  TALLOC_CTX *mem_ctx, int argc,
1269                                                  const char **argv) 
1270 {
1271         struct policy_handle pol;
1272         NTSTATUS status, result;
1273         uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1274         union lsa_TrustedDomainInfo *info = NULL;
1275         enum lsa_TrustDomInfoEnum info_class = 1;
1276         struct lsa_String trusted_domain;
1277         struct dcerpc_binding_handle *b = cli->binding_handle;
1278         DATA_BLOB session_key;
1279
1280         if (argc > 3 || argc < 2) {
1281                 printf("Usage: %s [name] [info_class]\n", argv[0]);
1282                 return NT_STATUS_OK;
1283         }
1284
1285         if (argc == 3)
1286                 info_class = atoi(argv[2]);
1287
1288         status = rpccli_lsa_open_policy2(cli, mem_ctx, True, access_mask, &pol);
1289
1290         if (!NT_STATUS_IS_OK(status))
1291                 goto done;
1292
1293         init_lsa_String(&trusted_domain, argv[1]);
1294
1295         status = dcerpc_lsa_QueryTrustedDomainInfoByName(b, mem_ctx,
1296                                                          &pol,
1297                                                          &trusted_domain,
1298                                                          info_class,
1299                                                          &info,
1300                                                          &result);
1301         if (!NT_STATUS_IS_OK(status))
1302                 goto done;
1303         if (!NT_STATUS_IS_OK(result)) {
1304                 status = result;
1305                 goto done;
1306         }
1307
1308         status = cli_get_session_key(mem_ctx, cli, &session_key);
1309         if (!NT_STATUS_IS_OK(status)) {
1310                 DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1311                 goto done;
1312         }
1313
1314         display_trust_dom_info(mem_ctx, info, info_class, session_key);
1315
1316  done:
1317         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1318
1319         return status;
1320 }
1321
1322 static NTSTATUS cmd_lsa_set_trustdominfo(struct rpc_pipe_client *cli,
1323                                          TALLOC_CTX *mem_ctx, int argc,
1324                                          const char **argv)
1325 {
1326         struct policy_handle pol, trustdom_pol;
1327         NTSTATUS status, result;
1328         uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1329         union lsa_TrustedDomainInfo info;
1330         struct dom_sid dom_sid;
1331         enum lsa_TrustDomInfoEnum info_class = 1;
1332         struct dcerpc_binding_handle *b = cli->binding_handle;
1333
1334         if (argc > 4 || argc < 3) {
1335                 printf("Usage: %s [sid] [info_class] [value]\n", argv[0]);
1336                 return NT_STATUS_OK;
1337         }
1338
1339         if (!string_to_sid(&dom_sid, argv[1])) {
1340                 return NT_STATUS_NO_MEMORY;
1341         }
1342
1343
1344         info_class = atoi(argv[2]);
1345
1346         switch (info_class) {
1347         case 13: /* LSA_TRUSTED_DOMAIN_SUPPORTED_ENCRYPTION_TYPES */
1348                 info.enc_types.enc_types = atoi(argv[3]);
1349                 break;
1350         default:
1351                 return NT_STATUS_INVALID_PARAMETER;
1352         }
1353
1354         status = rpccli_lsa_open_policy2(cli, mem_ctx, True, access_mask, &pol);
1355         if (!NT_STATUS_IS_OK(status)) {
1356                 goto done;
1357         }
1358
1359         status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
1360                                               &pol,
1361                                               &dom_sid,
1362                                               access_mask,
1363                                               &trustdom_pol,
1364                                               &result);
1365         if (!NT_STATUS_IS_OK(status)) {
1366                 goto done;
1367         }
1368         if (!NT_STATUS_IS_OK(result)) {
1369                 status = result;
1370                 goto done;
1371         }
1372
1373         status = dcerpc_lsa_SetInformationTrustedDomain(b, mem_ctx,
1374                                                         &trustdom_pol,
1375                                                         info_class,
1376                                                         &info,
1377                                                         &result);
1378         if (!NT_STATUS_IS_OK(status)) {
1379                 goto done;
1380         }
1381         if (!NT_STATUS_IS_OK(result)) {
1382                 status = result;
1383                 goto done;
1384         }
1385  done:
1386         dcerpc_lsa_Close(b, mem_ctx, &trustdom_pol, &result);
1387         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1388
1389         return status;
1390 }
1391
1392 static NTSTATUS cmd_lsa_query_trustdominfo(struct rpc_pipe_client *cli,
1393                                            TALLOC_CTX *mem_ctx, int argc,
1394                                            const char **argv) 
1395 {
1396         struct policy_handle pol, trustdom_pol;
1397         NTSTATUS status, result;
1398         uint32 access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
1399         union lsa_TrustedDomainInfo *info = NULL;
1400         struct dom_sid dom_sid;
1401         enum lsa_TrustDomInfoEnum info_class = 1;
1402         DATA_BLOB session_key;
1403         struct dcerpc_binding_handle *b = cli->binding_handle;
1404
1405         if (argc > 3 || argc < 2) {
1406                 printf("Usage: %s [sid] [info_class]\n", argv[0]);
1407                 return NT_STATUS_OK;
1408         }
1409
1410         if (!string_to_sid(&dom_sid, argv[1]))
1411                 return NT_STATUS_NO_MEMORY;
1412
1413
1414         if (argc == 3)
1415                 info_class = atoi(argv[2]);
1416
1417         status = rpccli_lsa_open_policy2(cli, mem_ctx, True, access_mask, &pol);
1418
1419         if (!NT_STATUS_IS_OK(status))
1420                 goto done;
1421
1422         status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
1423                                               &pol,
1424                                               &dom_sid,
1425                                               access_mask,
1426                                               &trustdom_pol,
1427                                               &result);
1428         if (!NT_STATUS_IS_OK(status))
1429                 goto done;
1430         if (!NT_STATUS_IS_OK(result)) {
1431                 status = result;
1432                 goto done;
1433         }
1434
1435         status = dcerpc_lsa_QueryTrustedDomainInfo(b, mem_ctx,
1436                                                    &trustdom_pol,
1437                                                    info_class,
1438                                                    &info,
1439                                                    &result);
1440         if (!NT_STATUS_IS_OK(status))
1441                 goto done;
1442         if (!NT_STATUS_IS_OK(result)) {
1443                 status = result;
1444                 goto done;
1445         }
1446
1447         status = cli_get_session_key(mem_ctx, cli, &session_key);
1448         if (!NT_STATUS_IS_OK(status)) {
1449                 DEBUG(0, ("Could not retrieve session key: %s\n", nt_errstr(status)));
1450                 goto done;
1451         }
1452
1453         display_trust_dom_info(mem_ctx, info, info_class, session_key);
1454
1455  done:
1456         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1457
1458         return status;
1459 }
1460
1461 static NTSTATUS cmd_lsa_get_username(struct rpc_pipe_client *cli,
1462                                      TALLOC_CTX *mem_ctx, int argc,
1463                                      const char **argv)
1464 {
1465         struct policy_handle pol;
1466         NTSTATUS status, result;
1467         const char *servername = cli->desthost;
1468         struct lsa_String *account_name = NULL;
1469         struct lsa_String *authority_name = NULL;
1470         struct dcerpc_binding_handle *b = cli->binding_handle;
1471
1472         if (argc > 2) {
1473                 printf("Usage: %s servername\n", argv[0]);
1474                 return NT_STATUS_OK;
1475         }
1476
1477         status = rpccli_lsa_open_policy(cli, mem_ctx, true,
1478                                         SEC_FLAG_MAXIMUM_ALLOWED,
1479                                         &pol);
1480
1481         if (!NT_STATUS_IS_OK(status)) {
1482                 goto done;
1483         }
1484
1485         status = dcerpc_lsa_GetUserName(b, mem_ctx,
1486                                         servername,
1487                                         &account_name,
1488                                         &authority_name,
1489                                         &result);
1490         if (!NT_STATUS_IS_OK(status)) {
1491                 goto done;
1492         }
1493         if (!NT_STATUS_IS_OK(result)) {
1494                 status = result;
1495                 goto done;
1496         }
1497
1498         /* Print results */
1499
1500         printf("Account Name: %s, Authority Name: %s\n",
1501                 account_name->string, authority_name ? authority_name->string :
1502                 "");
1503
1504         dcerpc_lsa_Close(b, mem_ctx, &pol, &result);
1505  done:
1506         return status;
1507 }
1508
1509 static NTSTATUS cmd_lsa_add_priv(struct rpc_pipe_client *cli,
1510                                  TALLOC_CTX *mem_ctx, int argc,
1511                                  const char **argv)
1512 {
1513         struct policy_handle dom_pol, user_pol;
1514         NTSTATUS status, result;
1515         struct lsa_PrivilegeSet privs;
1516         struct lsa_LUIDAttribute *set = NULL;
1517         struct dom_sid sid;
1518         int i;
1519         struct dcerpc_binding_handle *b = cli->binding_handle;
1520
1521         ZERO_STRUCT(privs);
1522
1523         if (argc < 3 ) {
1524                 printf("Usage: %s SID [rights...]\n", argv[0]);
1525                 return NT_STATUS_OK;
1526         }
1527
1528         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1529         if (!NT_STATUS_IS_OK(status)) {
1530                 goto done;
1531         }
1532
1533         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
1534                                          SEC_FLAG_MAXIMUM_ALLOWED,
1535                                          &dom_pol);
1536
1537         if (!NT_STATUS_IS_OK(status)) {
1538                 goto done;
1539         }
1540
1541         status = dcerpc_lsa_OpenAccount(b, mem_ctx,
1542                                         &dom_pol,
1543                                         &sid,
1544                                         SEC_FLAG_MAXIMUM_ALLOWED,
1545                                         &user_pol,
1546                                         &result);
1547         if (!NT_STATUS_IS_OK(status)) {
1548                 goto done;
1549         }
1550         if (!NT_STATUS_IS_OK(result)) {
1551                 status = result;
1552                 goto done;
1553         }
1554
1555         for (i=2; i<argc; i++) {
1556
1557                 struct lsa_String priv_name;
1558                 struct lsa_LUID luid;
1559
1560                 init_lsa_String(&priv_name, argv[i]);
1561
1562                 status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1563                                                     &dom_pol,
1564                                                     &priv_name,
1565                                                     &luid,
1566                                                     &result);
1567                 if (!NT_STATUS_IS_OK(status)) {
1568                         continue;
1569                 }
1570                 if (!NT_STATUS_IS_OK(result)) {
1571                         status = result;
1572                         continue;
1573                 }
1574
1575                 privs.count++;
1576                 set = talloc_realloc(mem_ctx, set,
1577                                            struct lsa_LUIDAttribute,
1578                                            privs.count);
1579                 if (!set) {
1580                         return NT_STATUS_NO_MEMORY;
1581                 }
1582
1583                 set[privs.count-1].luid = luid;
1584                 set[privs.count-1].attribute = 0;
1585         }
1586
1587         privs.set = set;
1588
1589         status = dcerpc_lsa_AddPrivilegesToAccount(b, mem_ctx,
1590                                                    &user_pol,
1591                                                    &privs,
1592                                                    &result);
1593         if (!NT_STATUS_IS_OK(status)) {
1594                 goto done;
1595         }
1596         if (!NT_STATUS_IS_OK(result)) {
1597                 status = result;
1598                 goto done;
1599         }
1600
1601         dcerpc_lsa_Close(b, mem_ctx, &user_pol, &result);
1602         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1603  done:
1604         return status;
1605 }
1606
1607 static NTSTATUS cmd_lsa_del_priv(struct rpc_pipe_client *cli,
1608                                  TALLOC_CTX *mem_ctx, int argc,
1609                                  const char **argv)
1610 {
1611         struct policy_handle dom_pol, user_pol;
1612         NTSTATUS status, result;
1613         struct lsa_PrivilegeSet privs;
1614         struct lsa_LUIDAttribute *set = NULL;
1615         struct dom_sid sid;
1616         int i;
1617         struct dcerpc_binding_handle *b = cli->binding_handle;
1618
1619         ZERO_STRUCT(privs);
1620
1621         if (argc < 3 ) {
1622                 printf("Usage: %s SID [rights...]\n", argv[0]);
1623                 return NT_STATUS_OK;
1624         }
1625
1626         status = name_to_sid(cli, mem_ctx, &sid, argv[1]);
1627         if (!NT_STATUS_IS_OK(status)) {
1628                 goto done;
1629         }
1630
1631         status = rpccli_lsa_open_policy2(cli, mem_ctx, True,
1632                                          SEC_FLAG_MAXIMUM_ALLOWED,
1633                                          &dom_pol);
1634
1635         if (!NT_STATUS_IS_OK(status)) {
1636                 goto done;
1637         }
1638
1639         status = dcerpc_lsa_OpenAccount(b, mem_ctx,
1640                                         &dom_pol,
1641                                         &sid,
1642                                         SEC_FLAG_MAXIMUM_ALLOWED,
1643                                         &user_pol,
1644                                         &result);
1645         if (!NT_STATUS_IS_OK(status)) {
1646                 goto done;
1647         }
1648         if (!NT_STATUS_IS_OK(result)) {
1649                 status = result;
1650                 goto done;
1651         }
1652
1653         for (i=2; i<argc; i++) {
1654
1655                 struct lsa_String priv_name;
1656                 struct lsa_LUID luid;
1657
1658                 init_lsa_String(&priv_name, argv[i]);
1659
1660                 status = dcerpc_lsa_LookupPrivValue(b, mem_ctx,
1661                                                     &dom_pol,
1662                                                     &priv_name,
1663                                                     &luid,
1664                                                     &result);
1665                 if (!NT_STATUS_IS_OK(status)) {
1666                         continue;
1667                 }
1668                 if (!NT_STATUS_IS_OK(result)) {
1669                         status = result;
1670                         continue;
1671                 }
1672
1673                 privs.count++;
1674                 set = talloc_realloc(mem_ctx, set,
1675                                            struct lsa_LUIDAttribute,
1676                                            privs.count);
1677                 if (!set) {
1678                         return NT_STATUS_NO_MEMORY;
1679                 }
1680
1681                 set[privs.count-1].luid = luid;
1682                 set[privs.count-1].attribute = 0;
1683         }
1684
1685         privs.set = set;
1686
1687
1688         status = dcerpc_lsa_RemovePrivilegesFromAccount(b, mem_ctx,
1689                                                         &user_pol,
1690                                                         false,
1691                                                         &privs,
1692                                                         &result);
1693         if (!NT_STATUS_IS_OK(status)) {
1694                 goto done;
1695         }
1696         if (!NT_STATUS_IS_OK(result)) {
1697                 status = result;
1698                 goto done;
1699         }
1700
1701         dcerpc_lsa_Close(b, mem_ctx, &user_pol, &result);
1702         dcerpc_lsa_Close(b, mem_ctx, &dom_pol, &result);
1703  done:
1704         return status;
1705 }
1706
1707 static NTSTATUS cmd_lsa_create_secret(struct rpc_pipe_client *cli,
1708                                       TALLOC_CTX *mem_ctx, int argc,
1709                                       const char **argv)
1710 {
1711         NTSTATUS status, result;
1712         struct policy_handle handle, sec_handle;
1713         struct lsa_String name;
1714         struct dcerpc_binding_handle *b = cli->binding_handle;
1715
1716         if (argc < 2) {
1717                 printf("Usage: %s name\n", argv[0]);
1718                 return NT_STATUS_OK;
1719         }
1720
1721         status = rpccli_lsa_open_policy2(cli, mem_ctx,
1722                                          true,
1723                                          SEC_FLAG_MAXIMUM_ALLOWED,
1724                                          &handle);
1725         if (!NT_STATUS_IS_OK(status)) {
1726                 return status;
1727         }
1728
1729         init_lsa_String(&name, argv[1]);
1730
1731         status = dcerpc_lsa_CreateSecret(b, mem_ctx,
1732                                          &handle,
1733                                          name,
1734                                          SEC_FLAG_MAXIMUM_ALLOWED,
1735                                          &sec_handle,
1736                                          &result);
1737         if (!NT_STATUS_IS_OK(status)) {
1738                 goto done;
1739         }
1740         if (!NT_STATUS_IS_OK(result)) {
1741                 status = result;
1742                 goto done;
1743         }
1744
1745  done:
1746         if (is_valid_policy_hnd(&sec_handle)) {
1747                 dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
1748         }
1749         if (is_valid_policy_hnd(&handle)) {
1750                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
1751         }
1752
1753         return status;
1754 }
1755
1756 static NTSTATUS cmd_lsa_delete_secret(struct rpc_pipe_client *cli,
1757                                       TALLOC_CTX *mem_ctx, int argc,
1758                                       const char **argv)
1759 {
1760         NTSTATUS status, result;
1761         struct policy_handle handle, sec_handle;
1762         struct lsa_String name;
1763         struct dcerpc_binding_handle *b = cli->binding_handle;
1764
1765         if (argc < 2) {
1766                 printf("Usage: %s name\n", argv[0]);
1767                 return NT_STATUS_OK;
1768         }
1769
1770         status = rpccli_lsa_open_policy2(cli, mem_ctx,
1771                                          true,
1772                                          SEC_FLAG_MAXIMUM_ALLOWED,
1773                                          &handle);
1774         if (!NT_STATUS_IS_OK(status)) {
1775                 return status;
1776         }
1777
1778         init_lsa_String(&name, argv[1]);
1779
1780         status = dcerpc_lsa_OpenSecret(b, mem_ctx,
1781                                        &handle,
1782                                        name,
1783                                        SEC_FLAG_MAXIMUM_ALLOWED,
1784                                        &sec_handle,
1785                                        &result);
1786         if (!NT_STATUS_IS_OK(status)) {
1787                 goto done;
1788         }
1789         if (!NT_STATUS_IS_OK(result)) {
1790                 status = result;
1791                 goto done;
1792         }
1793
1794         status = dcerpc_lsa_DeleteObject(b, mem_ctx,
1795                                          &sec_handle,
1796                                          &result);
1797         if (!NT_STATUS_IS_OK(status)) {
1798                 goto done;
1799         }
1800         if (!NT_STATUS_IS_OK(result)) {
1801                 status = result;
1802                 goto done;
1803         }
1804
1805  done:
1806         if (is_valid_policy_hnd(&sec_handle)) {
1807                 dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
1808         }
1809         if (is_valid_policy_hnd(&handle)) {
1810                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
1811         }
1812
1813         return status;
1814 }
1815
1816 static NTSTATUS cmd_lsa_query_secret(struct rpc_pipe_client *cli,
1817                                      TALLOC_CTX *mem_ctx, int argc,
1818                                      const char **argv)
1819 {
1820         NTSTATUS status, result;
1821         struct policy_handle handle, sec_handle;
1822         struct lsa_String name;
1823         struct lsa_DATA_BUF_PTR new_val;
1824         NTTIME new_mtime = 0;
1825         struct lsa_DATA_BUF_PTR old_val;
1826         NTTIME old_mtime = 0;
1827         DATA_BLOB session_key;
1828         DATA_BLOB new_blob = data_blob_null;
1829         DATA_BLOB old_blob = data_blob_null;
1830         char *new_secret, *old_secret;
1831         struct dcerpc_binding_handle *b = cli->binding_handle;
1832
1833         if (argc < 2) {
1834                 printf("Usage: %s name\n", argv[0]);
1835                 return NT_STATUS_OK;
1836         }
1837
1838         status = rpccli_lsa_open_policy2(cli, mem_ctx,
1839                                          true,
1840                                          SEC_FLAG_MAXIMUM_ALLOWED,
1841                                          &handle);
1842         if (!NT_STATUS_IS_OK(status)) {
1843                 return status;
1844         }
1845
1846         init_lsa_String(&name, argv[1]);
1847
1848         status = dcerpc_lsa_OpenSecret(b, mem_ctx,
1849                                        &handle,
1850                                        name,
1851                                        SEC_FLAG_MAXIMUM_ALLOWED,
1852                                        &sec_handle,
1853                                        &result);
1854         if (!NT_STATUS_IS_OK(status)) {
1855                 goto done;
1856         }
1857         if (!NT_STATUS_IS_OK(result)) {
1858                 status = result;
1859                 goto done;
1860         }
1861
1862         ZERO_STRUCT(new_val);
1863         ZERO_STRUCT(old_val);
1864
1865         status = dcerpc_lsa_QuerySecret(b, mem_ctx,
1866                                         &sec_handle,
1867                                         &new_val,
1868                                         &new_mtime,
1869                                         &old_val,
1870                                         &old_mtime,
1871                                         &result);
1872         if (!NT_STATUS_IS_OK(status)) {
1873                 goto done;
1874         }
1875         if (!NT_STATUS_IS_OK(result)) {
1876                 status = result;
1877                 goto done;
1878         }
1879
1880         status = cli_get_session_key(mem_ctx, cli, &session_key);
1881         if (!NT_STATUS_IS_OK(status)) {
1882                 goto done;
1883         }
1884
1885         if (new_val.buf) {
1886                 new_blob = data_blob_const(new_val.buf->data, new_val.buf->length);
1887         }
1888         if (old_val.buf) {
1889                 old_blob = data_blob_const(old_val.buf->data, old_val.buf->length);
1890         }
1891
1892         new_secret = sess_decrypt_string(mem_ctx, &new_blob, &session_key);
1893         old_secret = sess_decrypt_string(mem_ctx, &old_blob, &session_key);
1894         if (new_secret) {
1895                 d_printf("new secret: %s\n", new_secret);
1896         }
1897         if (old_secret) {
1898                 d_printf("old secret: %s\n", old_secret);
1899         }
1900
1901  done:
1902         if (is_valid_policy_hnd(&sec_handle)) {
1903                 dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
1904         }
1905         if (is_valid_policy_hnd(&handle)) {
1906                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
1907         }
1908
1909         return status;
1910 }
1911
1912 static NTSTATUS cmd_lsa_set_secret(struct rpc_pipe_client *cli,
1913                                    TALLOC_CTX *mem_ctx, int argc,
1914                                    const char **argv)
1915 {
1916         NTSTATUS status, result;
1917         struct policy_handle handle, sec_handle;
1918         struct lsa_String name;
1919         struct lsa_DATA_BUF new_val;
1920         struct lsa_DATA_BUF old_val;
1921         DATA_BLOB enc_key;
1922         DATA_BLOB session_key;
1923         struct dcerpc_binding_handle *b = cli->binding_handle;
1924
1925         if (argc < 3) {
1926                 printf("Usage: %s name secret\n", argv[0]);
1927                 return NT_STATUS_OK;
1928         }
1929
1930         status = rpccli_lsa_open_policy2(cli, mem_ctx,
1931                                          true,
1932                                          SEC_FLAG_MAXIMUM_ALLOWED,
1933                                          &handle);
1934         if (!NT_STATUS_IS_OK(status)) {
1935                 return status;
1936         }
1937
1938         init_lsa_String(&name, argv[1]);
1939
1940         status = dcerpc_lsa_OpenSecret(b, mem_ctx,
1941                                        &handle,
1942                                        name,
1943                                        SEC_FLAG_MAXIMUM_ALLOWED,
1944                                        &sec_handle,
1945                                        &result);
1946         if (!NT_STATUS_IS_OK(status)) {
1947                 goto done;
1948         }
1949         if (!NT_STATUS_IS_OK(result)) {
1950                 status = result;
1951                 goto done;
1952         }
1953
1954         ZERO_STRUCT(new_val);
1955         ZERO_STRUCT(old_val);
1956
1957         status = cli_get_session_key(mem_ctx, cli, &session_key);
1958         if (!NT_STATUS_IS_OK(status)) {
1959                 goto done;
1960         }
1961
1962         enc_key = sess_encrypt_string(argv[2], &session_key);
1963
1964         new_val.length = enc_key.length;
1965         new_val.size = enc_key.length;
1966         new_val.data = enc_key.data;
1967
1968         status = dcerpc_lsa_SetSecret(b, mem_ctx,
1969                                       &sec_handle,
1970                                       &new_val,
1971                                       NULL,
1972                                       &result);
1973         if (!NT_STATUS_IS_OK(status)) {
1974                 goto done;
1975         }
1976         if (!NT_STATUS_IS_OK(result)) {
1977                 status = result;
1978                 goto done;
1979         }
1980
1981  done:
1982         if (is_valid_policy_hnd(&sec_handle)) {
1983                 dcerpc_lsa_Close(b, mem_ctx, &sec_handle, &result);
1984         }
1985         if (is_valid_policy_hnd(&handle)) {
1986                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
1987         }
1988
1989         return status;
1990 }
1991
1992 static NTSTATUS cmd_lsa_retrieve_private_data(struct rpc_pipe_client *cli,
1993                                               TALLOC_CTX *mem_ctx, int argc,
1994                                               const char **argv)
1995 {
1996         NTSTATUS status, result;
1997         struct policy_handle handle;
1998         struct lsa_String name;
1999         struct lsa_DATA_BUF *val;
2000         DATA_BLOB session_key;
2001         DATA_BLOB blob = data_blob_null;
2002         char *secret;
2003         struct dcerpc_binding_handle *b = cli->binding_handle;
2004
2005         if (argc < 2) {
2006                 printf("Usage: %s name\n", argv[0]);
2007                 return NT_STATUS_OK;
2008         }
2009
2010         status = rpccli_lsa_open_policy2(cli, mem_ctx,
2011                                          true,
2012                                          SEC_FLAG_MAXIMUM_ALLOWED,
2013                                          &handle);
2014         if (!NT_STATUS_IS_OK(status)) {
2015                 return status;
2016         }
2017
2018         init_lsa_String(&name, argv[1]);
2019
2020         ZERO_STRUCT(val);
2021
2022         status = dcerpc_lsa_RetrievePrivateData(b, mem_ctx,
2023                                                 &handle,
2024                                                 &name,
2025                                                 &val,
2026                                                 &result);
2027         if (!NT_STATUS_IS_OK(status)) {
2028                 goto done;
2029         }
2030         if (!NT_STATUS_IS_OK(result)) {
2031                 status = result;
2032                 goto done;
2033         }
2034
2035         status = cli_get_session_key(mem_ctx, cli, &session_key);
2036         if (!NT_STATUS_IS_OK(status)) {
2037                 goto done;
2038         }
2039
2040         if (val) {
2041                 blob = data_blob_const(val->data, val->length);
2042         }
2043
2044         secret = sess_decrypt_string(mem_ctx, &blob, &session_key);
2045         if (secret) {
2046                 d_printf("secret: %s\n", secret);
2047         }
2048
2049  done:
2050         if (is_valid_policy_hnd(&handle)) {
2051                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2052         }
2053
2054         return status;
2055 }
2056
2057 static NTSTATUS cmd_lsa_store_private_data(struct rpc_pipe_client *cli,
2058                                            TALLOC_CTX *mem_ctx, int argc,
2059                                            const char **argv)
2060 {
2061         NTSTATUS status, result;
2062         struct policy_handle handle;
2063         struct lsa_String name;
2064         struct lsa_DATA_BUF val;
2065         DATA_BLOB session_key;
2066         DATA_BLOB enc_key;
2067         struct dcerpc_binding_handle *b = cli->binding_handle;
2068
2069         if (argc < 3) {
2070                 printf("Usage: %s name secret\n", argv[0]);
2071                 return NT_STATUS_OK;
2072         }
2073
2074         status = rpccli_lsa_open_policy2(cli, mem_ctx,
2075                                          true,
2076                                          SEC_FLAG_MAXIMUM_ALLOWED,
2077                                          &handle);
2078         if (!NT_STATUS_IS_OK(status)) {
2079                 return status;
2080         }
2081
2082         init_lsa_String(&name, argv[1]);
2083
2084         ZERO_STRUCT(val);
2085
2086         status = cli_get_session_key(mem_ctx, cli, &session_key);
2087         if (!NT_STATUS_IS_OK(status)) {
2088                 goto done;
2089         }
2090
2091         enc_key = sess_encrypt_string(argv[2], &session_key);
2092
2093         val.length = enc_key.length;
2094         val.size = enc_key.length;
2095         val.data = enc_key.data;
2096
2097         status = dcerpc_lsa_StorePrivateData(b, mem_ctx,
2098                                              &handle,
2099                                              &name,
2100                                              &val,
2101                                              &result);
2102         if (!NT_STATUS_IS_OK(status)) {
2103                 goto done;
2104         }
2105         if (!NT_STATUS_IS_OK(result)) {
2106                 status = result;
2107                 goto done;
2108         }
2109
2110  done:
2111         if (is_valid_policy_hnd(&handle)) {
2112                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2113         }
2114
2115         return status;
2116 }
2117
2118 static NTSTATUS cmd_lsa_create_trusted_domain(struct rpc_pipe_client *cli,
2119                                               TALLOC_CTX *mem_ctx, int argc,
2120                                               const char **argv)
2121 {
2122         NTSTATUS status, result;
2123         struct policy_handle handle, trustdom_handle;
2124         struct dom_sid sid;
2125         struct lsa_DomainInfo info;
2126         struct dcerpc_binding_handle *b = cli->binding_handle;
2127
2128         if (argc < 3) {
2129                 printf("Usage: %s name sid\n", argv[0]);
2130                 return NT_STATUS_OK;
2131         }
2132
2133         status = rpccli_lsa_open_policy2(cli, mem_ctx,
2134                                          true,
2135                                          SEC_FLAG_MAXIMUM_ALLOWED,
2136                                          &handle);
2137         if (!NT_STATUS_IS_OK(status)) {
2138                 return status;
2139         }
2140
2141         init_lsa_StringLarge(&info.name, argv[1]);
2142         info.sid = &sid;
2143         string_to_sid(&sid, argv[2]);
2144
2145         status = dcerpc_lsa_CreateTrustedDomain(b, mem_ctx,
2146                                                 &handle,
2147                                                 &info,
2148                                                 SEC_FLAG_MAXIMUM_ALLOWED,
2149                                                 &trustdom_handle,
2150                                                 &result);
2151         if (!NT_STATUS_IS_OK(status)) {
2152                 goto done;
2153         }
2154         if (!NT_STATUS_IS_OK(result)) {
2155                 status = result;
2156                 goto done;
2157         }
2158
2159  done:
2160         if (is_valid_policy_hnd(&trustdom_handle)) {
2161                 dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2162         }
2163
2164         if (is_valid_policy_hnd(&handle)) {
2165                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2166         }
2167
2168         return status;
2169 }
2170
2171 static NTSTATUS cmd_lsa_delete_trusted_domain(struct rpc_pipe_client *cli,
2172                                               TALLOC_CTX *mem_ctx, int argc,
2173                                               const char **argv)
2174 {
2175         NTSTATUS status, result;
2176         struct policy_handle handle, trustdom_handle;
2177         struct lsa_String name;
2178         struct dom_sid *sid = NULL;
2179         struct dcerpc_binding_handle *b = cli->binding_handle;
2180
2181         if (argc < 2) {
2182                 printf("Usage: %s name\n", argv[0]);
2183                 return NT_STATUS_OK;
2184         }
2185
2186         status = rpccli_lsa_open_policy2(cli, mem_ctx,
2187                                          true,
2188                                          SEC_FLAG_MAXIMUM_ALLOWED,
2189                                          &handle);
2190         if (!NT_STATUS_IS_OK(status)) {
2191                 return status;
2192         }
2193
2194         init_lsa_String(&name, argv[1]);
2195
2196         status = dcerpc_lsa_OpenTrustedDomainByName(b, mem_ctx,
2197                                                     &handle,
2198                                                     name,
2199                                                     SEC_FLAG_MAXIMUM_ALLOWED,
2200                                                     &trustdom_handle,
2201                                                     &result);
2202         if (NT_STATUS_IS_OK(status) && NT_STATUS_IS_OK(result)) {
2203                 goto delete_object;
2204         }
2205
2206         {
2207                 uint32_t resume_handle = 0;
2208                 struct lsa_DomainList domains;
2209                 int i;
2210
2211                 status = dcerpc_lsa_EnumTrustDom(b, mem_ctx,
2212                                                  &handle,
2213                                                  &resume_handle,
2214                                                  &domains,
2215                                                  0xffff,
2216                                                  &result);
2217                 if (!NT_STATUS_IS_OK(status)) {
2218                         goto done;
2219                 }
2220                 if (!NT_STATUS_IS_OK(result)) {
2221                         status = result;
2222                         goto done;
2223                 }
2224
2225                 for (i=0; i < domains.count; i++) {
2226                         if (strequal(domains.domains[i].name.string, argv[1])) {
2227                                 sid = domains.domains[i].sid;
2228                                 break;
2229                         }
2230                 }
2231
2232                 if (!sid) {
2233                         return NT_STATUS_INVALID_SID;
2234                 }
2235         }
2236
2237         status = dcerpc_lsa_OpenTrustedDomain(b, mem_ctx,
2238                                               &handle,
2239                                               sid,
2240                                               SEC_FLAG_MAXIMUM_ALLOWED,
2241                                               &trustdom_handle,
2242                                               &result);
2243         if (!NT_STATUS_IS_OK(status)) {
2244                 goto done;
2245         }
2246         if (!NT_STATUS_IS_OK(result)) {
2247                 status = result;
2248                 goto done;
2249         }
2250
2251  delete_object:
2252         status = dcerpc_lsa_DeleteObject(b, mem_ctx,
2253                                          &trustdom_handle,
2254                                          &result);
2255         if (!NT_STATUS_IS_OK(status)) {
2256                 goto done;
2257         }
2258         if (!NT_STATUS_IS_OK(result)) {
2259                 status = result;
2260                 goto done;
2261         }
2262
2263  done:
2264         if (is_valid_policy_hnd(&trustdom_handle)) {
2265                 dcerpc_lsa_Close(b, mem_ctx, &trustdom_handle, &result);
2266         }
2267
2268         if (is_valid_policy_hnd(&handle)) {
2269                 dcerpc_lsa_Close(b, mem_ctx, &handle, &result);
2270         }
2271
2272         return status;
2273 }
2274
2275
2276 /* List of commands exported by this module */
2277
2278 struct cmd_set lsarpc_commands[] = {
2279
2280         { "LSARPC" },
2281
2282         { "lsaquery",            RPC_RTYPE_NTSTATUS, cmd_lsa_query_info_policy,  NULL, &ndr_table_lsarpc, NULL, "Query info policy",                    "" },
2283         { "lookupsids",          RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_sids,        NULL, &ndr_table_lsarpc, NULL, "Convert SIDs to names",                "" },
2284         { "lookupsids3",         RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_sids3,       NULL, &ndr_table_lsarpc, NULL, "Convert SIDs to names",                "" },
2285         { "lookupnames",         RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names,       NULL, &ndr_table_lsarpc, NULL, "Convert names to SIDs",                "" },
2286         { "lookupnames4",        RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names4,      NULL, &ndr_table_lsarpc, NULL, "Convert names to SIDs",                "" },
2287         { "lookupnames_level",   RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_names_level, NULL, &ndr_table_lsarpc, NULL, "Convert names to SIDs",                "" },
2288         { "enumtrust",           RPC_RTYPE_NTSTATUS, cmd_lsa_enum_trust_dom,     NULL, &ndr_table_lsarpc, NULL, "Enumerate trusted domains",            "Usage: [preferred max number] [enum context (0)]" },
2289         { "enumprivs",           RPC_RTYPE_NTSTATUS, cmd_lsa_enum_privilege,     NULL, &ndr_table_lsarpc, NULL, "Enumerate privileges",                 "" },
2290         { "getdispname",         RPC_RTYPE_NTSTATUS, cmd_lsa_get_dispname,       NULL, &ndr_table_lsarpc, NULL, "Get the privilege name",               "" },
2291         { "lsaenumsid",          RPC_RTYPE_NTSTATUS, cmd_lsa_enum_sids,          NULL, &ndr_table_lsarpc, NULL, "Enumerate the LSA SIDS",               "" },
2292         { "lsacreateaccount",    RPC_RTYPE_NTSTATUS, cmd_lsa_create_account,     NULL, &ndr_table_lsarpc, NULL, "Create a new lsa account",   "" },
2293         { "lsaenumprivsaccount", RPC_RTYPE_NTSTATUS, cmd_lsa_enum_privsaccounts, NULL, &ndr_table_lsarpc, NULL, "Enumerate the privileges of an SID",   "" },
2294         { "lsaenumacctrights",   RPC_RTYPE_NTSTATUS, cmd_lsa_enum_acct_rights,   NULL, &ndr_table_lsarpc, NULL, "Enumerate the rights of an SID",   "" },
2295         { "lsaaddpriv",          RPC_RTYPE_NTSTATUS, cmd_lsa_add_priv,           NULL, &ndr_table_lsarpc, NULL, "Assign a privilege to a SID", "" },
2296         { "lsadelpriv",          RPC_RTYPE_NTSTATUS, cmd_lsa_del_priv,           NULL, &ndr_table_lsarpc, NULL, "Revoke a privilege from a SID", "" },
2297         { "lsaaddacctrights",    RPC_RTYPE_NTSTATUS, cmd_lsa_add_acct_rights,    NULL, &ndr_table_lsarpc, NULL, "Add rights to an account",   "" },
2298         { "lsaremoveacctrights", RPC_RTYPE_NTSTATUS, cmd_lsa_remove_acct_rights, NULL, &ndr_table_lsarpc, NULL, "Remove rights from an account",   "" },
2299         { "lsalookupprivvalue",  RPC_RTYPE_NTSTATUS, cmd_lsa_lookup_priv_value,  NULL, &ndr_table_lsarpc, NULL, "Get a privilege value given its name", "" },
2300         { "lsaquerysecobj",      RPC_RTYPE_NTSTATUS, cmd_lsa_query_secobj,       NULL, &ndr_table_lsarpc, NULL, "Query LSA security object", "" },
2301         { "lsaquerytrustdominfo",RPC_RTYPE_NTSTATUS, cmd_lsa_query_trustdominfo, NULL, &ndr_table_lsarpc, NULL, "Query LSA trusted domains info (given a SID)", "" },
2302         { "lsaquerytrustdominfobyname",RPC_RTYPE_NTSTATUS, cmd_lsa_query_trustdominfobyname, NULL, &ndr_table_lsarpc, NULL, "Query LSA trusted domains info (given a name), only works for Windows > 2k", "" },
2303         { "lsaquerytrustdominfobysid",RPC_RTYPE_NTSTATUS, cmd_lsa_query_trustdominfobysid, NULL, &ndr_table_lsarpc, NULL, "Query LSA trusted domains info (given a SID)", "" },
2304         { "lsasettrustdominfo",   RPC_RTYPE_NTSTATUS, cmd_lsa_set_trustdominfo, NULL, &ndr_table_lsarpc, NULL, "Set LSA trusted domain info", "" },
2305         { "getusername",          RPC_RTYPE_NTSTATUS, cmd_lsa_get_username, NULL, &ndr_table_lsarpc, NULL, "Get username", "" },
2306         { "createsecret",         RPC_RTYPE_NTSTATUS, cmd_lsa_create_secret, NULL, &ndr_table_lsarpc, NULL, "Create Secret", "" },
2307         { "deletesecret",         RPC_RTYPE_NTSTATUS, cmd_lsa_delete_secret, NULL, &ndr_table_lsarpc, NULL, "Delete Secret", "" },
2308         { "querysecret",          RPC_RTYPE_NTSTATUS, cmd_lsa_query_secret, NULL, &ndr_table_lsarpc, NULL, "Query Secret", "" },
2309         { "setsecret",            RPC_RTYPE_NTSTATUS, cmd_lsa_set_secret, NULL, &ndr_table_lsarpc, NULL, "Set Secret", "" },
2310         { "retrieveprivatedata",  RPC_RTYPE_NTSTATUS, cmd_lsa_retrieve_private_data, NULL, &ndr_table_lsarpc, NULL, "Retrieve Private Data", "" },
2311         { "storeprivatedata",     RPC_RTYPE_NTSTATUS, cmd_lsa_store_private_data, NULL, &ndr_table_lsarpc, NULL, "Store Private Data", "" },
2312         { "createtrustdom",       RPC_RTYPE_NTSTATUS, cmd_lsa_create_trusted_domain, NULL, &ndr_table_lsarpc, NULL, "Create Trusted Domain", "" },
2313         { "deletetrustdom",       RPC_RTYPE_NTSTATUS, cmd_lsa_delete_trusted_domain, NULL, &ndr_table_lsarpc, NULL, "Delete Trusted Domain", "" },
2314
2315         { NULL }
2316 };
2317