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.

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

Powered by TurnKey Linux.