mirror of
https://github.com/samba-team/samba.git
synced 2025-03-12 20:58:37 +03:00
This adds in the newly attached secrets handling, as well as an interface to the command line 'net' tool. Andrew Bartlett (This used to be commit 1282e3c39479aa580124206814b493370d10690a)
170 lines
4.8 KiB
C
170 lines
4.8 KiB
C
/*
|
|
Samba Unix/Linux SMB client library
|
|
Distributed SMB/CIFS Server Management Utility
|
|
|
|
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 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "includes.h"
|
|
#include "utils/net/net.h"
|
|
#include "libnet/libnet.h"
|
|
#include "libcli/security/security.h"
|
|
#include "param/param.h"
|
|
|
|
int net_join(struct net_context *ctx, int argc, const char **argv)
|
|
{
|
|
NTSTATUS status;
|
|
struct libnet_context *libnetctx;
|
|
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 */
|
|
return net_join_usage(ctx, argc, argv);
|
|
case 1: /* only DOMAIN */
|
|
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
|
|
break;
|
|
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(NULL, ctx->lp_ctx);
|
|
if (!libnetctx) {
|
|
return -1;
|
|
}
|
|
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(ctx->lp_ctx);
|
|
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_Join(libnetctx, r, r);
|
|
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
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));
|
|
|
|
talloc_free(libnetctx);
|
|
return 0;
|
|
}
|
|
|
|
int net_join_usage(struct net_context *ctx, int argc, const char **argv)
|
|
{
|
|
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("Joins domain as either member or backup domain controller.\n");
|
|
return 0;
|
|
}
|
|
|
|
int net_vampire(struct net_context *ctx, int argc, const char **argv)
|
|
{
|
|
NTSTATUS status;
|
|
struct libnet_context *libnetctx;
|
|
struct libnet_Vampire *r;
|
|
char *tmp, *targetdir = NULL;
|
|
const char *domain_name;
|
|
|
|
switch (argc) {
|
|
case 0: /* no args -> fail */
|
|
return net_vampire_usage(ctx, argc, argv);
|
|
case 1: /* only DOMAIN */
|
|
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
|
|
break;
|
|
case 2: /* domain and target dir */
|
|
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
|
|
targetdir = talloc_strdup(ctx->mem_ctx, argv[1]);
|
|
break;
|
|
default: /* too many args -> fail */
|
|
return net_vampire_usage(ctx, argc, argv);
|
|
}
|
|
|
|
domain_name = tmp;
|
|
|
|
libnetctx = libnet_context_init(NULL, ctx->lp_ctx);
|
|
if (!libnetctx) {
|
|
return -1;
|
|
}
|
|
libnetctx->cred = ctx->credentials;
|
|
r = talloc(ctx->mem_ctx, struct libnet_Vampire);
|
|
if (!r) {
|
|
return -1;
|
|
}
|
|
/* prepare parameters for the vampire */
|
|
r->in.netbios_name = lp_netbios_name(ctx->lp_ctx);
|
|
r->in.domain_name = domain_name;
|
|
r->in.targetdir = targetdir;
|
|
r->out.error_string = NULL;
|
|
|
|
/* do the domain vampire */
|
|
status = libnet_Vampire(libnetctx, r, r);
|
|
|
|
if (!NT_STATUS_IS_OK(status)) {
|
|
d_fprintf(stderr, "Vampire of 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("Vampired domain %s (%s)\n", r->out.domain_name, dom_sid_string(ctx->mem_ctx, r->out.domain_sid));
|
|
|
|
talloc_free(libnetctx);
|
|
return 0;
|
|
}
|
|
|
|
int net_vampire_usage(struct net_context *ctx, int argc, const char **argv)
|
|
{
|
|
d_printf("net vampire <domain> [options]\n");
|
|
return 0;
|
|
}
|
|
|
|
int net_vampire_help(struct net_context *ctx, int argc, const char **argv)
|
|
{
|
|
d_printf("Vampires domain as either member or backup domain controller.\n");
|
|
return 0;
|
|
}
|