diff options
Diffstat (limited to 'source3/utils')
-rw-r--r-- | source3/utils/smbpasswd.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/source3/utils/smbpasswd.c b/source3/utils/smbpasswd.c index e1c6666820..29f2d364e5 100644 --- a/source3/utils/smbpasswd.c +++ b/source3/utils/smbpasswd.c @@ -69,6 +69,7 @@ static void usage(void) printf(" -e enable user\n"); printf(" -n set no password\n"); printf(" -m workstation trust account\n"); + printf(" -b backup domain controller account\n"); printf(" -i inter-domain trust account\n"); printf(" -p user cannot change password\n"); printf(" -x user can change password\n"); @@ -86,19 +87,23 @@ static int join_domain(char *domain, char *remote) fstring trust_passwd; unsigned char orig_trust_passwd_hash[16]; BOOL ret; + uint16 sec_chan; pstrcpy(remote_machine, remote ? remote : ""); fstrcpy(trust_passwd, global_myname); strlower(trust_passwd); E_md4hash( (uchar *)trust_passwd, orig_trust_passwd_hash); - /* Ensure that we are not trying to join a - domain if we are locally set up as a domain - controller. */ - - if(strequal(remote, global_myname)) { - fprintf(stderr, "Cannot join domain %s as the domain controller name is our own. We cannot be a domain controller for a domain and also be a domain member.\n", domain); - return 1; + switch (lp_server_role()) + { + case ROLE_DOMAIN_PDC: + DEBUG(0, ("Cannot join domain - we are PDC!\n")); + return; + case ROLE_DOMAIN_BDC: + sec_chan = SEC_CHAN_BDC; + break; + default: + sec_chan = SEC_CHAN_WKSTA; } /* @@ -136,7 +141,7 @@ unable to join domain.\n"); return 1; } - ret = change_trust_account_password( domain, remote_machine); + ret = change_trust_account_password(domain, remote_machine, sec_chan); trust_password_unlock(); if(!ret) { @@ -283,6 +288,7 @@ static int process_root(int argc, char *argv[]) uint16 acb_mask = 0; BOOL joining_domain = False; BOOL wks_trust_account = False; + BOOL srv_trust_account = False; BOOL dom_trust_account = False; BOOL add_user = False; BOOL disable_user = False; @@ -297,7 +303,7 @@ static int process_root(int argc, char *argv[]) char *old_passwd = NULL; char *remote_machine = NULL; - while ((ch = getopt(argc, argv, "adehimnpxj:r:sR:D:U:")) != EOF) + while ((ch = getopt(argc, argv, "abdehimnpxj:r:sR:D:U:")) != EOF) { switch(ch) { @@ -350,6 +356,11 @@ static int process_root(int argc, char *argv[]) dom_trust_account = True; break; } + case 'b': + { + srv_trust_account = True; + break; + } case 'm': { wks_trust_account = True; @@ -429,7 +440,7 @@ static int process_root(int argc, char *argv[]) exit(1); } - if (wks_trust_account || dom_trust_account) + if (wks_trust_account || srv_trust_account || dom_trust_account) { /* add the $ automatically */ static fstring buf; @@ -529,6 +540,11 @@ static int process_root(int argc, char *argv[]) acb_mask |= ACB_WSTRUST; acb_info |= ACB_WSTRUST; } + else if (srv_trust_account) + { + acb_mask |= ACB_SVRTRUST; + acb_info |= ACB_SVRTRUST; + } else if (dom_trust_account) { acb_mask |= ACB_DOMTRUST; |