2 Samba Unix/Linux SMB client library
5 Copyright (C) 2001 Andrew Tridgell (tridge@samba.org)
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 int net_ads_usage(int argc, const char **argv)
30 "\n\tjoins the local machine to a ADS realm\n"\
32 "\n\tremoves the local machine from a ADS realm\n"\
34 "\n\tlist users in the realm\n"\
36 "\n\tlist groups in the realm\n"\
38 "\n\tdump the machine account details to stdout\n"
43 static ADS_STRUCT *ads_startup(void)
47 ads = ads_init(NULL, NULL, NULL, NULL);
49 rc = ads_connect(ads);
51 d_printf("ads_connect: %s\n", ads_errstr(rc));
57 static int net_ads_user(int argc, const char **argv)
62 const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
64 if (!(ads = ads_startup())) return -1;
65 rc = ads_search(ads, &res, "(objectclass=user)", attrs);
67 d_printf("ads_search: %s\n", ads_errstr(rc));
71 if (ads_count_replies(ads, res) == 0) {
72 d_printf("No users found\n");
81 static int net_ads_group(int argc, const char **argv)
86 const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
88 if (!(ads = ads_startup())) return -1;
89 rc = ads_search(ads, &res, "(objectclass=group)", attrs);
91 d_printf("ads_search: %s\n", ads_errstr(rc));
95 if (ads_count_replies(ads, res) == 0) {
96 d_printf("No groups found\n");
104 static int net_ads_status(int argc, const char **argv)
108 extern pstring global_myname;
111 if (!(ads = ads_startup())) return -1;
113 rc = ads_find_machine_acct(ads, &res, global_myname);
115 d_printf("ads_find_machine_acct: %s\n", ads_errstr(rc));
119 if (ads_count_replies(ads, res) == 0) {
120 d_printf("No machine account for '%s' found\n", global_myname);
129 static int net_ads_leave(int argc, const char **argv)
133 extern pstring global_myname;
135 if (!(ads = ads_startup())) return -1;
137 if (!secrets_init()) {
138 DEBUG(1,("Failed to initialise secrets database\n"));
142 rc = ads_leave_realm(ads, global_myname);
144 d_printf("Failed to delete host '%s' from the '%s' realm.\n",
145 global_myname, ads->realm);
149 d_printf("Removed '%s' from realm '%s'\n", global_myname, ads->realm);
154 static int net_ads_join(int argc, const char **argv)
160 extern pstring global_myname;
163 if (!secrets_init()) {
164 DEBUG(1,("Failed to initialise secrets database\n"));
169 tmp_password = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH);
170 password = strdup(tmp_password);
172 if (!(ads = ads_startup())) return -1;
174 rc = ads_join_realm(ads, global_myname);
176 d_printf("ads_join_realm: %s\n", ads_errstr(rc));
180 status = ads_set_machine_password(ads, global_myname, password);
181 if (!NT_STATUS_IS_OK(status)) {
182 d_printf("ads_set_machine_password: %s\n", get_nt_error_msg(status));
186 if (!secrets_store_machine_password(password)) {
187 DEBUG(1,("Failed to save machine password\n"));
191 d_printf("Joined '%s' to realm '%s'\n", global_myname, ads->realm);
198 int net_ads(int argc, const char **argv)
200 struct functable func[] = {
201 {"JOIN", net_ads_join},
202 {"LEAVE", net_ads_leave},
203 {"STATUS", net_ads_status},
204 {"USER", net_ads_user},
205 {"GROUP", net_ads_group},
209 return net_run_function(argc, argv, func, net_ads_usage);
214 int net_ads_usage(int argc, const char **argv)
216 d_printf("ADS support not compiled in\n");
220 int net_ads(int argc, const char **argv)
222 return net_ads_usage(argc, argv);