mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
r8410: converted the newuser script to js
(This used to be commit b90aa3c5a7cd7e91a8fc804c3cd9f2155761cf28)
This commit is contained in:
parent
b433d61537
commit
afb160e20c
141
source4/setup/newuser
Executable file
141
source4/setup/newuser
Executable file
@ -0,0 +1,141 @@
|
|||||||
|
#!/usr/bin/env smbscript
|
||||||
|
/*
|
||||||
|
add a new user to a Samba4 server
|
||||||
|
Copyright Andrew Tridgell 2005
|
||||||
|
Released under the GNU GPL v2 or later
|
||||||
|
*/
|
||||||
|
|
||||||
|
options = new Object();
|
||||||
|
ok = GetOptions(ARGV, options,
|
||||||
|
"POPT_AUTOHELP",
|
||||||
|
"POPT_COMMON_SAMBA",
|
||||||
|
"POPT_COMMON_VERSION",
|
||||||
|
'username=s',
|
||||||
|
'unixname=s',
|
||||||
|
'password=s',
|
||||||
|
'quiet');
|
||||||
|
if (ok == false) {
|
||||||
|
println("Failed to parse options: " + options.ERROR);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
libinclude("base.js");
|
||||||
|
|
||||||
|
var samdb = lpGet("sam database");
|
||||||
|
|
||||||
|
/*
|
||||||
|
print a message if quiet is not set
|
||||||
|
*/
|
||||||
|
function message()
|
||||||
|
{
|
||||||
|
if (options["quiet"] == undefined) {
|
||||||
|
print(vsprintf(arguments));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
search for one attribute as a string
|
||||||
|
*/
|
||||||
|
function search(db, expression, attribute)
|
||||||
|
{
|
||||||
|
var attrs = new Array(attribute);
|
||||||
|
res = ldbSearch(db, expression, attrs);
|
||||||
|
if (res.length != 1 ||
|
||||||
|
res[0][attribute] == undefined) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return res[0][attribute];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
show some help
|
||||||
|
*/
|
||||||
|
function ShowHelp()
|
||||||
|
{
|
||||||
|
print("
|
||||||
|
Samba4 newuser
|
||||||
|
|
||||||
|
newuser [options]
|
||||||
|
--username USERNAME choose new username
|
||||||
|
--unixname USERNAME choose unix name of new user
|
||||||
|
--password PASSWORD set password
|
||||||
|
|
||||||
|
You must provide at least a username
|
||||||
|
");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options['username'] == undefined) {
|
||||||
|
ShowHelp();
|
||||||
|
}
|
||||||
|
if (options['password'] == undefined) {
|
||||||
|
options.password = randpass(12);
|
||||||
|
printf("chose random password %s\n", options.password);
|
||||||
|
}
|
||||||
|
if (options['unixname'] == undefined) {
|
||||||
|
options.unixname = options.username;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getpwnam(options.unixname) == undefined) {
|
||||||
|
printf("ERROR: Unix user '%s' does not exist\n", options.unixname);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (search(samdb, "name=" + options.username, "dn") != undefined) {
|
||||||
|
printf("ERROR: User '%s' already exists\n", options.username);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var domain_dn = search(samdb, "objectClass=domainDNS", "dn");
|
||||||
|
assert(domain_dn != undefined);
|
||||||
|
var dom_users = search(samdb, "name=Domain Users", "dn");
|
||||||
|
assert(dom_users != undefined);
|
||||||
|
|
||||||
|
var user_dn = sprintf("CN=%s,CN=Users,%s", options.username, domain_dn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
the new user record. note the reliance on the samdb module to fill
|
||||||
|
in a sid, guid etc
|
||||||
|
*/
|
||||||
|
var ldif = sprintf("
|
||||||
|
dn: %s
|
||||||
|
sAMAccountName: %s
|
||||||
|
name: %s
|
||||||
|
memberOf: %s
|
||||||
|
unixName: %s
|
||||||
|
objectGUID: %s
|
||||||
|
unicodePwd: %s
|
||||||
|
objectClass: user
|
||||||
|
",
|
||||||
|
user_dn, options.username, options.username, dom_users,
|
||||||
|
options.unixname, randguid(), options.password);
|
||||||
|
|
||||||
|
/*
|
||||||
|
add the user to the users group as well
|
||||||
|
*/
|
||||||
|
var modgroup = sprintf("
|
||||||
|
dn: %s
|
||||||
|
changetype: modify
|
||||||
|
add: member
|
||||||
|
member: %s
|
||||||
|
", dom_users, user_dn);
|
||||||
|
|
||||||
|
/*
|
||||||
|
now the real work
|
||||||
|
*/
|
||||||
|
message("Adding user %s\n", user_dn);
|
||||||
|
ok = ldbAdd(samdb, ldif);
|
||||||
|
if (ok != true) {
|
||||||
|
message("Failed to add %s\n", user_dn);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
message("Modifying group %s\n", dom_users);
|
||||||
|
ok = ldbModify(samdb, modgroup);
|
||||||
|
if (ok != true) {
|
||||||
|
message("Failed to modify %s\n", dom_users);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
message("All OK\n");
|
||||||
|
return 0;
|
@ -1,132 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
# simple hack script to add a new user for Samba4
|
|
||||||
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Socket;
|
|
||||||
use Getopt::Long;
|
|
||||||
|
|
||||||
my $opt_password;
|
|
||||||
my $opt_username;
|
|
||||||
my $opt_unixname;
|
|
||||||
my $opt_samdb = "/usr/local/samba/private/sam.ldb";
|
|
||||||
|
|
||||||
|
|
||||||
# generate a random guid. Not a good algorithm.
|
|
||||||
sub randguid()
|
|
||||||
{
|
|
||||||
my $r1 = int(rand(2**32));
|
|
||||||
my $r2 = int(rand(2**16));
|
|
||||||
my $r3 = int(rand(2**16));
|
|
||||||
my $r4 = int(rand(2**16));
|
|
||||||
my $r5 = int(rand(2**32));
|
|
||||||
my $r6 = int(rand(2**16));
|
|
||||||
return sprintf("%08x-%04x-%04x-%04x-%08x%04x", $r1, $r2, $r3, $r4, $r5, $r6);
|
|
||||||
}
|
|
||||||
|
|
||||||
# generate a random password. Poor algorithm :(
|
|
||||||
sub randpass()
|
|
||||||
{
|
|
||||||
my $pass = "";
|
|
||||||
my $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%\$!~";
|
|
||||||
for (my $i=0;$i<8;$i++) {
|
|
||||||
my $c = int(rand(length($chars)));
|
|
||||||
$pass .= substr($chars, $c, 1);
|
|
||||||
}
|
|
||||||
return $pass;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub search($$)
|
|
||||||
{
|
|
||||||
my $expr = shift;
|
|
||||||
my $attrib = shift;
|
|
||||||
my $res = `ldbsearch -H $opt_samdb \"$expr\" $attrib | grep ^$attrib | cut -d' ' -f2- | head -1`;
|
|
||||||
chomp $res;
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
############################################
|
|
||||||
# show some help
|
|
||||||
sub ShowHelp()
|
|
||||||
{
|
|
||||||
print "
|
|
||||||
Samba4 newuser
|
|
||||||
|
|
||||||
newuser.pl [options]
|
|
||||||
--username USERNAME choose new username
|
|
||||||
--password PASSWORD set password
|
|
||||||
--samdb DBPATH path to sam.ldb
|
|
||||||
|
|
||||||
You must provide at least a username
|
|
||||||
|
|
||||||
";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
my $opt_help;
|
|
||||||
|
|
||||||
GetOptions(
|
|
||||||
'help|h|?' => \$opt_help,
|
|
||||||
'username=s' => \$opt_username,
|
|
||||||
'unixname=s' => \$opt_unixname,
|
|
||||||
'password=s' => \$opt_password,
|
|
||||||
'samdb=s' => \$opt_samdb
|
|
||||||
);
|
|
||||||
|
|
||||||
if ($opt_help || !$opt_username) {
|
|
||||||
ShowHelp();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$opt_password) {
|
|
||||||
$opt_password = randpass();
|
|
||||||
print "chose random password '$opt_password'\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$opt_unixname) {
|
|
||||||
$opt_unixname = $opt_username;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $res = "";
|
|
||||||
|
|
||||||
# allow provisioning to be run from the source directory
|
|
||||||
$ENV{"PATH"} .= ":bin:../bin";
|
|
||||||
|
|
||||||
$ENV{"LDB_URL"} = $opt_samdb;
|
|
||||||
|
|
||||||
my $domain_sid = search("(objectClass=domainDNS)", "objectSid");
|
|
||||||
my $domain_dn = search("(objectClass=domainDNS)", "dn");
|
|
||||||
|
|
||||||
my $ldif = `ldbsearch -H $opt_samdb 'cn=TemplateUser' | grep -v Template | grep -v '^#'`;
|
|
||||||
chomp $ldif;
|
|
||||||
|
|
||||||
my $dom_users = search("name=Domain Users", "dn");
|
|
||||||
|
|
||||||
|
|
||||||
$ldif .= "sAMAccountName: $opt_username\n";
|
|
||||||
$ldif .= "name: $opt_username\n";
|
|
||||||
$ldif .= "objectGUID: " . randguid() . "\n";
|
|
||||||
$ldif .= "memberOf: $dom_users\n";
|
|
||||||
$ldif .= "userAccountControl: 0x10200\n";
|
|
||||||
$ldif .= "sAMAccountType: 0x30000000\n";
|
|
||||||
$ldif .= "unicodePwd: $opt_password\n";
|
|
||||||
$ldif .= "unixName: $opt_unixname\n";
|
|
||||||
|
|
||||||
my $user_dn = "CN=$opt_username,CN=Users,$domain_dn";
|
|
||||||
|
|
||||||
open FILE, ">newuser.ldif";
|
|
||||||
print FILE "dn: $user_dn\n";
|
|
||||||
print FILE "objectClass: user\n";
|
|
||||||
print FILE "$ldif\n";
|
|
||||||
close FILE;
|
|
||||||
|
|
||||||
open FILE, ">modgroup.ldif";
|
|
||||||
print FILE "
|
|
||||||
dn: CN=Domain Users,CN=Users,$domain_dn
|
|
||||||
changetype: modify
|
|
||||||
add: member
|
|
||||||
member: $user_dn
|
|
||||||
";
|
|
||||||
close FILE;
|
|
||||||
|
|
||||||
system("ldbadd newuser.ldif");
|
|
||||||
system("ldbmodify modgroup.ldif");
|
|
@ -53,7 +53,7 @@ function ShowHelp()
|
|||||||
print("
|
print("
|
||||||
Samba4 provisioning
|
Samba4 provisioning
|
||||||
|
|
||||||
provision.pl [options]
|
provision [options]
|
||||||
--realm REALM set realm
|
--realm REALM set realm
|
||||||
--domain DOMAIN set domain
|
--domain DOMAIN set domain
|
||||||
--domain-guid GUID set domainguid (otherwise random)
|
--domain-guid GUID set domainguid (otherwise random)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user