[python-win32] Re: Folder permissions
Whitaker, Simon SITI-SITI
Simon.Whitaker at shell.com
Sun Jan 30 22:50:38 CET 2005
Isn't a sharing caring community great?
It just so happens that this is the first problem i chose to tackle as i am learning Python as well.
Below is the code you require (i think) with the C translated to Python.
Cheers,
Simon
---
import os, sys, time, win32net, getopt, win32security, string
All_perms={
1:"ACCESS_READ", #0x00000001
2:"ACCESS_WRITE", #0x00000002
4:"ACCESS_CREATE", #0x00000004
8:"ACCESS_EXEC", #0x00000008
16:"ACCESS_DELETE", #0x00000010
32:"ACCESS_ATRIB [sic]", #0x00000020
64:"ACCESS_PERM", #0x00000040
32768:"ACCESS_GROUP", #0x00008000
65536:"DELETE", #0x00010000
131072:"READ_CONTROL", #0x00020000
262144:"WRITE_DAC", #0x00040000
524288:"WRITE_OWNER", #0x00080000
1048576:"SYNCHRONIZE", #0x00100000
16777216:"ACCESS_SYSTEM_SECURITY",#0x01000000
33554432:"MAXIMUM_ALLOWED", #0x02000000
268435456:"GENERIC_ALL", #0x10000000
536870912:"GENERIC_EXECUTE",#0x20000000
1073741824:"GENERIC_WRITE", #0x40000000
65535:"SPECIFIC_RIGHTS_ALL",#0x0000ffff
983040:"STANDARD_RIGHTS_REQUIRED",#0x000f0000
2031616:"STANDARD_RIGHTS_ALL",#0x001f0000
}
Typical_perms={
2032127L:"Full Control(All)",
1179817L:"Read(RX)",
1180086L:"Add",
1180095L:"Add&Read",
1245631L:"Change"
}
def fileperm_get_perms(file):
all_perms = {}
mask = win32security.OWNER_SECURITY_INFORMATION | win32security.GROUP_SECURITY_INFORMATION | win32security.DACL_SECURITY_INFORMATION
sd=win32security.GetFileSecurity(file, mask)
ownersid=sd.GetSecurityDescriptorOwner()
dacl=sd.GetSecurityDescriptorDacl()
count = dacl.GetAceCount()
for i in range(count):
ace = dacl.GetAce(i)
user, domain, int = win32security.LookupAccountSid(None, ace[2])
all_perms[domain+"\\"+user] = ace[1]
return all_perms
def get_mask(mask):
a=2147483648L
if Typical_perms.has_key(mask):
return Typical_perms[mask]
else:
result=''
while a>>1:
a=a>>1
masked=mask&a
if masked:
if All_perms.has_key(masked):
result=All_perms[masked]+':'+result
return result
def is_group(sys_id):
#get the server for the domain -- it has to be a primary dc
group=0
resume=0
sys_id=string.strip(sys_id)
if D_group.has_key(sys_id):
group=1
elif D_except.has_key(sys_id):
group=0
else:
try:
#info returns a dictionary of information
info = win32net.NetGroupGetInfo(Server, sys_id, 0)
group=1
except:
try:
win32net.NetLocalGroupGetMembers(Server, sys_id, 0,resume,4096)
group=1
except:
pass
return group
def get_perm_base(file):
all_perms=fileperm_get_perms(file)
for (domain_id,mask) in all_perms.items():
(domain,sys_id)=string.split(domain_id,'\\',1)
mask_name=get_mask(mask)
Results.append(file+','+sys_id+','+mask_name)
def get_perm(file):
perm_list=[]
perm_list.append(file)
all_perms=fileperm_get_perms(file)
for (domain_id,mask) in all_perms.items():
(domain,sys_id)=string.split(domain_id,'\\',1)
print domain,sys_id
sys_id=str(sys_id)
mask_name=get_mask(mask)
if len(sys_id)<7:
perm_list.append(sys_id+'\t\t\t'+mask_name)
elif len(sys_id)>14:
perm_list.append(sys_id+'\t'+mask_name)
else:
perm_list.append(sys_id+'\t\t'+mask_name)
return perm_list
def get_perms(arg, d, files):
a=2147483648L #1L<<31L
print 'Now at ',d
for i in files:
file=d+'\\'+i
if opts['-d']:
if not os.path.isdir(file): # skip non-directories
continue
all_perms=fileperm_get_perms(file)
for (domain_id,mask) in all_perms.items():
if string.find(domain_id,'\\')!=-1:
(domain,sys_id)=string.split(domain_id,'\\',1)
else:
sys_id=domain_id
mask_name=get_mask(mask)
Results.append(file+','+sys_id+','+mask_name)
Results.sort()
return Results
######################################################################################################
#h - help
#r - recursive
#o - output file
#d - directories only
domain='domain'
Server=str(win32net.NetGetDCName("",domain))
print '************************ Using domain ',domain
only_dir=0
D_group={}
D_except={}
if len(sys.argv)==1:
print sys.argv[0]," file or directory"
print "-r for recursive mode \n-o for output file (default screen) \n-d for directories only"
print 'Example:',sys.argv[0],'-o a.txt -r c:\\junk \n ----goes down dir tree in c:\\junk and saves in a.txt'
sys.exit(0)
else:
try:
optlist, args = getopt.getopt(sys.argv[1:], 'dho:r')
except getopt.error:
print "invalid option. available options are: -d -h -r -o "
print "-r for recursive mode \n-o for output file (default screen) \n-d for directories only"
sys.exit(0)
opts = {'-d':0,'-h':0,'-o':0,'-r':0}
for key, value in optlist:
opts[key]=1
if key == '-o':
opts[key]=value
init=time.clock()
Results=[]
if opts['-r']:
if os.path.isdir(args[0]):
print 'walking thru',args[0]
get_perm_base(args[0])
os.path.walk(args[0],get_perms,opts['-d'])
else:
print 'Directory',args[0],'does not exist'
sys.exit(0)
else:
if os.path.exists(args[0]):
Results=get_perm(args[0])
else:
print 'Directory or file',args[0],'does not exist'
sys.exit(0)
#now print out the results
if opts['-o']:
#send to a file
print 'Storing results in',opts['-o']
f=open(opts['-o'],'w')
for i in Results:
f.write(i)
f.write('\n')
else:
for i in Results:
print i
end = time.clock()-init
---
More information about the Python-win32
mailing list