diff options
| -rw-r--r-- | source3/lib/netapi/user.c | 124 | 
1 files changed, 123 insertions, 1 deletions
diff --git a/source3/lib/netapi/user.c b/source3/lib/netapi/user.c index faf1a6d65c..fe30b14d77 100644 --- a/source3/lib/netapi/user.c +++ b/source3/lib/netapi/user.c @@ -1296,7 +1296,129 @@ WERROR NetUserGetInfo_l(struct libnetapi_ctx *ctx,  WERROR NetUserSetInfo_r(struct libnetapi_ctx *ctx,  			struct NetUserSetInfo *r)  { -	return WERR_NOT_SUPPORTED; +	struct cli_state *cli = NULL; +	struct rpc_pipe_client *pipe_cli = NULL; +	NTSTATUS status; +	WERROR werr; + +	struct policy_handle connect_handle, domain_handle, builtin_handle, user_handle; +	struct lsa_String lsa_account_name; +	struct dom_sid2 *domain_sid = NULL; +	struct samr_Ids user_rids, name_types; +	union samr_UserInfo user_info; + +	struct USER_INFO_X uX; + +	ZERO_STRUCT(connect_handle); +	ZERO_STRUCT(domain_handle); +	ZERO_STRUCT(builtin_handle); +	ZERO_STRUCT(user_handle); + +	if (!r->in.buffer) { +		return WERR_INVALID_PARAM; +	} + +	switch (r->in.level) { +		case 0: +		case 1007: +			break; +		default: +			werr = WERR_NOT_SUPPORTED; +			goto done; +	} + +	werr = libnetapi_open_ipc_connection(ctx, r->in.server_name, &cli); +	if (!W_ERROR_IS_OK(werr)) { +		goto done; +	} + +	werr = libnetapi_open_pipe(ctx, cli, &ndr_table_samr.syntax_id, +				   &pipe_cli); +	if (!W_ERROR_IS_OK(werr)) { +		goto done; +	} + +	werr = libnetapi_samr_open_domain(ctx, pipe_cli, +					  SAMR_ACCESS_ENUM_DOMAINS | +					  SAMR_ACCESS_OPEN_DOMAIN, +					  SAMR_DOMAIN_ACCESS_LOOKUP_INFO_1 | +					  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT, +					  &connect_handle, +					  &domain_handle, +					  &domain_sid); +	if (!W_ERROR_IS_OK(werr)) { +		goto done; +	} + +	werr = libnetapi_samr_open_builtin_domain(ctx, pipe_cli, +						  SAMR_ACCESS_ENUM_DOMAINS | +						  SAMR_ACCESS_OPEN_DOMAIN, +						  SAMR_DOMAIN_ACCESS_OPEN_ACCOUNT | +						  SAMR_DOMAIN_ACCESS_LOOKUP_ALIAS, +						  &connect_handle, +						  &builtin_handle); +	if (!W_ERROR_IS_OK(werr)) { +		goto done; +	} + +	init_lsa_String(&lsa_account_name, r->in.user_name); + +	status = rpccli_samr_LookupNames(pipe_cli, ctx, +					 &domain_handle, +					 1, +					 &lsa_account_name, +					 &user_rids, +					 &name_types); +	if (!NT_STATUS_IS_OK(status)) { +		werr = ntstatus_to_werror(status); +		goto done; +	} + +	status = rpccli_samr_OpenUser(pipe_cli, ctx, +				      &domain_handle, +				      SAMR_USER_ACCESS_SET_ATTRIBUTES, +				      user_rids.ids[0], +				      &user_handle); +	if (!NT_STATUS_IS_OK(status)) { +		werr = ntstatus_to_werror(status); +		goto done; +	} + +	status = construct_USER_INFO_X(r->in.level, r->in.buffer, &uX); +	if (!NT_STATUS_IS_OK(status)) { +		werr = ntstatus_to_werror(status); +		goto done; +	} + +	convert_USER_INFO_X_to_samr_user_info21(&uX, &user_info.info21); + +	status = rpccli_samr_SetUserInfo(pipe_cli, ctx, +					 &user_handle, +					 21, +					 &user_info); +	if (!NT_STATUS_IS_OK(status)) { +		werr = ntstatus_to_werror(status); +		goto done; +	} + +	werr = WERR_OK; + + done: +	if (!cli) { +		return werr; +	} + +	if (is_valid_policy_hnd(&user_handle)) { +		rpccli_samr_Close(pipe_cli, ctx, &user_handle); +	} + +	if (ctx->disable_policy_handle_cache) { +		libnetapi_samr_close_domain_handle(ctx, &domain_handle); +		libnetapi_samr_close_builtin_handle(ctx, &builtin_handle); +		libnetapi_samr_close_connect_handle(ctx, &connect_handle); +	} + +	return werr;  }  /****************************************************************  | 
