使用Python获取Windows上的目录所有权会导致“拒绝访问”

2024-09-29 00:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用以下代码获取目录的所有权:

sd = win32security.SECURITY_DESCRIPTOR()
sd.SetSecurityDescriptorOwner(curUser, False)
win32security.SetFileSecurity("C:/ProgramData/Test", 
    win32security.OWNER_SECURITY_INFORMATION, sd)

SetFileSecurity调用失败,并出现“拒绝访问”错误。在

当前用户的访问权限已从此目录中删除。在资源管理器中我可以看到它,但是当我试图打开它时,我首先必须以管理员的身份取得所有权。这在Explorer中有效,但是上面的代码是用提升的权限执行的,由于某些原因它仍然失败。有什么建议吗?在


Tags: 代码test目录false权限sdsecurityowner
1条回答
网友
1楼 · 发布于 2024-09-29 00:12:23

您可以通过启用SeTakeOwnerShipPrivilege强制获得所有权,但当然只有在您的访问令牌具有此特权(例如,提升的管理员)的情况下。另外,您可以通过启用SeRestorePrivilege,将所有权强制分配给另一个安全主体,例如SYSTEM。如果没有后者,赋值可能会失败,并出现错误代码ERROR_INVALID_OWNER。在

下面的set_file_owner函数有一个force选项,它试图暂时启用这两个特权。在

import win32api
import win32security

def set_file_owner(path, sid=None, force=False):
    try:
        hToken = win32security.OpenThreadToken(win32api.GetCurrentThread(),
                    win32security.TOKEN_ALL_ACCESS, True)
    except win32security.error:
        hToken = win32security.OpenProcessToken(win32api.GetCurrentProcess(),
                    win32security.TOKEN_ALL_ACCESS)
    if sid is None:
        sid = win32security.GetTokenInformation(hToken,
                win32security.TokenOwner)
    prev_state = ()
    if force:
        new_state = [(win32security.LookupPrivilegeValue(None, name),
                      win32security.SE_PRIVILEGE_ENABLED)
                        for name in (win32security.SE_TAKE_OWNERSHIP_NAME,
                                     win32security.SE_RESTORE_NAME)]
        prev_state = win32security.AdjustTokenPrivileges(hToken, False,
                        new_state)
    try:
        sd = win32security.SECURITY_DESCRIPTOR()
        sd.SetSecurityDescriptorOwner(sid, False)
        win32security.SetFileSecurity(path, 
            win32security.OWNER_SECURITY_INFORMATION, sd)
    finally:
        if prev_state:
            win32security.AdjustTokenPrivileges(hToken, False, prev_state)

def get_file_owner(path):
    sd = win32security.GetFileSecurity(path,
            win32security.OWNER_SECURITY_INFORMATION)
    sid = sd.GetSecurityDescriptorOwner()
    return win32security.LookupAccountSid(None, sid)

示例

^{pr2}$

输出

Test path: C:\Users\eryksun\AppData\Local\Temp\tmpizgemrdz
Initial owner: NT AUTHORITY\SYSTEM
Denying write owner access
Trying with force=True
Final owner: BUILTIN\Administrators

相关问题 更多 >