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

2023-12-30

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

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

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

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


您可以通过启用来强制取得所有权SeTakeOwnerShipPrivilege,但当然前提是您的访问令牌具有此权限(例如,高级管理员)。此外,您可以强制将所有权分配给另一个安全主体,例如SYSTEM,通过启用SeRestorePrivilege。如果没有后者,分配可能会失败并显示错误代码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)

Example

if __name__ == '__main__':
    import os
    import tempfile
    import subprocess

    username = os.environ['UserName']
    test_path = tempfile.mkdtemp()
    print('Test path: {}'.format(test_path))
    subprocess.call(['icacls.exe', test_path, '/setowner', 'SYSTEM'],
                     creationflags=8)
    owner = get_file_owner(test_path)
    print('Initial owner: {}\\{}'.format(owner[1], owner[0]))
    try:
        print('Denying write owner access')
        subprocess.call(['icacls.exe', test_path, '/deny',
                         '{}:(WO)'.format(username)], creationflags=8)
        try:
            set_file_owner(test_path)
        except win32security.error:
            print('Trying with force=True')
            try:
                set_file_owner(test_path, force=True)
            except win32security.error:
                pass
    finally:
        owner = get_file_owner(test_path)
        print('Final owner: {}\\{}'.format(owner[1], owner[0]))
        os.rmdir(test_path)

Output

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 在 Windows 上获取目录所有权会导致“访问被拒绝”错误 的相关文章

随机推荐

  • 如何在 webview 中显示无互联网连接对话框 |安卓工作室

    我正在尝试在网络视图中添加一条消息 当您没有互联网连接时 该消息应该会出现 我尝试了很多方法 但总是犯一个我不明白的错误 我创建了一个名为 assets 的文件夹 并按照 YouTube 教程添加了一个文件 error html 但它给了我
  • PHP crypt 和 salt - 请更多说明

    我昨天在这里得到了一些非常好的答案 我把我得到的东西放在一起 我认为这将是一个相当安全的算法 我在使用带有生成盐的 for 循环的河豚时遇到问题 我使用 base64 字符和 for 循环来获取随机字符串 我想获取这个生成的字符串并将其作为
  • Rails:无法访问我的 lib 目录中的模块

    我想创建一个通用字符串操作类 可以在我的 Rails 应用程序中的模型 视图和控制器之间使用 现在 我正在尝试将模块放入我的 lib 目录中 并且我只是尝试访问 Rails 控制台中的函数来测试它 我已经尝试了很多类似问题中的技术 但我无法
  • NSDate:获取独立于设备时钟的精确时间? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在应用程序运行之间本地检测用户的 iPhone 时钟进度 https stackoverflow com questions 7122216 how can i locally detect ip
  • Ruby On Rails - 地理编码器 - 接近条件

    我在我的应用程序中使用 GeoCoder 现在我需要在数据库中搜索靠近某个位置或具有特定属性集的对象 我想在一个数据库查询中执行此操作 因为数据库确实很大 我想要有类似的东西 Spot near lat long distance wher
  • 硬币组合的完整搜索算法

    该问题与硬币找零问题类似 但略有不同 问题描述为 你有一组硬币 并且你知道这些硬币的价值以及其中每种硬币的数量 您想知道可以从这些硬币的非空分组中赚取多少不同的金额 例如coins 1 2 3 和数量 1 2 2 有 11 种可能的和 基本
  • Laravel:外观实际上在调用方法时创建新对象吗?

    我有一个演示类 通常通过 this gt app gt bind demo function return new Demo 设立一个门面 protected static function getFacadeAccessor return
  • 在 R 中保存并重新加载“列表”对象

    我正在尝试将我手动创建的列表对象保存到以下内容中list我可以很快参考的格式 保存的对象应该能够作为list not df或任何东西 下面是我的列表对象的一部分 citations lt list as integer c 1 2 3 4
  • 任务管理器显示内存泄漏,但堆快照没有

    我每 5 秒运行一次大量 JavaScript 任务管理器显示内存使用量不断增加 然而堆快照却没有 如果我停止脚本 大约半分钟两分钟后内存将被清除 UPDATE 如果我长时间离开脚本 内存就会增加 直到浏览器崩溃 我还尝试运行 chrome
  • PostgreSQL 对文本数组值的查询

    我有一个表 其中一列有一个数组 但以文本格式存储 mytable id ids 1 3 4 2 3 5 3 3 etc 我想找到数组元素中值为 5 的所有记录ids column 我试图通过使用 字符串到数组 功能并删除 符号与transl
  • 在 NGRX 上的 ActionsSubject 订阅上使用操作的有效负载

    我又旧又坏Property payload does not exist on type Action执行此操作订阅 由于是创建操作 我需要有效负载来签出userId最近创建的用户并导航到 users userId 顺便说一句 我正在关注这
  • 删除测试期间生成的 id

    对于负载测试vu阶段我生成了很多具有唯一 ID 的对象 并将它们放入数据库中 我想在期间删除它们teardown阶段以免污染数据库 当保持这样的状态时 let ids export function setup ids push put i
  • 实现大型文本文件阅读器的最佳策略

    我们有一个应用程序将其处理步骤记录到文本文件中 这些文件在实施和测试期间用于分析问题 每个文件的大小最大为 10MB 最多包含 100 000 行文本 目前 对这些日志的分析是通过打开文本查看器 Notepad 等 并根据问题查找特定字符串
  • ctypes 与 _ctypes - 为什么后者存在?

    我最近了解到Python不仅有一个名为ctypes 其中有一个文档页面 https docs python org library ctypes html 还有一个名为 ctypes which doesn t https docs pyt
  • Android 无需 USB 调试

    我使用 Eclipse 我想使用我的设备调试我的应用程序 但又不损坏其电池 因为我应该始终在电池尚未放电时为其充电 是否可以在不通过 USB 连接的情况下将设备连接到 adb 我尝试使用 logcat 应用程序 但有点不舒服 我搜索了一个不
  • Rails STI,子类除非使用否则不会显示?

    我正在使用 Rails STI 对复杂域进行建模 在视图中 我列出了所有子类 gt li gt li 目的是最终使子类的每个标签都成为指向该子类实例的单独 索引 页面的链接 这使我不必自己拥有所有可能的子类的列表 如果我添加更多子类 则稍后
  • 在 Jest 中调试内存泄漏需要遵循哪些步骤?

    我在 Jest 中的测试似乎正在泄漏 调试此类问题的建议步骤是什么 我对这类问题很陌生 正如你所看到的 我尝试过传入Jest 中记录的选项 https jestjs io docs en cli html forceExit detectO
  • 是否可以在 Haskell 中创建 PHP 扩展?

    是否可以使用 Haskell 创建 PHP 扩展 通常 PHP 扩展是使用 C 编写的 使用 Haskell FFI 为存根 C 扩展提供功能是否可行 甚至是一个好主意 这种方法有哪些注意事项 Zend 是否会在后台施展一些魔法来破坏这样的
  • PhoneGap 电子邮件撰写器插件

    我构建了一个简单的基于 jQuery Mobile 的应用程序 并尝试使用 Phonegap 对其进行编译 我希望用户能够通过电子邮件从应用程序发送一些内容 但我无法弄清楚这一点 My code
  • 使用 Python 在 Windows 上获取目录所有权会导致“访问被拒绝”错误

    我正在尝试使用以下代码获取目录的所有权 sd win32security SECURITY DESCRIPTOR sd SetSecurityDescriptorOwner curUser False win32security SetFi