如何用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
相关产品推荐
相关产品推荐

