当前位置: 首页 > 工具软件 > OWNER > 使用案例 >

Windows 获取和修改Owner

夏侯瑞
2023-12-01

前言:

  作为一个用惯了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是管理员组的用户

以上就是此次的所有内容,为了能够解决尽可能多的需求,这里已经把我所知的实现方式都列举了出来,希望能够解决你的问题,减少无必要的时间浪费。

 类似资料: