2 * Unix SMB/CIFS implementation.
3 * NetApi LogonControl Support
4 * Copyright (C) Guenther Deschner 2009
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 #include "../librpc/gen_ndr/cli_netlogon.h"
23 #include "librpc/gen_ndr/libnetapi.h"
24 #include "lib/netapi/netapi.h"
25 #include "lib/netapi/netapi_private.h"
26 #include "lib/netapi/libnetapi.h"
28 static WERROR construct_data(enum netr_LogonControlCode function_code,
29 const uint8_t *data_in,
30 union netr_CONTROL_DATA_INFORMATION *data_out)
32 switch (function_code) {
33 case NETLOGON_CONTROL_QUERY:
34 case NETLOGON_CONTROL_REDISCOVER:
35 case NETLOGON_CONTROL_TC_QUERY:
36 case NETLOGON_CONTROL_CHANGE_PASSWORD:
37 case NETLOGON_CONTROL_TC_VERIFY:
38 data_out->domain = (const char *)data_in;
40 case NETLOGON_CONTROL_FIND_USER:
41 data_out->user = (const char *)data_in;
43 case NETLOGON_CONTROL_SET_DBFLAG:
44 data_out->debug_level = atoi((const char *)data_in);
47 return WERR_INVALID_PARAM;
53 static WERROR construct_buffer(TALLOC_CTX *mem_ctx,
55 union netr_CONTROL_QUERY_INFORMATION *q,
58 struct NETLOGON_INFO_1 *i1;
59 struct NETLOGON_INFO_2 *i2;
60 struct NETLOGON_INFO_3 *i3;
61 struct NETLOGON_INFO_4 *i4;
64 return WERR_INVALID_PARAM;
69 i1 = talloc(mem_ctx, struct NETLOGON_INFO_1);
70 W_ERROR_HAVE_NO_MEMORY(i1);
72 i1->netlog1_flags = q->info1->flags;
73 i1->netlog1_pdc_connection_status = W_ERROR_V(q->info1->pdc_connection_status);
75 *buffer = (uint8_t *)i1;
79 i2 = talloc(mem_ctx, struct NETLOGON_INFO_2);
80 W_ERROR_HAVE_NO_MEMORY(i2);
82 i2->netlog2_flags = q->info2->flags;
83 i2->netlog2_pdc_connection_status = W_ERROR_V(q->info2->pdc_connection_status);
84 i2->netlog2_trusted_dc_name = talloc_strdup(mem_ctx, q->info2->trusted_dc_name);
85 i2->netlog2_tc_connection_status = W_ERROR_V(q->info2->tc_connection_status);
87 *buffer = (uint8_t *)i2;
91 i3 = talloc(mem_ctx, struct NETLOGON_INFO_3);
92 W_ERROR_HAVE_NO_MEMORY(i3);
94 i3->netlog1_flags = q->info3->flags;
95 i3->netlog3_logon_attempts = q->info3->logon_attempts;
96 i3->netlog3_reserved1 = q->info3->unknown1;
97 i3->netlog3_reserved2 = q->info3->unknown2;
98 i3->netlog3_reserved3 = q->info3->unknown3;
99 i3->netlog3_reserved4 = q->info3->unknown4;
100 i3->netlog3_reserved5 = q->info3->unknown5;
102 *buffer = (uint8_t *)i3;
106 i4 = talloc(mem_ctx, struct NETLOGON_INFO_4);
107 W_ERROR_HAVE_NO_MEMORY(i4);
109 i4->netlog4_trusted_dc_name = talloc_strdup(mem_ctx, q->info4->trusted_dc_name);
110 i4->netlog4_trusted_domain_name = talloc_strdup(mem_ctx, q->info4->trusted_domain_name);
112 *buffer = (uint8_t *)i4;
116 return WERR_UNKNOWN_LEVEL;
121 /****************************************************************
122 ****************************************************************/
124 WERROR I_NetLogonControl_r(struct libnetapi_ctx *ctx,
125 struct I_NetLogonControl *r)
129 struct rpc_pipe_client *pipe_cli = NULL;
130 union netr_CONTROL_QUERY_INFORMATION query;
132 werr = libnetapi_open_pipe(ctx, r->in.server_name,
133 &ndr_table_netlogon.syntax_id,
135 if (!W_ERROR_IS_OK(werr)) {
139 status = rpccli_netr_LogonControl(pipe_cli, ctx,
145 if (!NT_STATUS_IS_OK(status)) {
146 werr = ntstatus_to_werror(status);
150 werr = construct_buffer(ctx, r->in.query_level, &query,
152 if (!W_ERROR_IS_OK(werr)) {
160 /****************************************************************
161 ****************************************************************/
163 WERROR I_NetLogonControl_l(struct libnetapi_ctx *ctx,
164 struct I_NetLogonControl *r)
166 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, I_NetLogonControl);
169 /****************************************************************
170 ****************************************************************/
172 WERROR I_NetLogonControl2_r(struct libnetapi_ctx *ctx,
173 struct I_NetLogonControl2 *r)
177 struct rpc_pipe_client *pipe_cli = NULL;
178 union netr_CONTROL_DATA_INFORMATION data;
179 union netr_CONTROL_QUERY_INFORMATION query;
181 werr = construct_data(r->in.function_code, r->in.data, &data);
182 if (!W_ERROR_IS_OK(werr)) {
186 werr = libnetapi_open_pipe(ctx, r->in.server_name,
187 &ndr_table_netlogon.syntax_id,
189 if (!W_ERROR_IS_OK(werr)) {
193 switch (r->in.function_code) {
194 case NETLOGON_CONTROL_TC_VERIFY:
195 case NETLOGON_CONTROL_SET_DBFLAG:
196 status = rpccli_netr_LogonControl2Ex(pipe_cli, ctx,
205 status = rpccli_netr_LogonControl2(pipe_cli, ctx,
215 if (!W_ERROR_IS_OK(werr)) {
219 if (!NT_STATUS_IS_OK(status)) {
220 werr = ntstatus_to_werror(status);
224 werr = construct_buffer(ctx, r->in.query_level, &query,
226 if (!W_ERROR_IS_OK(werr)) {
234 /****************************************************************
235 ****************************************************************/
237 WERROR I_NetLogonControl2_l(struct libnetapi_ctx *ctx,
238 struct I_NetLogonControl2 *r)
240 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, I_NetLogonControl2);