rpcclient: add drsuapi dsgetdcinfo call.
[amitay/samba.git] / source3 / rpcclient / cmd_drsuapi.c
1 /*
2    Unix SMB/CIFS implementation.
3    RPC pipe client
4
5    Copyright (C) Guenther Deschner 2008
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "includes.h"
22 #include "rpcclient.h"
23
24 static WERROR cmd_drsuapi_cracknames(struct rpc_pipe_client *cli,
25                                      TALLOC_CTX *mem_ctx, int argc,
26                                      const char **argv)
27 {
28         NTSTATUS status;
29         WERROR werr;
30         int i;
31
32         struct GUID bind_guid;
33         struct policy_handle bind_handle;
34
35         int32_t level = 1;
36         union drsuapi_DsNameRequest req;
37         int32_t level_out;
38         union drsuapi_DsNameCtr ctr;
39         struct drsuapi_DsNameString names[1];
40
41         if (argc < 2) {
42                 printf("usage: %s name\n", argv[0]);
43                 return WERR_OK;
44         }
45
46         GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid);
47
48         status = rpccli_drsuapi_DsBind(cli, mem_ctx,
49                                        &bind_guid,
50                                        NULL,
51                                        &bind_handle,
52                                        &werr);
53
54         if (!NT_STATUS_IS_OK(status)) {
55                 return ntstatus_to_werror(status);
56         }
57
58         names[0].str = argv[1];
59
60         req.req1.codepage       = 1252; /* german */
61         req.req1.language       = 0x00000407; /* german */
62         req.req1.count          = 1;
63         req.req1.names          = names;
64         req.req1.format_flags   = DRSUAPI_DS_NAME_FLAG_NO_FLAGS;
65         req.req1.format_offered = DRSUAPI_DS_NAME_FORMAT_UKNOWN;
66         req.req1.format_desired = DRSUAPI_DS_NAME_FORMAT_FQDN_1779;
67
68         status = rpccli_drsuapi_DsCrackNames(cli, mem_ctx,
69                                              &bind_handle,
70                                              level,
71                                              &req,
72                                              &level_out,
73                                              &ctr,
74                                              &werr);
75
76         if (!NT_STATUS_IS_OK(status)) {
77                 werr = ntstatus_to_werror(status);
78                 goto out;
79         }
80
81         if (!W_ERROR_IS_OK(werr)) {
82                 goto out;
83         }
84
85         for (i=0; i < ctr.ctr1->count; i++) {
86                 printf("status: %d\n",
87                         ctr.ctr1->array[i].status);
88                 printf("dns_domain_name: %s\n",
89                         ctr.ctr1->array[i].dns_domain_name);
90                 printf("result_name: %s\n",
91                         ctr.ctr1->array[i].result_name);
92         }
93
94  out:
95         if (is_valid_policy_hnd(&bind_handle)) {
96                 rpccli_drsuapi_DsUnbind(cli, mem_ctx, &bind_handle, &werr);
97         }
98
99         return werr;
100 }
101
102 static void display_domain_controller_info_01(struct drsuapi_DsGetDCConnection01 *r)
103 {
104         printf("client_ip_address:\t%s\n", r->client_ip_address);
105         printf("unknown2:\t%d\n", r->unknown2);
106         printf("connection_time:\t%d\n", r->connection_time);
107         printf("unknown4:\t%d\n", r->unknown4);
108         printf("unknown5:\t%d\n", r->unknown5);
109         printf("unknown6:\t%d\n", r->unknown6);
110         printf("client_account:\t%s\n", r->client_account);
111 }
112
113 static void display_domain_controller_info_1(struct drsuapi_DsGetDCInfo1 *r)
114 {
115         printf("netbios_name:\t%s\n", r->netbios_name);
116         printf("dns_name:\t%s\n", r->dns_name);
117         printf("site_name:\t%s\n", r->site_name);
118         printf("computer_dn:\t%s\n", r->computer_dn);
119         printf("server_dn:\t%s\n", r->server_dn);
120         printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false");
121         printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false");
122 }
123
124 static void display_domain_controller_info_2(struct drsuapi_DsGetDCInfo2 *r)
125 {
126         printf("netbios_name:\t%s\n", r->netbios_name);
127         printf("dns_name:\t%s\n", r->dns_name);
128         printf("site_name:\t%s\n", r->site_name);
129         printf("site_dn:\t%s\n", r->site_dn);
130         printf("computer_dn:\t%s\n", r->computer_dn);
131         printf("server_dn:\t%s\n", r->server_dn);
132         printf("ntds_dn:\t%s\n", r->ntds_dn);
133         printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false");
134         printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false");
135         printf("is_gc:\t\t%s\n", r->is_gc ? "true" : "false");
136         printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r->site_guid));
137         printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r->computer_guid));
138         printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r->server_guid));
139         printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r->ntds_guid));
140 }
141
142 static void display_domain_controller_info_3(struct drsuapi_DsGetDCInfo3 *r)
143 {
144         printf("netbios_name:\t%s\n", r->netbios_name);
145         printf("dns_name:\t%s\n", r->dns_name);
146         printf("site_name:\t%s\n", r->site_name);
147         printf("site_dn:\t%s\n", r->site_dn);
148         printf("computer_dn:\t%s\n", r->computer_dn);
149         printf("server_dn:\t%s\n", r->server_dn);
150         printf("ntds_dn:\t%s\n", r->ntds_dn);
151         printf("is_pdc:\t\t%s\n", r->is_pdc ? "true" : "false");
152         printf("is_enabled:\t%s\n", r->is_enabled ? "true" : "false");
153         printf("is_gc:\t\t%s\n", r->is_gc ? "true" : "false");
154         printf("is_rodc:\t%s\n", r->is_rodc ? "true" : "false");
155         printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r->site_guid));
156         printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r->computer_guid));
157         printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r->server_guid));
158         printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r->ntds_guid));
159 }
160
161 static void display_domain_controller_info(int32_t level,
162                                            union drsuapi_DsGetDCInfoCtr *ctr)
163 {
164         int i;
165
166         switch (level) {
167                 case DRSUAPI_DC_CONNECTION_CTR_01:
168                         for (i=0; i<ctr->ctr01.count; i++) {
169                                 printf("----------\n");
170                                 display_domain_controller_info_01(&ctr->ctr01.array[i]);
171                         }
172                         break;
173                 case DRSUAPI_DC_INFO_CTR_1:
174                         for (i=0; i<ctr->ctr1.count; i++) {
175                                 printf("----------\n");
176                                 display_domain_controller_info_1(&ctr->ctr1.array[i]);
177                         }
178                         break;
179                 case DRSUAPI_DC_INFO_CTR_2:
180                         for (i=0; i<ctr->ctr2.count; i++) {
181                                 printf("----------\n");
182                                 display_domain_controller_info_2(&ctr->ctr2.array[i]);
183                         }
184                         break;
185                 case DRSUAPI_DC_INFO_CTR_3:
186                         for (i=0; i<ctr->ctr3.count; i++) {
187                                 printf("----------\n");
188                                 display_domain_controller_info_3(&ctr->ctr3.array[i]);
189                         }
190                         break;
191                 default:
192                         break;
193         }
194 }
195
196 static WERROR cmd_drsuapi_getdcinfo(struct rpc_pipe_client *cli,
197                                     TALLOC_CTX *mem_ctx, int argc,
198                                     const char **argv)
199 {
200         NTSTATUS status;
201         WERROR werr;
202
203         struct GUID bind_guid;
204         struct policy_handle bind_handle;
205
206         const char *domain = NULL;
207         int32_t level = 1;
208         int32_t level_out;
209         union drsuapi_DsGetDCInfoRequest req;
210         union drsuapi_DsGetDCInfoCtr ctr;
211
212         if (argc < 2) {
213                 printf("usage: %s domain [level]\n", argv[0]);
214                 return WERR_OK;
215         }
216
217         domain = argv[1];
218         if (argc >= 3) {
219                 level = atoi(argv[2]);
220         }
221
222         GUID_from_string(DRSUAPI_DS_BIND_GUID, &bind_guid);
223
224         status = rpccli_drsuapi_DsBind(cli, mem_ctx,
225                                        &bind_guid,
226                                        NULL,
227                                        &bind_handle,
228                                        &werr);
229
230         if (!NT_STATUS_IS_OK(status)) {
231                 return ntstatus_to_werror(status);
232         }
233
234         req.req1.domain_name = domain;
235         req.req1.level = level;
236
237         status = rpccli_drsuapi_DsGetDomainControllerInfo(cli, mem_ctx,
238                                                           &bind_handle,
239                                                           1,
240                                                           &req,
241                                                           &level_out,
242                                                           &ctr,
243                                                           &werr);
244         if (!NT_STATUS_IS_OK(status)) {
245                 werr = ntstatus_to_werror(status);
246                 goto out;
247         }
248
249         if (!W_ERROR_IS_OK(werr)) {
250                 goto out;
251         }
252
253         display_domain_controller_info(level_out, &ctr);
254  out:
255         if (is_valid_policy_hnd(&bind_handle)) {
256                 rpccli_drsuapi_DsUnbind(cli, mem_ctx, &bind_handle, &werr);
257         }
258
259         return werr;
260 }
261
262 /* List of commands exported by this module */
263
264 struct cmd_set drsuapi_commands[] = {
265
266         { "DRSUAPI" },
267         { "dscracknames", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_cracknames, PI_DRSUAPI, NULL, "Crack Name", "" },
268         { "dsgetdcinfo", RPC_RTYPE_WERROR, NULL, cmd_drsuapi_getdcinfo, PI_DRSUAPI, NULL, "Get Domain Controller Info", "" },
269         { NULL }
270 };