You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.4 KiB

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

Powered by TurnKey Linux.