mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
r1951: add 'net password set' call
use it like:
net password set user
net password set DOM\\user
net password set user pass
net password set DOM\\user pass
net password set -U DOM\\Administrator%admpass DOM\\user pass
metze
(This used to be commit b660e5b9e6
)
This commit is contained in:
parent
a5ca84508c
commit
32ec317c90
@ -81,8 +81,90 @@ static int net_password_change_help(struct net_context *ctx, int argc, const cha
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int net_password_set(struct net_context *ctx, int argc, const char **argv)
|
||||
{
|
||||
NTSTATUS status;
|
||||
struct libnet_context *libnetctx;
|
||||
union libnet_SetPassword r;
|
||||
char *password_prompt = NULL;
|
||||
char *p;
|
||||
char *tmp;
|
||||
const char *account_name;
|
||||
const char *domain_name;
|
||||
const char *new_password = NULL;
|
||||
|
||||
switch (argc) {
|
||||
case 0: /* no args -> fail */
|
||||
DEBUG(0,("net_password_set: no args\n"));
|
||||
return -1;
|
||||
case 1: /* only DOM\\user; prompt for password */
|
||||
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
|
||||
break;
|
||||
case 2: /* DOM\\USER and password */
|
||||
tmp = talloc_strdup(ctx->mem_ctx, argv[0]);
|
||||
new_password = argv[1];
|
||||
break;
|
||||
default: /* too mayn args -> fail */
|
||||
DEBUG(0,("net_password_set: too many args [%d]\n",argc));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((p = strchr_m(tmp,'\\'))) {
|
||||
*p = 0;
|
||||
domain_name = tmp;
|
||||
account_name = talloc_strdup(ctx->mem_ctx, p+1);
|
||||
} else {
|
||||
account_name = tmp;
|
||||
domain_name = ctx->user.domain_name;
|
||||
}
|
||||
|
||||
if (!new_password) {
|
||||
password_prompt = talloc_asprintf(ctx->mem_ctx, "Enter new password for account [%s\\%s]:",
|
||||
domain_name, account_name);
|
||||
new_password = getpass(password_prompt);
|
||||
}
|
||||
|
||||
libnetctx = libnet_context_init();
|
||||
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_SET_PASSWORD_GENERIC;
|
||||
r.generic.in.account_name = account_name;
|
||||
r.generic.in.domain_name = domain_name;
|
||||
r.generic.in.newpassword = new_password;
|
||||
|
||||
/* do password change */
|
||||
status = libnet_SetPassword(libnetctx, ctx->mem_ctx, &r);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(0,("net_password_set: %s\n",r.generic.out.error_string));
|
||||
return -1;
|
||||
}
|
||||
|
||||
libnet_context_destroy(&libnetctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int net_password_set_usage(struct net_context *ctx, int argc, const char **argv)
|
||||
{
|
||||
d_printf("net_password_set_usage: TODO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int net_password_set_help(struct net_context *ctx, int argc, const char **argv)
|
||||
{
|
||||
d_printf("net_password_set_help: TODO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct net_functable const net_password_functable[] = {
|
||||
{"change", net_password_change, net_password_change_usage, net_password_change_help},
|
||||
{"set", net_password_set, net_password_set_usage, net_password_set_help},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user