@ -0,0 +1,149 @@ | |||||
import ldb | |||||
from samba.samdb import SamDB | |||||
from samba.auth import system_session | |||||
# from samba.ndr import ndr_pack, ndr_unpack | |||||
# from samba.dcerpc import security | |||||
import samba.param | |||||
# import base64 | |||||
# import binascii | |||||
base = "CN=Users,DC=techgrow,DC=local" # можно не заморачиваться с ОУ и тогда base = "CN=Users,DC=myDom,DC=lan" | |||||
domainName = 'techgrow.local' | |||||
class UserAd: | |||||
def __init__(self, sam, base, domainName, usrName, usrPass=''): | |||||
self.sam = sam | |||||
self.base = base | |||||
self.domainName = domainName | |||||
self.usrName = usrName | |||||
self.usrPass = usrPass | |||||
self.exists = self.chek_if_exists() | |||||
if not self.exists: | |||||
self.add() | |||||
self.memberOf = self.check_memberof() | |||||
def chek_if_exists(self): | |||||
expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName | |||||
if len(self.sam.search(base=base, expression=expression, attrs=['sAMAccountName'])) > 0: | |||||
return True | |||||
else: | |||||
return False | |||||
def check_memberof(self): | |||||
expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName | |||||
res = self.sam.search(base=base, expression=expression, attrs=['memberOf']) | |||||
groups = [] | |||||
for k in res[0]['memberOf']: | |||||
groups.append(str(k).split(',')[0].split('=')[1]) | |||||
return groups | |||||
def add(self): | |||||
ld = {'dn': 'CN=%s,%s' % (self.usrName, base), | |||||
"sAMAccountName": self.usrName, | |||||
"userPrincipalName": "%s@%s" % (self.usrName, self.domainName), | |||||
"objectClass": "user", | |||||
"displayName": self.usrName, | |||||
"description": self.usrName, | |||||
"homeDirectory": r"\\%s\users\%s" % ("dc01", self.usrName), | |||||
'scriptPath': "loginScr.cmd", | |||||
} | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.add(ld) | |||||
self.sam.setpassword("(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
self.sam.transaction_commit() | |||||
self.chek_if_exists() | |||||
return False | |||||
def set_passwd(self): | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.setpassword("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
self.sam.transaction_commit() | |||||
return False | |||||
def add_in_group(self, grpName): | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
self.sam.transaction_commit() | |||||
self.memberOf = self.check_memberof() | |||||
return False | |||||
def remove_from_group(self, grpName): | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
self.sam.transaction_commit() | |||||
return False | |||||
def remove(self): | |||||
smb_filter = ("(&(sAMAccountName=%s)(sAMAccountType=805306368))" % | |||||
ldb.binary_encode(self.usrName)) | |||||
try: | |||||
res = self.sam.search(base=self.sam.domain_dn(), | |||||
scope=ldb.SCOPE_SUBTREE, | |||||
expression=smb_filter, | |||||
attrs=["dn"]) | |||||
user_dn = res[0].dn | |||||
except IndexError: | |||||
return 'Unable to find user "%s"' % self.usrName | |||||
try: | |||||
self.sam.delete(user_dn) | |||||
except Exception as e: | |||||
return 'Failed to remove user "%s", %s' % (self.usrName, e) | |||||
return False | |||||
def disable(self): | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.disable_account("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName)) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
return False | |||||
def enable(self): | |||||
self.sam.transaction_start() | |||||
try: | |||||
self.sam.enable_account("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName)) | |||||
except Exception as exc: | |||||
self.sam.transaction_cancel() | |||||
return exc | |||||
else: | |||||
return False | |||||
def main(): | |||||
lp = samba.param.LoadParm() | |||||
lp.load(samba.param.default_path()) # или lp.load("/etc/samba/smb.conf") | |||||
sam = SamDB(lp=lp, session_info=system_session()) | |||||
test_usr = UserAd(sam, base, domainName, 'tst', "secret34daD") | |||||
print test_usr.memberOf | |||||
err = test_usr.set_passwd() | |||||
if err: | |||||
print err | |||||
if __name__ == '__main__': | |||||
main() |
Powered by TurnKey Linux.