作为一个用惯了Linux类系统的人,突然更换成了需要操作的windows系统,而且要对windows系统做操作一些获取类的操作,对我来说就感觉十分困难;获取属主属组在Linux内一行命令就可以解决的事情放在windows就让我变得毫无头绪。
这次分享我将已经踩完坑的代码发布出来,并且代码整量就是来做获取文件owner、对文件赋权、和修改owner的
需要用到的模块
win32security
win32api
①、获取一个文件的owner,即所有者
new_file = path+file
def get_file_owner(new_file):
sd = win32security.GetFileSecurity(
new_file, win32security.OWNER_SECURITY_INFORMATION
)
owner_sid = sd.GetSecurityDescriptorOwner()
name, domain, account_type = win32security.LookupAccountSid(None, owner_sid)
if dimain == win32api.GetComputerName():
domain == "."
if name == "Administrators":
__local_administrators = "%s\\Administrators" % win32api.GetComputerName()
else:
return "%s\\%s" % (domain,name)
只需要传入对应文件即可获取文件的owner
②、修改文件owner
empower_file = path+file 注意传入owner的格式为 域\用户名
def set_file_owner(empower_file, owner):
domain_user = owner.split(r'\\')
user_info = win32security.LookupAccountName(domain_user[0],domain_user[1])
hToken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), win32security.TOKEN_ALL_ACCESS)
new_state = [(win32security.LookupPrivilegeValue(None, win32security.SE_TAKE_OWNERSHIP_NAME),win32security.SE_PRIVILEGE_ENABLED),
(win32security.LookupPrivilegeValue(None, win32security.SE_RESTORE_NAME),win32security.SE_PRIVILEGE_ENABLED)]
win32security.AdjustTokenPrivileges(hToken, False, new_state)
sd = win32security.SECURITY_DESCRIPTOR()
sd.SetSecurityDescriptorOwner(user_info[0], False)
win32security.SetFileSecurity(empower_file, win32security.OWNER_SECURITY_INFORMATION, sd)
对于部分人来说这可能已经够了,可如果只能提供一个用户呢
脚本传参只传入了用户没有携带域,那这个函数就不能使用了
使用另一种方法:
def set_all_permissions(file,owner):
userx, domain, type = win32security.LookupAccountName("", owner)
sd = win32security.GetFileSecurity(file, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl()
dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, userx)
sd.SetSecurityDescriptorDacl(1, dacl, 0)
win32security.SetFileSecurity(file, win32security.DACL_SECURITY_INFORMATION, sd)
使用以上的方式虽然不能更改owner,但是可以将用户对文件所有操作的权限增加进去,达到控制文件的需求
另外提供一个只需要提供用户来修改owner的函数
这个函数有一些限制,但依旧能适合一些场景,并且已经将坑踩完,所以一并发出来
def set_file_owner(file, owner):
domain_user = owner.split(r'\\')
user_info = win32security.LookupAccountName(domain_user[0], domain_user[1])
owner_acl = win32security.GetFileSecurity(file, win32security.OWNER_SECURITY_INFORMATION)
owner_acl.SetSecurityDescriptorOwner(user_info[0], True)
win32security.SetFileSecurity(file, win32security.OWNER_SECURITY_INFORMATION, owner_acl)
上方代码实现修改文件的所有者,但是一些限制和条件我这里说明
test 是普通用户
aadmin 是管理员组的用户
administrator 是最高管理员
①、test只能使用自己的owner去修改权限
例如 文件aaa.json 所有者为aadmin
修改成功
②、test使用别的用户的owner(aadmin)去修改权限
修改失败
③、test使用自己的owner(test)去修改文件默认所有者为administrators的权限
失败,因为test是普通用户
④、aadmin使用自己的owner(aadmin) 去修改文件默认所有者为administrators的权限
成功,因为aadmin是管理员组的用户
以上就是此次的所有内容,为了能够解决尽可能多的需求,这里已经把我所知的实现方式都列举了出来,希望能够解决你的问题,减少无必要的时间浪费。