FileSecurityTest.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # Contributed by Kelly Kranabetter.
  2. import os, sys
  3. import win32security, ntsecuritycon
  4. # get security information
  5. #name=r"c:\autoexec.bat"
  6. #name= r"g:\!workgrp\lim"
  7. name=sys.argv[0]
  8. if not os.path.exists(name):
  9. print name, "does not exist!"
  10. sys.exit()
  11. print "On file " , name, "\n"
  12. # get owner SID
  13. print "OWNER"
  14. sd= win32security.GetFileSecurity(name, win32security.OWNER_SECURITY_INFORMATION)
  15. sid= sd.GetSecurityDescriptorOwner()
  16. print " ", win32security.LookupAccountSid(None, sid)
  17. # get group SID
  18. print "GROUP"
  19. sd= win32security.GetFileSecurity(name, win32security.GROUP_SECURITY_INFORMATION)
  20. sid= sd.GetSecurityDescriptorGroup()
  21. print " ", win32security.LookupAccountSid(None, sid)
  22. # get ACEs
  23. sd= win32security.GetFileSecurity(name, win32security.DACL_SECURITY_INFORMATION)
  24. dacl= sd.GetSecurityDescriptorDacl()
  25. if dacl == None:
  26. print "No Discretionary ACL"
  27. else:
  28. for ace_no in range(0, dacl.GetAceCount()):
  29. ace= dacl.GetAce(ace_no)
  30. print "ACE", ace_no
  31. print " -Type"
  32. for i in ("ACCESS_ALLOWED_ACE_TYPE", "ACCESS_DENIED_ACE_TYPE", "SYSTEM_AUDIT_ACE_TYPE", "SYSTEM_ALARM_ACE_TYPE"):
  33. if getattr(ntsecuritycon, i) == ace[0][0]:
  34. print " ", i
  35. print " -Flags", hex(ace[0][1])
  36. for i in ("OBJECT_INHERIT_ACE", "CONTAINER_INHERIT_ACE", "NO_PROPAGATE_INHERIT_ACE", "INHERIT_ONLY_ACE", "SUCCESSFUL_ACCESS_ACE_FLAG", "FAILED_ACCESS_ACE_FLAG"):
  37. if getattr(ntsecuritycon, i) & ace[0][1] == getattr(ntsecuritycon, i):
  38. print " ", i
  39. print " -mask", hex(ace[1])
  40. # files and directories do permissions differently
  41. permissions_file= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "FILE_GENERIC_READ", "FILE_GENERIC_WRITE", "FILE_GENERIC_EXECUTE", "FILE_DELETE_CHILD")
  42. permissions_dir= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "FILE_ADD_SUBDIRECTORY", "FILE_ADD_FILE", "FILE_DELETE_CHILD", "FILE_LIST_DIRECTORY", "FILE_TRAVERSE", "FILE_READ_ATTRIBUTES", "FILE_WRITE_ATTRIBUTES", "FILE_READ_EA", "FILE_WRITE_EA")
  43. permissions_dir_inherit= ("DELETE", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER", "SYNCHRONIZE", "GENERIC_READ", "GENERIC_WRITE", "GENERIC_EXECUTE", "GENERIC_ALL")
  44. if os.path.isfile(name):
  45. permissions= permissions_file
  46. else:
  47. permissions= permissions_dir
  48. # directories also contain an ACE that is inherited by children (files) within them
  49. if ace[0][1] & ntsecuritycon.OBJECT_INHERIT_ACE == ntsecuritycon.OBJECT_INHERIT_ACE and ace[0][1] & ntsecuritycon.INHERIT_ONLY_ACE == ntsecuritycon.INHERIT_ONLY_ACE:
  50. permissions= permissions_dir_inherit
  51. calc_mask= 0 # calculate the mask so we can see if we are printing all of the permissions
  52. for i in permissions:
  53. if getattr(ntsecuritycon, i) & ace[1] == getattr(ntsecuritycon, i):
  54. calc_mask= calc_mask | getattr(ntsecuritycon, i)
  55. print " ", i
  56. print " ", "Calculated Check Mask=", hex(calc_mask)
  57. print " -SID\n ", win32security.LookupAccountSid(None, ace[2])