[Samba] [PATCH] allow to create Unix-UID/SID mapping in samba-tool user create

Alexander Wuerstlein snalwuer at cip.cs.fau.de
Mon Sep 24 16:19:27 MDT 2012


From: Alexander Wuerstlein <arw at arw.name>

Reads Unix UID from NSS or commandline and creates a
UID/SID mapping when creating a new user.
---
 source4/scripting/python/samba/netcmd/user.py |   38 ++++++++++++++++++++----
 1 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/source4/scripting/python/samba/netcmd/user.py b/source4/scripting/python/samba/netcmd/user.py
index 1172f4e..44a37fd 100644
--- a/source4/scripting/python/samba/netcmd/user.py
+++ b/source4/scripting/python/samba/netcmd/user.py
@@ -22,6 +22,8 @@ import ldb
 from getpass import getpass
 from samba.auth import system_session
 from samba.samdb import SamDB
+from samba.idmap import IDmapDB
+import pwd
 from samba import (
     dsdb,
     gensec,
@@ -48,6 +50,8 @@ A user account enables a user to logon to a computer and domain with an identity
 
 The command may be run from the root userid or another authorized userid.  The -H or --URL= option can be used to execute the command against a remote server.
 
+With --match-unix-uid a SID/UID-mapping is created for the new user which is used to map filesystem permissions from Unix filesystems to Windows. Optionally, a UID can be explicitly given via --unix-uid, without an explicit UID NSS is used to obtain the UID if possible. Creation of a SID/UID-mapping is not possible when running samba-tool on a remote server.
+
 Example1:
 samba-tool user add User1 passw0rd --given-name=John --surname=Smith --must-change-at-next-login -H ldap://samba.samdom.example.com -Uadministrator%passw1rd
 
@@ -63,6 +67,11 @@ samba-tool user add User3 passw3rd --userou=OrgUnit
 
 Example3 shows how to create a new user in the OrgUnit organizational unit.
 
+Example4:
+samba-tool user create unixgod passw4rd --match-unix-uid --unix-uid 31337
+
+Example4 shows how to create a new user and map his windows SID to his Unix UID 31337.
+
 """
     synopsis = "%prog <username> [<password>] [options]"
 
@@ -96,6 +105,8 @@ Example3 shows how to create a new user in the OrgUnit organizational unit.
         Option("--internet-address", help="User's home page", type=str),
         Option("--telephone-number", help="User's phone number", type=str),
         Option("--physical-delivery-office", help="User's office location", type=str),
+        Option("--match-unix-uid", help="Set User's Unix UID from NSS or from --unix-uid", action="store_true"),
+        Option("--unix-uid", help="Unix UID of the new user", type=str),
     ]
 
     takes_args = ["username", "password?"]
@@ -107,13 +118,12 @@ Example3 shows how to create a new user in the OrgUnit organizational unit.
         }
 
     def run(self, username, password=None, credopts=None, sambaopts=None,
-            versionopts=None, H=None, must_change_at_next_login=False,
-            random_password=False, use_username_as_cn=False, userou=None,
-            surname=None, given_name=None, initials=None, profile_path=None,
-            script_path=None, home_drive=None, home_directory=None,
+            versionopts=None, H=None, must_change_at_next_login=False, random_password=False,
+            use_username_as_cn=False, userou=None, surname=None, given_name=None, initials=None,
+            profile_path=None, script_path=None, home_drive=None, home_directory=None,
             job_title=None, department=None, company=None, description=None,
-            mail_address=None, internet_address=None, telephone_number=None,
-            physical_delivery_office=None):
+            mail_address=None, internet_address=None, telephone_number=None, physical_delivery_office=None,
+            match_unix_uid=False, unix_uid=None):
 
         if random_password:
             password = generate_random_password(128, 255)
@@ -133,12 +143,26 @@ Example3 shows how to create a new user in the OrgUnit organizational unit.
         try:
             samdb = SamDB(url=H, session_info=system_session(),
                           credentials=creds, lp=lp)
-            samdb.newuser(username, password, force_password_change_at_next_login_req=must_change_at_next_login,
+            samdb.newuser(username, password,
+                          force_password_change_at_next_login_req=must_change_at_next_login,
                           useusernameascn=use_username_as_cn, userou=userou, surname=surname, givenname=given_name, initials=initials,
                           profilepath=profile_path, homedrive=home_drive, scriptpath=script_path, homedirectory=home_directory,
                           jobtitle=job_title, department=department, company=company, description=description,
                           mailaddress=mail_address, internetaddress=internet_address,
                           telephonenumber=telephone_number, physicaldeliveryoffice=physical_delivery_office)
+            if match_unix_uid:
+		idmap = IDmapDB(lp=lp)
+		sids = samdb.search(samdb.get_default_basedn(), scope=ldb.SCOPE_SUBTREE,
+			expression=("(&(objectClass=user)(samaccountname=%s))" % username),
+			attrs=["objectSid"])
+		if (len(sids) != 1):
+			raise CommandError("Failed to set Unix UID for '%s'" % username, e)
+		if not unix_uid:
+			pwent = pwd.getpwnam(username)
+			unix_uid = pwent[2]
+		sid = samdb.schema_format_value("objectSid", sids[0]["objectSid"][0])
+		self.outf.write("User '%s' matched to UID '%u' and SID '%s'\n" % (username,unix_uid,sid))
+		idmap.setup_name_mapping(sid, idmap.TYPE_UID, unix_uid)
         except Exception, e:
             raise CommandError("Failed to add user '%s': " % username, e)
 
-- 
1.7.2.5



More information about the samba mailing list