r10656: BIG merge from trunk. Features not copied over
[nivanova/samba-autobuild/.git] / source3 / utils / net.c
index 3ab34e7aa9a3db5ad2e513712e05c23617822a14..4d9dec4b85b81cd046a2ea161bc98d9608327238 100644 (file)
@@ -38,7 +38,7 @@
 /*****************************************************/
 
 #include "includes.h"
-#include "../utils/net.h"
+#include "utils/net.h"
 
 /***********************************************************************/
 /* Beginning of internationalization section.  Translatable constants  */
@@ -66,18 +66,51 @@ int opt_long_list_entries = 0;
 int opt_reboot = 0;
 int opt_force = 0;
 int opt_port = 0;
+int opt_verbose = 0;
 int opt_maxusers = -1;
 const char *opt_comment = "";
-char *opt_container = "cn=Users";
+const char *opt_container = NULL;
 int opt_flags = -1;
-int opt_jobid = 0;
 int opt_timeout = 0;
 const char *opt_target_workgroup = NULL;
-static int opt_machine_pass = 0;
+int opt_machine_pass = 0;
+BOOL opt_localgroup = False;
+BOOL opt_domaingroup = False;
+const char *opt_newntname = "";
+int opt_rid = 0;
+int opt_acls = 0;
+int opt_attrs = 0;
+int opt_timestamps = 0;
+const char *opt_exclude = NULL;
+const char *opt_destination = NULL;
 
 BOOL opt_have_ip = False;
 struct in_addr opt_dest_ip;
 
+extern struct in_addr loopback_ip;
+extern BOOL AllowDebugChange;
+
+uint32 get_sec_channel_type(const char *param) 
+{
+       if (!(param && *param)) {
+               return get_default_sec_channel();
+       } else {
+               if (strequal(param, "PDC")) {
+                       return SEC_CHAN_BDC;
+               } else if (strequal(param, "BDC")) {
+                       return SEC_CHAN_BDC;
+               } else if (strequal(param, "MEMBER")) {
+                       return SEC_CHAN_WKSTA;
+#if 0                  
+               } else if (strequal(param, "DOMAIN")) {
+                       return SEC_CHAN_DOMAIN;
+#endif
+               } else {
+                       return get_default_sec_channel();
+               }
+       }
+}
+
 /*
   run a function from a function table. If not found then
   call the specified usage function 
@@ -99,33 +132,33 @@ int net_run_function(int argc, const char **argv, struct functable *table,
        return usage_fn(argc, argv);
 }
 
-
 /****************************************************************************
-connect to \\server\ipc$  
+connect to \\server\service 
 ****************************************************************************/
-NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip,
-                                       const char *server_name)
+NTSTATUS connect_to_service(struct cli_state **c, struct in_addr *server_ip,
+                                       const char *server_name, 
+                                       const char *service_name, 
+                                       const char *service_type)
 {
        NTSTATUS nt_status;
 
-       if (!opt_password) {
+       if (!opt_password && !opt_machine_pass) {
                char *pass = getpass("Password:");
                if (pass) {
-                       opt_password = strdup(pass);
+                       opt_password = SMB_STRDUP(pass);
                }
        }
        
-       nt_status = cli_full_connection(c, opt_requester_name, server_name, 
+       nt_status = cli_full_connection(c, NULL, server_name, 
                                        server_ip, opt_port,
-                                       "IPC$", "IPC",  
+                                       service_name, service_type,  
                                        opt_user_name, opt_workgroup,
-                                       opt_password, 0, NULL);
+                                       opt_password, 0, Undefined, NULL);
        
        if (NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
        } else {
-               DEBUG(1,("Cannot connect to server.  Error was %s\n", 
-                        nt_errstr(nt_status)));
+               d_printf("Could not connect to server %s\n", server_name);
 
                /* Display a nicer message depending on the result */
 
@@ -133,10 +166,28 @@ NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip,
                    NT_STATUS_V(NT_STATUS_LOGON_FAILURE))
                        d_printf("The username or password was not correct.\n");
 
+               if (NT_STATUS_V(nt_status) == 
+                   NT_STATUS_V(NT_STATUS_ACCOUNT_LOCKED_OUT))
+                       d_printf("The account was locked out.\n");
+
+               if (NT_STATUS_V(nt_status) == 
+                   NT_STATUS_V(NT_STATUS_ACCOUNT_DISABLED))
+                       d_printf("The account was disabled.\n");
+
                return nt_status;
        }
 }
 
+
+/****************************************************************************
+connect to \\server\ipc$  
+****************************************************************************/
+NTSTATUS connect_to_ipc(struct cli_state **c, struct in_addr *server_ip,
+                                       const char *server_name)
+{
+       return connect_to_service(c, server_ip, server_name, "IPC$", "IPC");
+}
+
 /****************************************************************************
 connect to \\server\ipc$ anonymously
 ****************************************************************************/
@@ -149,7 +200,7 @@ NTSTATUS connect_to_ipc_anonymous(struct cli_state **c,
                                        server_ip, opt_port,
                                        "IPC$", "IPC",  
                                        "", "",
-                                       "", 0, NULL);
+                                       "", 0, Undefined, NULL);
        
        if (NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
@@ -159,17 +210,77 @@ NTSTATUS connect_to_ipc_anonymous(struct cli_state **c,
        }
 }
 
+/**
+ * Connect a server and open a given pipe
+ *
+ * @param cli_dst              A cli_state 
+ * @param pipe                 The pipe to open
+ * @param got_pipe             boolean that stores if we got a pipe
+ *
+ * @return Normal NTSTATUS return.
+ **/
+NTSTATUS connect_dst_pipe(struct cli_state **cli_dst, struct rpc_pipe_client **pp_pipe_hnd, int pipe_num)
+{
+       NTSTATUS nt_status;
+       char *server_name = SMB_STRDUP("127.0.0.1");
+       struct cli_state *cli_tmp = NULL;
+       struct rpc_pipe_client *pipe_hnd = NULL;
+
+       if (opt_destination)
+               server_name = SMB_STRDUP(opt_destination);
+
+       /* make a connection to a named pipe */
+       nt_status = connect_to_ipc(&cli_tmp, NULL, server_name);
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               return nt_status;
+       }
+
+       pipe_hnd = cli_rpc_pipe_open_noauth(cli_tmp, pipe_num, &nt_status);
+       if (!pipe_hnd) {
+               DEBUG(0, ("couldn't not initialize pipe\n"));
+               cli_shutdown(cli_tmp);
+               return nt_status;
+       }
+
+       *cli_dst = cli_tmp;
+       *pp_pipe_hnd = pipe_hnd;
+
+       return nt_status;
+}
+
+/****************************************************************************
+ Use the local machine's password for this session.
+****************************************************************************/
+
+int net_use_machine_password(void) 
+{
+       char *user_name = NULL;
+
+       if (!secrets_init()) {
+               d_printf("ERROR: Unable to open secrets database\n");
+               exit(1);
+       }
+
+       user_name = NULL;
+       opt_password = secrets_fetch_machine_password(opt_target_workgroup, NULL, NULL);
+       if (asprintf(&user_name, "%s$@%s", global_myname(), lp_realm()) == -1) {
+               return -1;
+       }
+       opt_user_name = user_name;
+       return 0;
+}
+
 BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_name)
 {
 
        if (opt_host) {
-               *server_name = strdup(opt_host);
+               *server_name = SMB_STRDUP(opt_host);
        }               
 
        if (opt_have_ip) {
                *server_ip = opt_dest_ip;
                if (!*server_name) {
-                       *server_name = strdup(inet_ntoa(opt_dest_ip));
+                       *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
                }
        } else if (*server_name) {
                /* resolve the IP address */
@@ -186,10 +297,10 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                        if (is_zero_ip(pdc_ip))
                                return False;
                        
-                       if (!lookup_dc_name(global_myname(), opt_target_workgroup, &pdc_ip, dc_name))
+                       if ( !name_status_find(opt_target_workgroup, 0x1b, 0x20, pdc_ip, dc_name) )
                                return False;
                                
-                       *server_name = strdup(dc_name);
+                       *server_name = SMB_STRDUP(dc_name);
                        *server_ip = pdc_ip;
                }
                
@@ -202,7 +313,7 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                } else {
                        *server_ip = msbrow_ip;
                }
-               *server_name = strdup(inet_ntoa(opt_dest_ip));
+               *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
        } else if (flags & NET_FLAGS_MASTER) {
                struct in_addr brow_ips;
                if (!resolve_name(opt_target_workgroup, &brow_ips, 0x1D))  {
@@ -212,11 +323,10 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
                } else {
                        *server_ip = brow_ips;
                }
-               *server_name = strdup(inet_ntoa(opt_dest_ip));
+               *server_name = SMB_STRDUP(inet_ntoa(opt_dest_ip));
        } else if (!(flags & NET_FLAGS_LOCALHOST_DEFAULT_INSANE)) {
-               extern struct in_addr loopback_ip;
                *server_ip = loopback_ip;
-               *server_name = strdup("127.0.0.1");
+               *server_name = SMB_STRDUP("127.0.0.1");
        }
 
        if (!server_name || !*server_name) {
@@ -228,20 +338,18 @@ BOOL net_find_server(unsigned flags, struct in_addr *server_ip, char **server_na
 }
 
 
-BOOL net_find_dc(struct in_addr *server_ip, fstring server_name, const char *domain_name)
+BOOL net_find_pdc(struct in_addr *server_ip, fstring server_name, const char *domain_name)
 {
        if (get_pdc_ip(domain_name, server_ip)) {
-               fstring dc_name;
-                       
                if (is_zero_ip(*server_ip))
                        return False;
                
-               if (!lookup_dc_name(global_myname(), domain_name, server_ip, dc_name))
+               if (!name_status_find(domain_name, 0x1b, 0x20, *server_ip, server_name))
                        return False;
                        
-               fstrcpy(server_name, dc_name);
-               return True;
-       else
+               return True;    
+       } 
+       else
                return False;
 }
 
@@ -301,11 +409,44 @@ static int net_join(int argc, const char **argv)
                if (net_ads_join(argc, argv) == 0)
                        return 0;
                else
-                       d_printf("ADS join did not work, trying RPC...\n");
+                       d_printf("ADS join did not work, falling back to RPC...\n");
        }
        return net_rpc_join(argc, argv);
 }
 
+static int net_changetrustpw(int argc, const char **argv)
+{
+       if (net_ads_check() == 0)
+               return net_ads_changetrustpw(argc, argv);
+
+       return net_rpc_changetrustpw(argc, argv);
+}
+
+static int net_changesecretpw(int argc, const char **argv)
+{
+        char *trust_pw;
+        uint32 sec_channel_type = SEC_CHAN_WKSTA;
+
+       if(opt_force) {
+               trust_pw = getpass("Enter machine password: ");
+
+               if (!secrets_store_machine_password(trust_pw, lp_workgroup(), sec_channel_type)) {
+                           d_printf("Unable to write the machine account password in the secrets database");
+                           return 1;
+               }
+               else {
+                   d_printf("Modified trust account password in secrets database\n");
+               }
+       }
+       else {
+               d_printf("Machine account password change requires the -f flag.\n");
+               d_printf("Do NOT use this function unless you know what it does!\n");
+               d_printf("This function will change the ADS Domain member machine account password in the secrets.tdb file!\n");
+       }
+
+        return 0;
+}
+
 static int net_share(int argc, const char **argv)
 {
        if (net_rpc_check(0))
@@ -336,8 +477,24 @@ static int net_getlocalsid(int argc, const char **argv)
                name = global_myname();
        }
 
+       if(!initialize_password_db(False)) {
+               DEBUG(0, ("WARNING: Could not open passdb - local sid may not reflect passdb\n"
+                         "backend knowlege (such as the sid stored in LDAP)\n"));
+       }
+
+       /* first check to see if we can even access secrets, so we don't
+          panic when we can't. */
+
+       if (!secrets_init()) {
+               d_printf("Unable to open secrets.tdb.  Can't fetch domain SID for name: %s\n", name);
+               return 1;
+       }
+
+       /* Generate one, if it doesn't exist */
+       get_global_sam_sid();
+
        if (!secrets_fetch_domain_sid(name, &sid)) {
-               DEBUG(0, ("Can't fetch domain SID for name: %s\n", name));      
+               DEBUG(0, ("Can't fetch domain SID for name: %s\n", name));
                return 1;
        }
        sid_to_string(sid_str, &sid);
@@ -370,6 +527,14 @@ static int net_getdomainsid(int argc, const char **argv)
        DOM_SID domain_sid;
        fstring sid_str;
 
+       if(!initialize_password_db(False)) {
+               DEBUG(0, ("WARNING: Could not open passdb - domain sid may not reflect passdb\n"
+                         "backend knowlege (such as the sid stored in LDAP)\n"));
+       }
+
+       /* Generate one, if it doesn't exist */
+       get_global_sam_sid();
+
        if (!secrets_fetch_domain_sid(global_myname(), &domain_sid)) {
                d_printf("Could not fetch local SID\n");
                return 1;
@@ -377,73 +542,131 @@ static int net_getdomainsid(int argc, const char **argv)
        sid_to_string(sid_str, &domain_sid);
        d_printf("SID for domain %s is: %s\n", global_myname(), sid_str);
 
-       if (!secrets_fetch_domain_sid(lp_workgroup(), &domain_sid)) {
+       if (!secrets_fetch_domain_sid(opt_workgroup, &domain_sid)) {
                d_printf("Could not fetch domain SID\n");
                return 1;
        }
 
        sid_to_string(sid_str, &domain_sid);
-       d_printf("SID for domain %s is: %s\n", lp_workgroup(), sid_str);
+       d_printf("SID for domain %s is: %s\n", opt_workgroup, sid_str);
 
        return 0;
 }
 
-static uint32 get_maxrid(void)
+#ifdef WITH_FAKE_KASERVER
+
+int net_help_afs(int argc, const char **argv)
 {
-       SAM_ACCOUNT *pwd = NULL;
-       uint32 max_rid = 0;
-       GROUP_MAP *map = NULL;
-       int num_entries = 0;
-       int i;
+       d_printf("  net afs key filename\n"
+                "\tImports a OpenAFS KeyFile into our secrets.tdb\n\n");
+       d_printf("  net afs impersonate <user> <cell>\n"
+                "\tCreates a token for user@cell\n\n");
+       return -1;
+}
 
-       if (!pdb_setsampwent(False)) {
-               DEBUG(0, ("load_sampwd_entries: Unable to open passdb.\n"));
-               return 0;
+static int net_afs_key(int argc, const char **argv)
+{
+       int fd;
+       struct afs_keyfile keyfile;
+
+       if (argc != 2) {
+               d_printf("usage: 'net afs key <keyfile> cell'\n");
+               return -1;
        }
 
-       for (; (NT_STATUS_IS_OK(pdb_init_sam(&pwd))) 
-                    && pdb_getsampwent(pwd) == True; pwd=NULL) {
-               uint32 rid;
+       if (!secrets_init()) {
+               d_printf("Could not open secrets.tdb\n");
+               return -1;
+       }
 
-               if (!sid_peek_rid(pdb_get_user_sid(pwd), &rid)) {
-                       DEBUG(0, ("can't get RID for user '%s'\n",
-                                 pdb_get_username(pwd)));
-                       pdb_free_sam(&pwd);
-                       continue;
-               }
+       if ((fd = open(argv[0], O_RDONLY, 0)) < 0) {
+               d_printf("Could not open %s\n", argv[0]);
+               return -1;
+       }
 
-               if (rid > max_rid)
-                       max_rid = rid;
+       if (read(fd, &keyfile, sizeof(keyfile)) != sizeof(keyfile)) {
+               d_printf("Could not read keyfile\n");
+               return -1;
+       }
 
-               DEBUG(1,("%d is user '%s'\n", rid, pdb_get_username(pwd)));
-               pdb_free_sam(&pwd);
+       if (!secrets_store_afs_keyfile(argv[1], &keyfile)) {
+               d_printf("Could not write keyfile to secrets.tdb\n");
+               return -1;
        }
 
-       pdb_endsampwent();
-       pdb_free_sam(&pwd);
+       return 0;
+}
+
+static int net_afs_impersonate(int argc, const char **argv)
+{
+       char *token;
 
-       if (!pdb_enum_group_mapping(SID_NAME_UNKNOWN, &map, &num_entries,
-                                   ENUM_ONLY_MAPPED, MAPPING_WITHOUT_PRIV))
-               return max_rid;
+       if (argc != 2) {
+               fprintf(stderr, "Usage: net afs impersonate <user> <cell>\n");
+               exit(1);
+       }
 
-       for (i = 0; i < num_entries; i++) {
-               uint32 rid;
+       token = afs_createtoken_str(argv[0], argv[1]);
 
-               if (!sid_peek_check_rid(get_global_sam_sid(), &map[i].sid,
-                                       &rid)) {
-                       DEBUG(3, ("skipping map for group '%s', SID %s\n",
-                                 map[i].nt_name,
-                                 sid_string_static(&map[i].sid)));
-                       continue;
-               }
-               DEBUG(1,("%d is group '%s'\n", rid, map[i].nt_name));
+       if (token == NULL) {
+               fprintf(stderr, "Could not create token\n");
+               exit(1);
+       }
+
+       if (!afs_settoken_str(token)) {
+               fprintf(stderr, "Could not set token into kernel\n");
+               exit(1);
+       }
+
+       printf("Success: %s@%s\n", argv[0], argv[1]);
+       return 0;
+}
+
+static int net_afs(int argc, const char **argv)
+{
+       struct functable func[] = {
+               {"key", net_afs_key},
+               {"impersonate", net_afs_impersonate},
+               {"help", net_help_afs},
+               {NULL, NULL}
+       };
+       return net_run_function(argc, argv, func, net_help_afs);
+}
+
+#endif /* WITH_FAKE_KASERVER */
 
-               if (rid > max_rid)
-                       max_rid = rid;
+static BOOL search_maxrid(struct pdb_search *search, const char *type,
+                         uint32 *max_rid)
+{
+       struct samr_displayentry *entries;
+       uint32 i, num_entries;
+
+       if (search == NULL) {
+               d_printf("get_maxrid: Could not search %s\n", type);
+               return False;
        }
 
-       SAFE_FREE(map);
+       num_entries = pdb_search_entries(search, 0, 0xffffffff, &entries);
+       for (i=0; i<num_entries; i++)
+               *max_rid = MAX(*max_rid, entries[i].rid);
+       pdb_search_destroy(search);
+       return True;
+}
 
+static uint32 get_maxrid(void)
+{
+       uint32 max_rid = 0;
+
+       if (!search_maxrid(pdb_search_users(0), "users", &max_rid))
+               return 0;
+
+       if (!search_maxrid(pdb_search_groups(), "groups", &max_rid))
+               return 0;
+
+       if (!search_maxrid(pdb_search_aliases(get_global_sam_sid()),
+                          "aliases", &max_rid))
+               return 0;
+       
        return max_rid;
 }
 
@@ -452,7 +675,7 @@ static int net_maxrid(int argc, const char **argv)
        uint32 rid;
 
        if (argc != 0) {
-               DEBUG(0, ("usage: net initrid\n"));
+               DEBUG(0, ("usage: net maxrid\n"));
                return 1;
        }
 
@@ -481,11 +704,14 @@ static struct functable net_func[] = {
        {"PRINTQ", net_rap_printq},
        {"USER", net_user},
        {"GROUP", net_group},
+       {"GROUPMAP", net_groupmap},
        {"VALIDATE", net_rap_validate},
        {"GROUPMEMBER", net_rap_groupmember},
        {"ADMIN", net_rap_admin},
        {"SERVICE", net_rap_service},   
        {"PASSWORD", net_rap_password},
+       {"CHANGETRUSTPW", net_changetrustpw},
+       {"CHANGESECRETPW", net_changesecretpw},
        {"TIME", net_time},
        {"LOOKUP", net_lookup},
        {"JOIN", net_join},
@@ -494,6 +720,12 @@ static struct functable net_func[] = {
        {"SETLOCALSID", net_setlocalsid},
        {"GETDOMAINSID", net_getdomainsid},
        {"MAXRID", net_maxrid},
+       {"IDMAP", net_idmap},
+       {"STATUS", net_status},
+       {"USERSIDLIST", net_usersidlist},
+#ifdef WITH_FAKE_KASERVER
+       {"AFS", net_afs},
+#endif
 
        {"HELP", net_help},
        {NULL, NULL}
@@ -524,19 +756,33 @@ static struct functable net_func[] = {
                {"comment",     'C', POPT_ARG_STRING, &opt_comment},
                {"maxusers",    'M', POPT_ARG_INT,    &opt_maxusers},
                {"flags",       'F', POPT_ARG_INT,    &opt_flags},
-               {"jobid",       'j', POPT_ARG_INT,    &opt_jobid},
                {"long",        'l', POPT_ARG_NONE,   &opt_long_list_entries},
                {"reboot",      'r', POPT_ARG_NONE,   &opt_reboot},
                {"force",       'f', POPT_ARG_NONE,   &opt_force},
                {"timeout",     't', POPT_ARG_INT,    &opt_timeout},
                {"machine-pass",'P', POPT_ARG_NONE,   &opt_machine_pass},
                {"myworkgroup", 'W', POPT_ARG_STRING, &opt_workgroup},
+               {"verbose",     'v', POPT_ARG_NONE,   &opt_verbose},
+               /* Options for 'net groupmap set' */
+               {"local",       'L', POPT_ARG_NONE,   &opt_localgroup},
+               {"domain",      'D', POPT_ARG_NONE,   &opt_domaingroup},
+               {"ntname",      'N', POPT_ARG_STRING, &opt_newntname},
+               {"rid",         'R', POPT_ARG_INT,    &opt_rid},
+               /* Options for 'net rpc share migrate' */
+               {"acls",        0, POPT_ARG_NONE,     &opt_acls},
+               {"attrs",       0, POPT_ARG_NONE,     &opt_attrs},
+               {"timestamps",  0, POPT_ARG_NONE,     &opt_timestamps},
+               {"exclude",     'e', POPT_ARG_STRING, &opt_exclude},
+               {"destination", 0, POPT_ARG_STRING,   &opt_destination},
+
                POPT_COMMON_SAMBA
                { 0, 0, 0, 0}
        };
 
        zero_ip(&opt_dest_ip);
 
+       /* set default debug level to 0 regardless of what smb.conf sets */
+       DEBUGLEVEL_CLASS[DBGC_ALL] = 0;
        dbf = x_stderr;
        
        pc = poptGetContext(NULL, argc, (const char **) argv, long_options, 
@@ -557,7 +803,7 @@ static struct functable net_func[] = {
                        break;
                case 'U':
                        opt_user_specified = True;
-                       opt_user_name = strdup(opt_user_name);
+                       opt_user_name = SMB_STRDUP(opt_user_name);
                        p = strchr(opt_user_name,'%');
                        if (p) {
                                *p = 0;
@@ -572,9 +818,14 @@ static struct functable net_func[] = {
                }
        }
        
-       lp_load(dyn_CONFIGFILE,True,False,False);       
-
-       argv_new = (const char **)poptGetArgs(pc);
+       /*
+        * Don't load debug level from smb.conf. It should be
+        * set by cmdline arg or remain default (0)
+        */
+       AllowDebugChange = False;
+       lp_load(dyn_CONFIGFILE,True,False,False);
+       
+       argv_new = (const char **)poptGetArgs(pc);
 
        argc_new = argc;
        for (i=0; i<argc; i++) {
@@ -584,10 +835,8 @@ static struct functable net_func[] = {
                }
        }
 
-       if (!opt_requester_name) {
-               static fstring myname;
-               get_myname(myname);
-               opt_requester_name = myname;
+       if (opt_requester_name) {
+               set_global_myname(opt_requester_name);
        }
 
        if (!opt_user_name && getenv("LOGNAME")) {
@@ -595,35 +844,27 @@ static struct functable net_func[] = {
        }
 
        if (!opt_workgroup) {
-               opt_workgroup = lp_workgroup();
+               opt_workgroup = smb_xstrdup(lp_workgroup());
        }
        
        if (!opt_target_workgroup) {
-               opt_target_workgroup = strdup(lp_workgroup());
+               opt_target_workgroup = smb_xstrdup(lp_workgroup());
        }
        
        if (!init_names())
                exit(1);
 
        load_interfaces();
+       
+       /* this makes sure that when we do things like call scripts, 
+          that it won't assert becouse we are not root */
+       sec_init();
 
        if (opt_machine_pass) {
-               char *user;
                /* it is very useful to be able to make ads queries as the
                   machine account for testing purposes and for domain leave */
 
-               if (!secrets_init()) {
-                       d_printf("ERROR: Unable to open secrets database\n");
-                       exit(1);
-               }
-
-               asprintf(&user,"%s$", global_myname());
-               opt_user_name = user;
-               opt_password = secrets_fetch_machine_password();
-               if (!opt_password) {
-                       d_printf("ERROR: Unable to fetch machine password\n");
-                       exit(1);
-               }
+               net_use_machine_password();
        }
 
        if (!opt_password) {