diff options
Diffstat (limited to 'source3/rpcclient/samsync.c')
-rw-r--r-- | source3/rpcclient/samsync.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/source3/rpcclient/samsync.c b/source3/rpcclient/samsync.c index 5b64cbc47d..14f7ed8953 100644 --- a/source3/rpcclient/samsync.c +++ b/source3/rpcclient/samsync.c @@ -396,19 +396,51 @@ static void usage(void) printf("\n"); } +/* Initialise client credentials for authenticated pipe access */ + +void init_rpcclient_creds(struct ntuser_creds *creds, char* username, + char* domain, char* password) +{ + ZERO_STRUCTP(creds); + + if (lp_encrypted_passwords()) { + pwd_make_lm_nt_16(&creds->pwd, password); + } else { + pwd_set_cleartext(&creds->pwd, password); + } + + fstrcpy(creds->user_name, username); + fstrcpy(creds->domain, domain); + + if (! *username) { + creds->pwd.null_pwd = True; + } +} + /* Connect to primary domain controller */ -static struct cli_state *init_connection(struct cli_state **cli, +static struct cli_state *init_connection(struct cli_state *cli, char *username, char *domain, char *password) { + struct ntuser_creds creds; extern pstring global_myname; struct in_addr *dest_ip; + struct nmb_name calling, called; int count; fstring dest_host; /* Initialise cli_state information */ + ZERO_STRUCTP(cli); + + if (!cli_initialise(cli)) { + return NULL; + } + + init_rpcclient_creds(&creds, username, domain, password); + cli_init_creds(cli, &creds); + /* Look up name of PDC controller */ if (!get_dc_list(True, lp_workgroup(), &dest_ip, &count)) { @@ -424,15 +456,20 @@ static struct cli_state *init_connection(struct cli_state **cli, return NULL; } - if (NT_STATUS_IS_OK(cli_full_connection(cli, global_myname, dest_host, - dest_ip, 0, - "IPC$", "IPC", - username, domain, - password, 0))) { - return *cli; - } else { + get_myname((*global_myname)?NULL:global_myname); + strupper(global_myname); + + make_nmb_name(&called, dns_to_netbios_name(dest_host), 0x20); + make_nmb_name(&calling, dns_to_netbios_name(global_myname), 0); + + /* Establish a SMB connection */ + + if (!cli_establish_connection(cli, dest_host, dest_ip, &calling, + &called, "IPC$", "IPC", False, True)) { return NULL; } + + return cli; } /* Main function */ @@ -440,7 +477,7 @@ static struct cli_state *init_connection(struct cli_state **cli, int main(int argc, char **argv) { BOOL do_sam_sync = False, do_sam_repl = False; - struct cli_state *cli; + struct cli_state cli; NTSTATUS result; int opt; pstring logfile; @@ -568,10 +605,10 @@ static struct cli_state *init_connection(struct cli_state **cli, return 1; if (do_sam_sync) - result = sam_sync(cli, trust_passwd, do_smbpasswd_output, verbose); + result = sam_sync(&cli, trust_passwd, do_smbpasswd_output, verbose); if (do_sam_repl) - result = sam_repl(cli, trust_passwd, low_serial); + result = sam_repl(&cli, trust_passwd, low_serial); if (!NT_STATUS_IS_OK(result)) { DEBUG(0, ("%s\n", nt_errstr(result))); |