Samba Unix/Linux SMB client library
Distributed SMB/CIFS Server Management Utility
- Copyright (C) 2004 Stefan Metzmacher (metze@samba.org)
+ Copyright (C) 2004 Stefan Metzmacher <metze@samba.org>
+ Copyright (C) 2005 Andrew Bartlett <abartlet@samba.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "utils/net/net.h"
#include "libnet/libnet.h"
-#include "librpc/gen_ndr/ndr_samr.h"
+#include "libcli/security/security.h"
+#include "param/param.h"
-static int net_join_domain(struct net_context *ctx, int argc, const char **argv)
+int net_join(struct net_context *ctx, int argc, const char **argv)
{
NTSTATUS status;
struct libnet_context *libnetctx;
- union libnet_JoinDomain r;
+ struct libnet_Join *r;
char *tmp;
const char *domain_name;
+ enum netr_SchannelType secure_channel_type = SEC_CHAN_WKSTA;
switch (argc) {
case 0: /* no args -> fail */
- DEBUG(0,("net_join_domain: no args\n"));
- return -1;
+ return net_join_usage(ctx, argc, argv);
case 1: /* only DOMAIN */
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
break;
- default: /* too mayn args -> fail */
- DEBUG(0,("net_join_domain: too many args [%d]\n",argc));
- return -1;
+ case 2: /* DOMAIN and role */
+ tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
+ if (strcasecmp(argv[1], "BDC") == 0) {
+ secure_channel_type = SEC_CHAN_BDC;
+ } else if (strcasecmp(argv[1], "MEMBER") == 0) {
+ secure_channel_type = SEC_CHAN_WKSTA;
+ } else {
+ d_fprintf(stderr, "net_join: Invalid 2nd argument (%s) must be MEMBER or BDC\n", argv[1]);
+ return net_join_usage(ctx, argc, argv);
+ }
+ break;
+ default: /* too many args -> fail */
+ return net_join_usage(ctx, argc, argv);
}
domain_name = tmp;
- libnetctx = libnet_context_init();
+ libnetctx = libnet_context_init(NULL);
if (!libnetctx) {
return -1;
}
- libnetctx->user.account_name = ctx->user.account_name;
- libnetctx->user.domain_name = ctx->user.domain_name;
- libnetctx->user.password = ctx->user.password;
-
- /* prepare password change */
- r.generic.level = LIBNET_JOIN_DOMAIN_GENERIC;
- r.generic.in.domain_name = domain_name;
- r.generic.in.account_name = talloc_asprintf(ctx->mem_ctx, "%s$", lp_netbios_name());
- r.generic.in.acct_type = ACB_SVRTRUST;
+ libnetctx->cred = ctx->credentials;
+ r = talloc(ctx->mem_ctx, struct libnet_Join);
+ if (!r) {
+ return -1;
+ }
+ /* prepare parameters for the join */
+ r->in.netbios_name = lp_netbios_name(global_loadparm);
+ r->in.domain_name = domain_name;
+ r->in.join_type = secure_channel_type;
+ r->in.level = LIBNET_JOIN_AUTOMATIC;
+ r->out.error_string = NULL;
/* do the domain join */
- status = libnet_JoinDomain(libnetctx, ctx->mem_ctx, &r);
+ status = libnet_Join(libnetctx, r, r);
+
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(0,("net_join_domain: %s\n",r.generic.out.error_string));
+ d_fprintf(stderr, "Joining domain failed: %s\n",
+ r->out.error_string ? r->out.error_string : nt_errstr(status));
+ talloc_free(r);
+ talloc_free(libnetctx);
return -1;
}
+ d_printf("Joined domain %s (%s)\n", r->out.domain_name, dom_sid_string(ctx->mem_ctx, r->out.domain_sid));
- libnet_context_destroy(&libnetctx);
-
+ talloc_free(libnetctx);
return 0;
}
-static int net_join_domain_usage(struct net_context *ctx, int argc, const char **argv)
-{
- d_printf("net_join_domain_usage: TODO\n");
- return 0;
-}
-
-static int net_join_domain_help(struct net_context *ctx, int argc, const char **argv)
-{
- d_printf("net_join_domain_help: TODO\n");
- return 0;
-}
-
-static const struct net_functable net_password_functable[] = {
- {"domain", net_join_domain, net_join_domain_usage, net_join_domain_help},
- {NULL, NULL}
-};
-
-int net_join(struct net_context *ctx, int argc, const char **argv)
-{
-
- return net_run_function(ctx, argc, argv, net_password_functable, net_password_usage);
-}
-
int net_join_usage(struct net_context *ctx, int argc, const char **argv)
{
- d_printf("net_password_usage: TODO\n");
+ d_printf("net join <domain> [BDC | MEMBER] [options]\n");
return 0;
}
int net_join_help(struct net_context *ctx, int argc, const char **argv)
{
- d_printf("net_password_help: TODO\n");
+ d_printf("Joins domain as either member or backup domain controller.\n");
return 0;
}