You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现USB只读?PyCharm中代码失效求助

问题:Python设置USB只读目录无效(普通文件夹正常)

我尝试在PyCharm中通过Python将USB驱动器设置为只读模式,找到的代码对普通文件夹生效,但对USB目录(比如F:\)完全无效,恳请大家协助排查问题!

我用到的代码片段如下:

import win32security
import ntsecuritycon as con
import getpass

file_name = r'F:\' # THE USB
sd = win32security.GetFileSecurity(file_name, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl()
ace_count = dacl.GetAceCount()
print('Ace count:', ace_count)
for i in range(0, ace_count): 
    # 此处代码被截断,推测是遍历ACE并修改权限的逻辑

问题分析&解决方案

咱们先理清核心问题:USB作为可移动存储设备,Windows对它的权限管理有特殊限制,和普通本地文件夹的权限逻辑不完全一致,这也是你的代码失效的关键原因。下面是具体的排查方向和解决方法:

1. 先确认是否以管理员权限运行PyCharm

USB根目录的权限修改需要系统级权限,普通用户权限下代码即使逻辑正确,也会静默执行失败(不会报错,但权限根本没改)。

  • 解决:右键点击PyCharm图标,选择「以管理员身份运行」,再重新执行代码。

2. 禁用USB根目录的权限继承

可移动存储的根目录默认开启了权限继承,直接修改DACL会被系统忽略。需要先禁用继承,再修改权限:

# 在获取dacl后添加这行代码,禁用继承并保留现有权限
sd.SetSecurityDescriptorDacl(True, dacl, False)

3. 补全完整的权限修改逻辑

你提供的代码只到遍历ACE的部分,缺少关键的「添加拒绝写入ACE」和「写回安全描述符」步骤。这里给你一套完整的可运行代码:

import win32security
import ntsecuritycon as con
import getpass

def set_usb_read_only(usb_path):
    # 获取当前登录用户的SID
    current_user = getpass.getuser()
    user_sid = win32security.LookupAccountName(None, current_user)[0]

    # 获取USB目录的安全描述符(包含DACL和所有者信息)
    sd = win32security.GetFileSecurity(
        usb_path,
        win32security.DACL_SECURITY_INFORMATION | win32security.OWNER_SECURITY_INFORMATION
    )
    dacl = sd.GetSecurityDescriptorDacl()

    # 禁用权限继承,避免系统覆盖我们的修改
    sd.SetSecurityDescriptorDacl(True, dacl, False)

    # 创建「拒绝写入/修改/删除」的ACE规则
    # 包含文件写入、新增文件、新增子目录、删除子项等权限
    deny_permissions = con.FILE_WRITE_DATA | con.FILE_ADD_FILE | con.FILE_ADD_SUBDIRECTORY | con.FILE_DELETE_CHILD
    win32security.ACL.AddAccessDeniedAce(
        dacl,
        win32security.ACL_REVISION,
        deny_permissions,
        user_sid
    )

    # 将修改后的安全描述符写回USB目录
    win32security.SetFileSecurity(
        usb_path,
        win32security.DACL_SECURITY_INFORMATION,
        sd
    )
    print(f"已成功将USB目录 {usb_path} 设置为只读模式")

if __name__ == "__main__":
    target_usb = r'F:\'
    set_usb_read_only(target_usb)

4. 检查USB硬件写保护开关

有些物理USB设备自带硬件写保护开关(通常在USB侧面),如果开关处于「写保护开启」状态,软件层面的权限修改完全无效。先确认你的USB没有开启硬件写保护。

内容的提问来源于stack exchange,提问作者AnthonyS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:41