summaryrefslogtreecommitdiff
path: root/source3/rpc_client/cli_netlogon.c
diff options
context:
space:
mode:
authorMatthew Chapman <matty@samba.org>1999-07-22 10:54:49 +0000
committerMatthew Chapman <matty@samba.org>1999-07-22 10:54:49 +0000
commit30beb2dd109e26abbe4d773671909b1fdf3a0e62 (patch)
tree89ee14f0561e5db70587a7100121da8093da4c40 /source3/rpc_client/cli_netlogon.c
parent0091c7768dc37c22206b345b306441583204dcba (diff)
downloadsamba-30beb2dd109e26abbe4d773671909b1fdf3a0e62.tar.gz
samba-30beb2dd109e26abbe4d773671909b1fdf3a0e62.tar.bz2
samba-30beb2dd109e26abbe4d773671909b1fdf3a0e62.zip
BDC support.
Added synchronise_passdb function to update accounts in a BDC's smbpasswd. Improved rpc_read, which was still somewhat broken for multiple PDU's. modify_trust_password must initialise cli.pwd (pwd_set_nullpwd). (This used to be commit 4783ac3968df1c5c8aa0b6ba9144df8b01ae0b99)
Diffstat (limited to 'source3/rpc_client/cli_netlogon.c')
-rw-r--r--source3/rpc_client/cli_netlogon.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/source3/rpc_client/cli_netlogon.c b/source3/rpc_client/cli_netlogon.c
index 188390ae54..6f0d7e1c3a 100644
--- a/source3/rpc_client/cli_netlogon.c
+++ b/source3/rpc_client/cli_netlogon.c
@@ -580,6 +580,8 @@ addresses. Cannot add to ourselves.\n", remote_machine));
cli.protocol = PROTOCOL_NT1;
+ pwd_set_nullpwd(&cli.pwd);
+
if (!cli_establish_connection(&cli, remote_machine, &cli.dest_ip,
&calling, &called,
"IPC$", "IPC", False, True))
@@ -752,3 +754,73 @@ BOOL do_sam_sync(struct cli_state *cli,
return True;
}
+
+BOOL synchronise_passdb(void)
+{
+ struct cli_state cli;
+ SAM_DELTA_HDR hdr_deltas[MAX_SAM_DELTAS];
+ SAM_DELTA_CTR deltas[MAX_SAM_DELTAS];
+ uint32 num;
+
+ SAM_ACCOUNT_INFO *acc;
+ struct smb_passwd pwd;
+ fstring nt_name;
+ unsigned char smb_passwd[16];
+ unsigned char smb_nt_passwd[16];
+
+ char *mode;
+ BOOL success;
+ BOOL ret;
+ int i;
+
+ if (!cli_connect_serverlist(&cli, lp_passwordserver()))
+ {
+ return False;
+ }
+
+ pstrcpy(cli.domain, lp_workgroup());
+
+ ret = do_sam_sync(&cli, hdr_deltas, deltas, &num);
+
+ if (ret)
+ {
+ for (i = 0; i < num; i++)
+ {
+ /* Currently only interested in accounts */
+ if (hdr_deltas[i].type != 5)
+ {
+ continue;
+ }
+
+ acc = &deltas[i].account_info;
+ pwdb_init_smb(&pwd);
+
+ pwd.user_rid = acc->user_rid;
+ unistr2_to_ascii(nt_name, &(acc->uni_acct_name), sizeof(fstring)-1);
+ pwd.nt_name = nt_name;
+ pwd.acct_ctrl = acc->acb_info;
+ pwd.pass_last_set_time = nt_time_to_unix(&(acc->pwd_last_set_time));
+
+ sam_pwd_hash(acc->user_rid, smb_passwd, acc->pass.buf_lm_pwd, 0);
+ sam_pwd_hash(acc->user_rid, smb_nt_passwd, acc->pass.buf_nt_pwd, 0);
+ pwd.smb_passwd = smb_passwd;
+ pwd.smb_nt_passwd = smb_nt_passwd;
+
+ mode = "modify";
+ success = mod_smbpwd_entry(&pwd, True);
+
+ if (!success)
+ {
+ mode = "add";
+ success = add_smbpwd_entry(&pwd);
+ }
+
+ DEBUG(0, ("Attempted to %s account for %s: %s\n", mode,
+ nt_name, success ? "OK" : "FAILED"));
+ }
+ }
+
+ cli_ulogoff(&cli);
+ cli_shutdown(&cli);
+ return ret;
+}