summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-08-02 23:46:01 +0000
committerJeremy Allison <jra@samba.org>2001-08-02 23:46:01 +0000
commit310e79d01834d7373a2e99a18bb2c6056f089461 (patch)
treec993a9d411681664f9cf19f7294ea87d57f5b2c2
parent58731d695e4e4e07e02bc276ba100d05dd14b1e7 (diff)
downloadsamba-310e79d01834d7373a2e99a18bb2c6056f089461.tar.gz
samba-310e79d01834d7373a2e99a18bb2c6056f089461.tar.xz
samba-310e79d01834d7373a2e99a18bb2c6056f089461.zip
Allow smbpasswd to join a domain like samedit against a W2K AD server.
Jeremy.
-rw-r--r--source/include/proto.h2
-rw-r--r--source/include/rpc_samr.h1
-rw-r--r--source/rpc_parse/parse_samr.c7
-rw-r--r--source/utils/smbpasswd.c13
4 files changed, 18 insertions, 5 deletions
diff --git a/source/include/proto.h b/source/include/proto.h
index 33a46ab108a..84bc5a01d3c 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -3167,7 +3167,7 @@ void init_sam_user_info11(SAM_USER_INFO_11 * usr,
NTTIME * expiry,
char *mach_acct,
uint32 rid_user, uint32 rid_group, uint16 acct_ctrl);
-void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516]);
+void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516], uint16 pw_len);
void init_sam_user_info23W(SAM_USER_INFO_23 * usr, NTTIME * logon_time, /* all zeros */
NTTIME * logoff_time, /* all zeros */
NTTIME * kickoff_time, /* all zeros */
diff --git a/source/include/rpc_samr.h b/source/include/rpc_samr.h
index cdfb19580de..c3bd20921dd 100644
--- a/source/include/rpc_samr.h
+++ b/source/include/rpc_samr.h
@@ -217,6 +217,7 @@ typedef struct sam_user_info_23
typedef struct sam_user_info_24
{
uint8 pass[516];
+ uint16 pw_len;
} SAM_USER_INFO_24;
/*
diff --git a/source/rpc_parse/parse_samr.c b/source/rpc_parse/parse_samr.c
index 0ad79b5f953..dabf8d9a8ed 100644
--- a/source/rpc_parse/parse_samr.c
+++ b/source/rpc_parse/parse_samr.c
@@ -5149,10 +5149,11 @@ static BOOL sam_io_user_info11(char *desc, SAM_USER_INFO_11 * usr,
*************************************************************************/
-void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516])
+void init_sam_user_info24(SAM_USER_INFO_24 * usr, char newpass[516], uint16 pw_len)
{
DEBUG(10, ("init_sam_user_info24:\n"));
memcpy(usr->pass, newpass, sizeof(usr->pass));
+ usr->pw_len = pw_len;
}
/*******************************************************************
@@ -5174,6 +5175,10 @@ static BOOL sam_io_user_info24(char *desc, SAM_USER_INFO_24 * usr,
if(!prs_uint8s(False, "password", ps, depth, usr->pass, sizeof(usr->pass)))
return False;
+ if (MARSHALLING(ps) && (usr->pw_len != 0)) {
+ if (!prs_uint16("pw_len", ps, depth, &usr->pw_len))
+ return False;
+ }
if(!prs_align(ps))
return False;
diff --git a/source/utils/smbpasswd.c b/source/utils/smbpasswd.c
index 538b8864349..a32cb7e0529 100644
--- a/source/utils/smbpasswd.c
+++ b/source/utils/smbpasswd.c
@@ -290,7 +290,12 @@ static int join_domain_byuser(char *domain, char *remote_machine,
acct_name, ACB_WSTRUST,
unknown, &user_pol,
&user_rid);
- }
+
+ /* We *must* do this.... don't ask... */
+
+ CHECK_RPC_ERR_DEBUG(cli_samr_close(&cli, mem_ctx, &user_pol), ("error closing user policy"));
+ result = NT_STATUS_USER_EXISTS;
+ }
if (result == NT_STATUS_USER_EXISTS) {
uint32 num_rids, *name_types, *user_rids;
@@ -356,7 +361,7 @@ static int join_domain_byuser(char *domain, char *remote_machine,
ZERO_STRUCT(ctr);
ZERO_STRUCT(p24);
- init_sam_user_info24(&p24, pwbuf);
+ init_sam_user_info24(&p24, pwbuf,24);
ctr.switch_value = 24;
ctr.info.id24 = &p24;
@@ -380,6 +385,7 @@ static int join_domain_byuser(char *domain, char *remote_machine,
seems to cope with either value so don't bomb out if the set
userinfo2 level 0x10 fails. -tpot */
+ ZERO_STRUCT(ctr);
ctr.switch_value = 0x10;
ctr.info.id10 = &p10;
@@ -549,7 +555,7 @@ static int process_root(int argc, char *argv[])
char *old_passwd = NULL;
char *remote_machine = NULL;
- while ((ch = getopt(argc, argv, "ax:d:e:mnj:r:sR:D:U:L")) != EOF) {
+ while ((ch = getopt(argc, argv, "ax:d:e:hmnj:r:sR:D:U:L")) != EOF) {
switch(ch) {
case 'L':
local_mode = True;
@@ -613,6 +619,7 @@ static int process_root(int argc, char *argv[])
break;
}
+ case 'h':
default:
usage();
}