149 lines
5.0 KiB

  1. import ldb
  2. from samba.samdb import SamDB
  3. from samba.auth import system_session
  4. # from samba.ndr import ndr_pack, ndr_unpack
  5. # from samba.dcerpc import security
  6. import samba.param
  7. # import base64
  8. # import binascii
  9. base = "CN=Users,DC=techgrow,DC=local" # можно не заморачиваться с ОУ и тогда base = "CN=Users,DC=myDom,DC=lan"
  10. domainName = 'techgrow.local'
  11. class UserAd:
  12. def __init__(self, sam, base, domainName, usrName, usrPass=''):
  13. self.sam = sam
  14. self.base = base
  15. self.domainName = domainName
  16. self.usrName = usrName
  17. self.usrPass = usrPass
  18. self.exists = self.chek_if_exists()
  19. if not self.exists:
  20. self.add()
  21. self.memberOf = self.check_memberof()
  22. def chek_if_exists(self):
  23. expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName
  24. if len(self.sam.search(base=base, expression=expression, attrs=['sAMAccountName'])) > 0:
  25. return True
  26. else:
  27. return False
  28. def check_memberof(self):
  29. expression = "(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s))" % self.usrName
  30. res = self.sam.search(base=base, expression=expression, attrs=['memberOf'])
  31. groups = []
  32. for k in res[0]['memberOf']:
  33. groups.append(str(k).split(',')[0].split('=')[1])
  34. return groups
  35. def add(self):
  36. ld = {'dn': 'CN=%s,%s' % (self.usrName, base),
  37. "sAMAccountName": self.usrName,
  38. "userPrincipalName": "%s@%s" % (self.usrName, self.domainName),
  39. "objectClass": "user",
  40. "displayName": self.usrName,
  41. "description": self.usrName,
  42. "homeDirectory": r"\\%s\users\%s" % ("dc01", self.usrName),
  43. 'scriptPath': "loginScr.cmd",
  44. }
  45. self.sam.transaction_start()
  46. try:
  47. self.sam.add(ld)
  48. self.sam.setpassword("(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False)
  49. except Exception as exc:
  50. self.sam.transaction_cancel()
  51. return exc
  52. else:
  53. self.sam.transaction_commit()
  54. self.chek_if_exists()
  55. return False
  56. def set_passwd(self):
  57. self.sam.transaction_start()
  58. try:
  59. self.sam.setpassword("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName), self.usrPass, False)
  60. except Exception as exc:
  61. self.sam.transaction_cancel()
  62. return exc
  63. else:
  64. self.sam.transaction_commit()
  65. return False
  66. def add_in_group(self, grpName):
  67. self.sam.transaction_start()
  68. try:
  69. self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True)
  70. except Exception as exc:
  71. self.sam.transaction_cancel()
  72. return exc
  73. else:
  74. self.sam.transaction_commit()
  75. self.memberOf = self.check_memberof()
  76. return False
  77. def remove_from_group(self, grpName):
  78. self.sam.transaction_start()
  79. try:
  80. self.sam.add_remove_group_members(grpName, [self.usrName], add_members_operation=True)
  81. except Exception as exc:
  82. self.sam.transaction_cancel()
  83. return exc
  84. else:
  85. self.sam.transaction_commit()
  86. return False
  87. def remove(self):
  88. smb_filter = ("(&(sAMAccountName=%s)(sAMAccountType=805306368))" %
  89. ldb.binary_encode(self.usrName))
  90. try:
  91. res = self.sam.search(base=self.sam.domain_dn(),
  92. scope=ldb.SCOPE_SUBTREE,
  93. expression=smb_filter,
  94. attrs=["dn"])
  95. user_dn = res[0].dn
  96. except IndexError:
  97. return 'Unable to find user "%s"' % self.usrName
  98. try:
  99. self.sam.delete(user_dn)
  100. except Exception as e:
  101. return 'Failed to remove user "%s", %s' % (self.usrName, e)
  102. return False
  103. def disable(self):
  104. self.sam.transaction_start()
  105. try:
  106. self.sam.disable_account("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName))
  107. except Exception as exc:
  108. self.sam.transaction_cancel()
  109. return exc
  110. else:
  111. return False
  112. def enable(self):
  113. self.sam.transaction_start()
  114. try:
  115. self.sam.enable_account("&(objectClass=user)(samAccountName=%s)" % ldb.binary_encode(self.usrName))
  116. except Exception as exc:
  117. self.sam.transaction_cancel()
  118. return exc
  119. else:
  120. return False
  121. def main():
  122. lp = samba.param.LoadParm()
  123. lp.load(samba.param.default_path()) # или lp.load("/etc/samba/smb.conf")
  124. sam = SamDB(lp=lp, session_info=system_session())
  125. test_usr = UserAd(sam, base, domainName, 'tst', "secret34daD")
  126. print test_usr.memberOf
  127. err = test_usr.set_passwd()
  128. if err:
  129. print err
  130. if __name__ == '__main__':
  131. main()

Powered by TurnKey Linux.