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/libnetapi.h"
23 #include "lib/netapi/netapi.h"
24 #include "lib/netapi/netapi_private.h"
25 #include "lib/netapi/libnetapi.h"
26 #include "../librpc/gen_ndr/cli_netlogon.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
);