Add samdump and vampire to 'net rpc help'
[bbaumbach/samba-autobuild/.git] / source / utils / net_rpc.c
index 50c14c6f5b8c34e67418a572bfd923df080d49d4..d5af6e3fb8889891427280ccd9418ca572a46082 100644 (file)
@@ -21,8 +21,6 @@
 #include "includes.h"
 #include "../utils/net.h"
 
-extern pstring global_myname;
-
 /**
  * @file net_rpc.c
  *
@@ -71,7 +69,7 @@ static DOM_SID *net_get_remote_domain_sid(struct cli_state *cli)
        }
 
 
-       if (!cli_nt_session_open (cli, PIPE_LSARPC)) {
+       if (!cli_nt_session_open (cli, PI_LSARPC)) {
                fprintf(stderr, "could not initialise lsa pipe\n");
                goto error;
        }
@@ -117,7 +115,7 @@ static DOM_SID *net_get_remote_domain_sid(struct cli_state *cli)
  * @return A shell status integer (0 for success)
  */
 
-static int run_rpc_command(struct cli_state *cli_arg, const char *pipe_name, int conn_flags,
+static int run_rpc_command(struct cli_state *cli_arg, const int pipe_idx, int conn_flags,
                            rpc_command_fn fn,
                            int argc, const char **argv) 
 {
@@ -146,8 +144,8 @@ static int run_rpc_command(struct cli_state *cli_arg, const char *pipe_name, int
                return -1;
        }
        
-       if (!cli_nt_session_open(cli, pipe_name)) {
-               DEBUG(0, ("Could not initialise %s pipe\n", pipe_name));
+       if (!cli_nt_session_open(cli, pipe_idx)) {
+               DEBUG(0, ("Could not initialise pipe\n"));
        }
        
        nt_status = fn(domain_sid, cli, mem_ctx, argc, argv);
@@ -209,7 +207,7 @@ static NTSTATUS rpc_changetrustpw_internals(const DOM_SID *domain_sid, struct cl
 
 static int rpc_changetrustpw(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_changetrustpw_internals,
+       return run_rpc_command(NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_changetrustpw_internals,
                               argc, argv);
 }
 
@@ -240,12 +238,11 @@ static int rpc_changetrustpw(int argc, const char **argv)
 static NTSTATUS rpc_join_oldstyle_internals(const DOM_SID *domain_sid, struct cli_state *cli, TALLOC_CTX *mem_ctx, 
                                       int argc, const char **argv) {
        
-       extern pstring global_myname;
        fstring trust_passwd;
        unsigned char orig_trust_passwd_hash[16];
        NTSTATUS result;
 
-       fstrcpy(trust_passwd, global_myname);
+       fstrcpy(trust_passwd, global_myname());
        strlower(trust_passwd);
 
        /*
@@ -277,7 +274,7 @@ static NTSTATUS rpc_join_oldstyle_internals(const DOM_SID *domain_sid, struct cl
 
 static int net_rpc_join_oldstyle(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_join_oldstyle_internals,
+       return run_rpc_command(NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_join_oldstyle_internals,
                               argc, argv);
 }
 
@@ -309,15 +306,24 @@ static int rpc_join_usage(int argc, const char **argv)
  * Main 'net_rpc_join()' (where the admain username/password is used) is 
  * in net_rpc_join.c
  * Assume if a -U is specified, it's the new style, otherwise it's the
- * old style
+ * old style.  If 'oldstyle' is specfied explicity, do it and don't prompt.
  **/
 
 int net_rpc_join(int argc, const char **argv) 
 {
-       if ((net_rpc_join_oldstyle(argc, argv) == 0))
-               return 0;
-       
-       return net_rpc_join_newstyle(argc, argv);
+       struct functable func[] = {
+               {"oldstyle", net_rpc_join_oldstyle},
+               {NULL, NULL}
+       };
+
+       if (argc == 0) {
+               if ((net_rpc_join_oldstyle(argc, argv) == 0))
+                       return 0;
+               
+               return net_rpc_join_newstyle(argc, argv);
+       }
+
+       return net_run_function(argc, argv, func, rpc_join_usage);
 }
 
 
@@ -391,7 +397,7 @@ rpc_info_internals(const DOM_SID *domain_sid, struct cli_state *cli,
  **/
 int net_rpc_info(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_SAMR, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, 
+       return run_rpc_command(NULL, PI_SAMR, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, 
                               rpc_info_internals,
                               argc, argv);
 }
@@ -423,9 +429,8 @@ rpc_getsid_internals(const DOM_SID *domain_sid, struct cli_state *cli,
        d_printf("Storing SID %s for Domain %s in secrets.tdb\n",
                 sid_str, lp_workgroup());
 
-       if (!secrets_store_domain_sid(global_myname, domain_sid)) {
-               DEBUG(0,("pdb_generate_sam_sid: "
-                        "Can't store domain SID as a pdc/bdc.\n"));
+       if (!secrets_store_domain_sid(global_myname(), domain_sid)) {
+               DEBUG(0,("Can't store domain SID\n"));
                return NT_STATUS_UNSUCCESSFUL;
        }
 
@@ -441,7 +446,7 @@ rpc_getsid_internals(const DOM_SID *domain_sid, struct cli_state *cli,
  **/
 int net_rpc_getsid(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_SAMR, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, 
+       return run_rpc_command(NULL, PI_SAMR, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, 
                               rpc_getsid_internals,
                               argc, argv);
 }
@@ -545,7 +550,7 @@ static NTSTATUS rpc_user_add_internals(const DOM_SID *domain_sid, struct cli_sta
 
 static int rpc_user_add(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_SAMR, 0, rpc_user_add_internals,
+       return run_rpc_command(NULL, PI_SAMR, 0, rpc_user_add_internals,
                               argc, argv);
 }
 
@@ -646,7 +651,7 @@ static NTSTATUS rpc_user_del_internals(const DOM_SID *domain_sid,
 
 static int rpc_user_delete(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_SAMR, 0, rpc_user_del_internals,
+       return run_rpc_command(NULL, PI_SAMR, 0, rpc_user_del_internals,
                               argc, argv);
 }
 
@@ -748,7 +753,7 @@ rpc_user_info_internals(const DOM_SID *domain_sid, struct cli_state *cli,
 
 static int rpc_user_info(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_SAMR, 0, rpc_user_info_internals,
+       return run_rpc_command(NULL, PI_SAMR, 0, rpc_user_info_internals,
                               argc, argv);
 }
 
@@ -843,7 +848,7 @@ int net_rpc_user(int argc, const char **argv)
                if (opt_long_list_entries) {
                } else {
                }
-                       return run_rpc_command(NULL,PIPE_SAMR, 0, 
+                       return run_rpc_command(NULL,PI_SAMR, 0, 
                                               rpc_user_list_internals,
                                               argc, argv);
        }
@@ -994,7 +999,7 @@ int net_rpc_group(int argc, const char **argv)
                if (opt_long_list_entries) {
                } else {
                }
-               return run_rpc_command(NULL, PIPE_SAMR, 0, 
+               return run_rpc_command(NULL, PI_SAMR, 0, 
                                       rpc_group_list_internals,
                                       argc, argv);
        }
@@ -1052,7 +1057,7 @@ static int rpc_share_add(int argc, const char **argv)
                DEBUG(1,("Sharename or path not specified on add\n"));
                return rpc_share_usage(argc, argv);
        }
-       return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+       return run_rpc_command(NULL, PI_SRVSVC, 0, 
                               rpc_share_add_internals,
                               argc, argv);
 }
@@ -1098,7 +1103,7 @@ static int rpc_share_delete(int argc, const char **argv)
                DEBUG(1,("Sharename not specified on delete\n"));
                return rpc_share_usage(argc, argv);
        }
-       return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+       return run_rpc_command(NULL, PI_SRVSVC, 0, 
                               rpc_share_del_internals,
                               argc, argv);
 }
@@ -1188,7 +1193,7 @@ int net_rpc_share(int argc, const char **argv)
        };
 
        if (argc == 0)
-               return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+               return run_rpc_command(NULL, PI_SRVSVC, 0, 
                                       rpc_share_list_internals,
                                       argc, argv);
 
@@ -1242,7 +1247,7 @@ static int rpc_file_close(int argc, const char **argv)
                return(rpc_file_usage(argc, argv));
        }
 
-       return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+       return run_rpc_command(NULL, PI_SRVSVC, 0, 
                               rpc_file_close_internals,
                               argc, argv);
 }
@@ -1333,7 +1338,7 @@ static int rpc_file_user(int argc, const char **argv)
                return(rpc_file_usage(argc, argv));
        }
 
-       return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+       return run_rpc_command(NULL, PI_SRVSVC, 0, 
                               rpc_file_list_internals,
                               argc, argv);
 }
@@ -1358,7 +1363,7 @@ int net_rpc_file(int argc, const char **argv)
        };
 
        if (argc == 0)
-               return run_rpc_command(NULL, PIPE_SRVSVC, 0, 
+               return run_rpc_command(NULL, PI_SRVSVC, 0, 
                                       rpc_file_list_internals,
                                       argc, argv);
 
@@ -1413,7 +1418,7 @@ static NTSTATUS rpc_shutdown_abort_internals(const DOM_SID *domain_sid, struct c
 
 static int rpc_shutdown_abort(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_WINREG, 0, rpc_shutdown_abort_internals,
+       return run_rpc_command(NULL, PI_WINREG, 0, rpc_shutdown_abort_internals,
                               argc, argv);
 }
 
@@ -1503,7 +1508,7 @@ static NTSTATUS rpc_shutdown_internals(const DOM_SID *domain_sid, struct cli_sta
 
 static int rpc_shutdown(int argc, const char **argv) 
 {
-       return run_rpc_command(NULL, PIPE_WINREG, 0, rpc_shutdown_internals,
+       return run_rpc_command(NULL, PI_WINREG, 0, rpc_shutdown_internals,
                                       argc, argv);
 }
 
@@ -1594,7 +1599,7 @@ static NTSTATUS rpc_trustdom_add_internals(const DOM_SID *domain_sid, struct cli
 
 static int rpc_trustdom_add(int argc, const char **argv)
 {
-       return run_rpc_command(NULL, PIPE_SAMR, 0, rpc_trustdom_add_internals,
+       return run_rpc_command(NULL, PI_SAMR, 0, rpc_trustdom_add_internals,
                               argc, argv);
 }
 
@@ -1710,7 +1715,7 @@ static int rpc_trustdom_establish(int argc, const char **argv)
         * note: It is now used only to get unicode domain name
         */
        
-       if (!cli_nt_session_open(cli, PIPE_WKSSVC)) {
+       if (!cli_nt_session_open(cli, PI_WKSSVC)) {
                DEBUG(0, ("Couldn't not initialise wkssvc pipe\n"));
                return -1;
        }
@@ -1743,7 +1748,7 @@ static int rpc_trustdom_establish(int argc, const char **argv)
                return -1;
        }
 
-       if (!cli_nt_session_open(cli, PIPE_LSARPC)) {
+       if (!cli_nt_session_open(cli, PI_LSARPC)) {
                DEBUG(0, ("Could not initialise lsa pipe\n"));
                cli_shutdown(cli);
                return -1;
@@ -1909,7 +1914,7 @@ static int rpc_trustdom_list(int argc, const char **argv)
                if (opt_target_workgroup) SAFE_FREE(opt_target_workgroup);
                opt_target_workgroup = opt_workgroup;
        } else {
-               safe_strcpy(pdc_name, global_myname, FSTRING_LEN);
+               safe_strcpy(pdc_name, global_myname(), FSTRING_LEN);
                domain_name = talloc_strdup(mem_ctx, lp_workgroup());
                if (opt_target_workgroup) SAFE_FREE(opt_target_workgroup);
                opt_target_workgroup = domain_name;
@@ -1921,7 +1926,7 @@ static int rpc_trustdom_list(int argc, const char **argv)
                return -1;
        };
 
-       if (!cli_nt_session_open(cli, PIPE_LSARPC)) {
+       if (!cli_nt_session_open(cli, PI_LSARPC)) {
                DEBUG(0, ("Could not initialise lsa pipe\n"));
                return -1;
        };
@@ -2000,13 +2005,13 @@ static int rpc_trustdom_list(int argc, const char **argv)
        /*
         * Open \PIPE\samr and get needed policy handles
         */
-       if (!cli_nt_session_open(cli, PIPE_SAMR)) {
+       if (!cli_nt_session_open(cli, PI_SAMR)) {
                DEBUG(0, ("Could not initialise samr pipe\n"));
                return -1;
        };
        
        /* SamrConnect */
-       nt_status = cli_samr_connect(cli, mem_ctx, SAMR_ACCESS_OPEN_DOMAIN,
+       nt_status = cli_samr_connect(cli, mem_ctx, SA_RIGHT_SAM_OPEN_DOMAIN,
                                                                 &connect_hnd);
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(0, ("Couldn't open SAMR policy handle. Error was %s\n",
@@ -2017,7 +2022,7 @@ static int rpc_trustdom_list(int argc, const char **argv)
        /* SamrOpenDomain - we have to open domain policy handle in order to be
           able to enumerate accounts*/
        nt_status = cli_samr_open_domain(cli, mem_ctx, &connect_hnd,
-                                                                        DOMAIN_ACCESS_ENUM_ACCOUNTS,
+                                                                        SA_RIGHT_DOMAIN_ENUM_ACCOUNTS,
                                                                         &queried_dom_sid, &domain_hnd);                                                                         
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(0, ("Couldn't open domain object. Error was %s\n",
@@ -2072,7 +2077,7 @@ static int rpc_trustdom_list(int argc, const char **argv)
                        remote_cli = net_make_ipc_connection(NET_FLAGS_PDC | NET_FLAGS_ANONYMOUS);
                        if (remote_cli) {                       
                                /* query for domain's sid */
-                               if (run_rpc_command(remote_cli, PIPE_LSARPC, 0, rpc_query_domain_sid, argc, argv))
+                               if (run_rpc_command(remote_cli, PI_LSARPC, 0, rpc_query_domain_sid, argc, argv))
                                        d_printf("couldn't get domain's sid\n");
 
                                cli_shutdown(remote_cli);
@@ -2157,7 +2162,7 @@ BOOL net_rpc_check(unsigned flags)
 
        if (!cli_connect(&cli, server_name, &server_ip))
                goto done;
-       if (!attempt_netbios_session_request(&cli, global_myname, 
+       if (!attempt_netbios_session_request(&cli, global_myname()
                                             server_name, &server_ip))
                goto done;
        if (!cli_negprot(&cli))
@@ -2193,6 +2198,8 @@ int net_rpc_usage(int argc, const char **argv)
        d_printf("  net rpc file \t\t\tto list open files\n");
        d_printf("  net rpc changetrustpw \tto change the trust account password\n");
        d_printf("  net rpc getsid \t\tfetch the domain sid into the local secrets.tdb\n");
+       d_printf("  net rpc vampire \t\tsyncronise an NT PDC's users and groups into the local passdb\n");
+       d_printf("  net rpc samdump \t\tdiplay an NT PDC's users, groups and other data\n");
        d_printf("  net rpc trustdom \t\tto create trusting domain's account\n"
                 "\t\t\t\t\tor establish trust\n");
        d_printf("  net rpc abortshutdown \tto abort the shutdown of a remote server\n");
@@ -2260,7 +2267,7 @@ int net_rpc(int argc, const char **argv)
                {"abortshutdown", rpc_shutdown_abort},
                {"shutdown", rpc_shutdown},
                {"samdump", rpc_samdump},
-               {"vampire", rpc_samdump},
+               {"vampire", rpc_vampire},
                {"getsid", net_rpc_getsid},
                {"help", net_rpc_help},
                {NULL, NULL}