summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/smbpasswd.c36
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;