1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00
samba-mirror/source4/setup/newuser

142 lines
2.8 KiB
Plaintext
Raw Normal View History

#!/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;