#ifdef HAVE_ADS
-/* a lame random number generator - used /dev/urandom if possible */
-static unsigned one_random(void)
+int net_ads_usage(int argc, const char **argv)
{
- int fd = -1;
- static int initialised;
- unsigned ret;
-
- if (!initialised) {
- initialised = 1;
- fd = open("/dev/urandom", O_RDONLY);
- srandom(time(NULL) ^ getpid());
- }
+ d_printf(
+"\nnet ads join"\
+"\n\tjoins the local machine to a ADS realm\n"\
+"\nnet ads leave"\
+"\n\tremoves the local machine from a ADS realm\n"\
+"\nnet ads user"\
+"\n\tlist users in the realm\n"\
+"\nnet ads group"\
+"\n\tlist groups in the realm\n"\
+"\nnet ads status"\
+"\n\tdump the machine account details to stdout\n"
+ );
+ return -1;
+}
- if (fd == -1) {
- return random();
- }
+static ADS_STRUCT *ads_startup(void)
+{
+ ADS_STRUCT *ads;
+ int rc;
+ ads = ads_init(NULL, NULL, NULL, NULL);
- read(fd, &ret, sizeof(ret));
- return ret;
+ rc = ads_connect(ads);
+ if (rc) {
+ d_printf("ads_connect: %s\n", ads_errstr(rc));
+ return NULL;
+ }
+ return ads;
}
-/*
- * Generate a simple random password of 15 chars - not a cryptographic one
- */
-static char *generate_random_password(int len)
+static int net_ads_user(int argc, const char **argv)
{
- int i;
- char *pass;
+ ADS_STRUCT *ads;
+ int rc;
+ void *res;
+ const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
- if (!(pass = malloc(len+1)))
- return NULL;
+ if (!(ads = ads_startup())) return -1;
+ rc = ads_search(ads, &res, "(objectclass=user)", attrs);
+ if (rc) {
+ d_printf("ads_search: %s\n", ads_errstr(rc));
+ return -1;
+ }
- for (i=0; i<len; ) {
- char c = one_random() & 0x7f;
- if (!isalnum(c) && !ispunct(c)) continue;
- pass[i++] = c;
+ if (ads_count_replies(ads, res) == 0) {
+ d_printf("No users found\n");
+ return -1;
}
-
- return pass;
-}
+ ads_dump(ads, res);
+ ads_destroy(&ads);
+ return 0;
+}
-int net_ads_usage(void)
+static int net_ads_group(int argc, const char **argv)
{
- d_printf(
-"\nnet ads join"\
-"\n\tjoins the local machine to a ADS realm\n"\
-"\nnet ads leave"\
-"\n\tremoves the local machine from a ADS realm\n"
- );
- return -1;
-}
+ ADS_STRUCT *ads;
+ int rc;
+ void *res;
+ const char *attrs[] = {"sAMAccountName", "name", "objectSid", NULL};
+
+ if (!(ads = ads_startup())) return -1;
+ rc = ads_search(ads, &res, "(objectclass=group)", attrs);
+ if (rc) {
+ d_printf("ads_search: %s\n", ads_errstr(rc));
+ return -1;
+ }
+ if (ads_count_replies(ads, res) == 0) {
+ d_printf("No groups found\n");
+ return -1;
+ }
+
+ ads_dump(ads, res);
+ return 0;
+}
static int net_ads_status(int argc, const char **argv)
{
extern pstring global_myname;
void *res;
- ads = ads_init(NULL, NULL, NULL);
-
- rc = ads_connect(ads);
- if (rc) {
- d_printf("ads_connect: %s\n", ads_errstr(rc));
- return -1;
- }
+ if (!(ads = ads_startup())) return -1;
rc = ads_find_machine_acct(ads, &res, global_myname);
if (rc) {
int rc;
extern pstring global_myname;
+ if (!(ads = ads_startup())) return -1;
+
if (!secrets_init()) {
DEBUG(1,("Failed to initialise secrets database\n"));
return -1;
}
- ads = ads_init(NULL, NULL, NULL);
-
- rc = ads_connect(ads);
- if (rc) {
- d_printf("ads_connect: %s\n", ads_errstr(rc));
- return -1;
- }
-
rc = ads_leave_realm(ads, global_myname);
if (rc) {
d_printf("Failed to delete host '%s' from the '%s' realm.\n",
ADS_STRUCT *ads;
int rc;
char *password;
+ char *tmp_password;
extern pstring global_myname;
NTSTATUS status;
DEBUG(1,("Failed to initialise secrets database\n"));
return -1;
}
+
+
+ tmp_password = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH);
+ password = strdup(tmp_password);
- password = generate_random_password(15);
-
- ads = ads_init(NULL, NULL, NULL);
-
- rc = ads_connect(ads);
- if (rc) {
- d_printf("ads_connect: %s\n", ads_errstr(rc));
- return -1;
- }
+ if (!(ads = ads_startup())) return -1;
rc = ads_join_realm(ads, global_myname);
if (rc) {
d_printf("Joined '%s' to realm '%s'\n", global_myname, ads->realm);
+ free(password);
+
return 0;
}
{"JOIN", net_ads_join},
{"LEAVE", net_ads_leave},
{"STATUS", net_ads_status},
+ {"USER", net_ads_user},
+ {"GROUP", net_ads_group},
{NULL, NULL}
};
#else
-int net_ads_usage(void)
+int net_ads_usage(int argc, const char **argv)
{
d_printf("ADS support not compiled in\n");
return -1;
int net_ads(int argc, const char **argv)
{
- return net_ads_usage();
+ return net_ads_usage(argc, argv);
}
#endif