2 Unix SMB/CIFS implementation.
5 Copyright (C) Guenther Deschner 2008
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.
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.
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/>.
22 #include "rpcclient.h"
24 static WERROR
cracknames(struct rpc_pipe_client
*cli
,
26 struct policy_handle
*bind_handle
,
27 enum drsuapi_DsNameFormat format_offered
,
28 enum drsuapi_DsNameFormat format_desired
,
31 union drsuapi_DsNameCtr
*ctr
)
37 union drsuapi_DsNameRequest req
;
39 struct drsuapi_DsNameString
*names
;
41 names
= TALLOC_ZERO_ARRAY(mem_ctx
, struct drsuapi_DsNameString
, argc
);
42 W_ERROR_HAVE_NO_MEMORY(names
);
44 for (i
=0; i
<argc
; i
++) {
45 names
[i
].str
= argv
[i
];
48 req
.req1
.codepage
= 1252; /* german */
49 req
.req1
.language
= 0x00000407; /* german */
50 req
.req1
.count
= argc
;
51 req
.req1
.names
= names
;
52 req
.req1
.format_flags
= DRSUAPI_DS_NAME_FLAG_NO_FLAGS
;
53 req
.req1
.format_offered
= format_offered
;
54 req
.req1
.format_desired
= format_desired
;
56 status
= rpccli_drsuapi_DsCrackNames(cli
, mem_ctx
,
63 if (!NT_STATUS_IS_OK(status
)) {
64 return ntstatus_to_werror(status
);
67 if (!W_ERROR_IS_OK(werr
)) {
74 static WERROR
cmd_drsuapi_cracknames(struct rpc_pipe_client
*cli
,
75 TALLOC_CTX
*mem_ctx
, int argc
,
82 struct GUID bind_guid
;
83 struct policy_handle bind_handle
;
85 union drsuapi_DsNameCtr ctr
;
88 printf("usage: %s name\n", argv
[0]);
92 GUID_from_string(DRSUAPI_DS_BIND_GUID
, &bind_guid
);
94 status
= rpccli_drsuapi_DsBind(cli
, mem_ctx
,
100 if (!NT_STATUS_IS_OK(status
)) {
101 return ntstatus_to_werror(status
);
104 werr
= cracknames(cli
, mem_ctx
,
106 DRSUAPI_DS_NAME_FORMAT_UKNOWN
,
107 DRSUAPI_DS_NAME_FORMAT_FQDN_1779
,
112 if (!W_ERROR_IS_OK(werr
)) {
116 for (i
=0; i
< ctr
.ctr1
->count
; i
++) {
117 printf("status: %d\n",
118 ctr
.ctr1
->array
[i
].status
);
119 printf("dns_domain_name: %s\n",
120 ctr
.ctr1
->array
[i
].dns_domain_name
);
121 printf("result_name: %s\n",
122 ctr
.ctr1
->array
[i
].result_name
);
126 if (is_valid_policy_hnd(&bind_handle
)) {
127 rpccli_drsuapi_DsUnbind(cli
, mem_ctx
, &bind_handle
, &werr
);
133 static void display_domain_controller_info_01(struct drsuapi_DsGetDCConnection01
*r
)
135 printf("client_ip_address:\t%s\n", r
->client_ip_address
);
136 printf("unknown2:\t%d\n", r
->unknown2
);
137 printf("connection_time:\t%d\n", r
->connection_time
);
138 printf("unknown4:\t%d\n", r
->unknown4
);
139 printf("unknown5:\t%d\n", r
->unknown5
);
140 printf("unknown6:\t%d\n", r
->unknown6
);
141 printf("client_account:\t%s\n", r
->client_account
);
144 static void display_domain_controller_info_1(struct drsuapi_DsGetDCInfo1
*r
)
146 printf("netbios_name:\t%s\n", r
->netbios_name
);
147 printf("dns_name:\t%s\n", r
->dns_name
);
148 printf("site_name:\t%s\n", r
->site_name
);
149 printf("computer_dn:\t%s\n", r
->computer_dn
);
150 printf("server_dn:\t%s\n", r
->server_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");
155 static void display_domain_controller_info_2(struct drsuapi_DsGetDCInfo2
*r
)
157 printf("netbios_name:\t%s\n", r
->netbios_name
);
158 printf("dns_name:\t%s\n", r
->dns_name
);
159 printf("site_name:\t%s\n", r
->site_name
);
160 printf("site_dn:\t%s\n", r
->site_dn
);
161 printf("computer_dn:\t%s\n", r
->computer_dn
);
162 printf("server_dn:\t%s\n", r
->server_dn
);
163 printf("ntds_dn:\t%s\n", r
->ntds_dn
);
164 printf("is_pdc:\t\t%s\n", r
->is_pdc
? "true" : "false");
165 printf("is_enabled:\t%s\n", r
->is_enabled
? "true" : "false");
166 printf("is_gc:\t\t%s\n", r
->is_gc
? "true" : "false");
167 printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r
->site_guid
));
168 printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r
->computer_guid
));
169 printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r
->server_guid
));
170 printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r
->ntds_guid
));
173 static void display_domain_controller_info_3(struct drsuapi_DsGetDCInfo3
*r
)
175 printf("netbios_name:\t%s\n", r
->netbios_name
);
176 printf("dns_name:\t%s\n", r
->dns_name
);
177 printf("site_name:\t%s\n", r
->site_name
);
178 printf("site_dn:\t%s\n", r
->site_dn
);
179 printf("computer_dn:\t%s\n", r
->computer_dn
);
180 printf("server_dn:\t%s\n", r
->server_dn
);
181 printf("ntds_dn:\t%s\n", r
->ntds_dn
);
182 printf("is_pdc:\t\t%s\n", r
->is_pdc
? "true" : "false");
183 printf("is_enabled:\t%s\n", r
->is_enabled
? "true" : "false");
184 printf("is_gc:\t\t%s\n", r
->is_gc
? "true" : "false");
185 printf("is_rodc:\t%s\n", r
->is_rodc
? "true" : "false");
186 printf("site_guid:\t%s\n", GUID_string(talloc_tos(), &r
->site_guid
));
187 printf("computer_guid:\t%s\n", GUID_string(talloc_tos(), &r
->computer_guid
));
188 printf("server_guid:\t%s\n", GUID_string(talloc_tos(), &r
->server_guid
));
189 printf("ntds_guid:\t%s\n", GUID_string(talloc_tos(), &r
->ntds_guid
));
192 static void display_domain_controller_info(int32_t level
,
193 union drsuapi_DsGetDCInfoCtr
*ctr
)
198 case DRSUAPI_DC_CONNECTION_CTR_01
:
199 for (i
=0; i
<ctr
->ctr01
.count
; i
++) {
200 printf("----------\n");
201 display_domain_controller_info_01(&ctr
->ctr01
.array
[i
]);
204 case DRSUAPI_DC_INFO_CTR_1
:
205 for (i
=0; i
<ctr
->ctr1
.count
; i
++) {
206 printf("----------\n");
207 display_domain_controller_info_1(&ctr
->ctr1
.array
[i
]);
210 case DRSUAPI_DC_INFO_CTR_2
:
211 for (i
=0; i
<ctr
->ctr2
.count
; i
++) {
212 printf("----------\n");
213 display_domain_controller_info_2(&ctr
->ctr2
.array
[i
]);
216 case DRSUAPI_DC_INFO_CTR_3
:
217 for (i
=0; i
<ctr
->ctr3
.count
; i
++) {
218 printf("----------\n");
219 display_domain_controller_info_3(&ctr
->ctr3
.array
[i
]);
227 static WERROR
cmd_drsuapi_getdcinfo(struct rpc_pipe_client
*cli
,
228 TALLOC_CTX
*mem_ctx
, int argc
,
234 struct GUID bind_guid
;
235 struct policy_handle bind_handle
;
237 const char *domain
= NULL
;
240 union drsuapi_DsGetDCInfoRequest req
;
241 union drsuapi_DsGetDCInfoCtr ctr
;
244 printf("usage: %s domain [level]\n", argv
[0]);
250 level
= atoi(argv
[2]);
253 GUID_from_string(DRSUAPI_DS_BIND_GUID
, &bind_guid
);
255 status
= rpccli_drsuapi_DsBind(cli
, mem_ctx
,
261 if (!NT_STATUS_IS_OK(status
)) {
262 return ntstatus_to_werror(status
);
265 req
.req1
.domain_name
= domain
;
266 req
.req1
.level
= level
;
268 status
= rpccli_drsuapi_DsGetDomainControllerInfo(cli
, mem_ctx
,
275 if (!NT_STATUS_IS_OK(status
)) {
276 werr
= ntstatus_to_werror(status
);
280 if (!W_ERROR_IS_OK(werr
)) {
284 display_domain_controller_info(level_out
, &ctr
);
286 if (is_valid_policy_hnd(&bind_handle
)) {
287 rpccli_drsuapi_DsUnbind(cli
, mem_ctx
, &bind_handle
, &werr
);
293 /* List of commands exported by this module */
295 struct cmd_set drsuapi_commands
[] = {
298 { "dscracknames", RPC_RTYPE_WERROR
, NULL
, cmd_drsuapi_cracknames
, PI_DRSUAPI
, NULL
, "Crack Name", "" },
299 { "dsgetdcinfo", RPC_RTYPE_WERROR
, NULL
, cmd_drsuapi_getdcinfo
, PI_DRSUAPI
, NULL
, "Get Domain Controller Info", "" },