如何使用Python在Windows中新建C:\Projects文件夹共享并为Everyone设置只读权限
Windows下用Python创建指定只读共享的可用方案
你搜不到大量纯Python实现方案的核心原因是:Windows文件夹共享是操作系统层面的系统能力,Python本身没有内置对应的跨平台操作接口,所有实现本质都是调用Windows自带的命令行工具或者原生系统API,不存在脱离Windows能力的纯Python共享逻辑。
下面是两种经过验证、可以从0完成共享创建(而非修改已有共享权限)的实现路径:
方法1:调用系统内置net share命令(零额外依赖,新手友好)
这是最直接的实现方式,不需要安装任何第三方Python库,Windows全版本自带对应的命令行工具,语法原生支持指定用户和权限等级。
实现逻辑:
- 所有操作必须以管理员身份运行Python,否则会触发权限不足报错
- 命令核心参数:指定共享名对应本地路径,通过
/GRANT参数直接给Everyone用户授予只读权限
对应可运行的代码:
import subprocess import sys import os import ctypes # 自动检查并提权到管理员模式 if not ctypes.windll.shell32.IsUserAnAdmin(): ctypes.windll.shell32.ShellExecuteW( None, "runas", sys.executable, " ".join(sys.argv), None, 1 ) sys.exit() # 确认目标文件夹存在 target_folder = r"C:\Projects" if not os.path.isdir(target_folder): print(f"目标文件夹{target_folder}不存在,创建共享失败") sys.exit() # 执行共享创建命令 share_name = "Projects" cmd = f'net share {share_name}="{target_folder}" /GRANT:Everyone,READ /REMARK:"本地项目文件夹共享"' run_result = subprocess.run(cmd, capture_output=True, text=True, shell=True) if run_result.returncode == 0: print("共享创建完成,Everyone用户已被授予只读权限") else: print(f"操作失败,系统返回信息:{run_result.stderr.strip()}")
方法2:通过pywin32调用Windows原生共享API
如果不想通过命令行拼接实现,可以通过pywin32库直接调用Windows的NetShareAdd系统接口,这也是Windows创建网络共享的底层原生接口——你之前搜到的修改已有共享权限的帖子,本质就是这个接口的延伸用法,只是调用的是权限修改分支,而非共享创建分支。
操作前置要求:
- 先安装依赖:
pip install pywin32 - 同样需要以管理员身份运行Python脚本
对应代码:
import win32net import win32netcon import win32security # 基础共享配置 share_config = { "netname": "Projects", "path": r"C:\Projects", "remark": "本地项目文件夹共享", "type": win32netcon.STYPE_DISKTREE, "max_uses": -1, # 不限制同时连接数 "current_uses": 0, } # 配置Everyone用户的只读访问权限 everyone_sid = win32security.ConvertStringSidToSid("S-1-1-0") read_right = win32security.FILE_GENERIC_READ acl = win32security.ACL() acl.AddAccessAllowedAce(win32security.ACL_REVISION, read_right, everyone_sid) # 写入安全描述符 sd = win32security.SECURITY_DESCRIPTOR() sd.SetSecurityDescriptorDacl(True, acl, False) share_config["security_descriptor"] = sd # 发起共享创建请求 try: win32net.NetShareAdd(None, 502, share_config) print("共享创建完成,Everyone用户已被授予只读权限") except win32net.error as err: err_code, _, err_msg = err.args print(f"操作失败,错误码{err_code}:{err_msg}")
常见踩坑说明
- 权限分层问题:共享层设置的Everyone只读,不代表NTFS文件系统层面的权限匹配,如果目标文件夹的NTFS权限没有给Everyone开放读取权限,其他用户就算能看到共享也无法打开文件
- 已有共享冲突:如果系统已经存在和你设置的共享名同名的共享,两种方法都会抛出错误,需要先执行
net share 共享名 /delete删除旧共享 - 匿名访问限制:Win10/Win11默认关闭了匿名访问共享的开关,如果需要非域环境下的公开只读访问,还需要在本地安全策略中开启“网络访问:让Everyone权限应用于匿名用户”选项,该设置无法通过代码直接修改
- 常见错误码对照:
- 错误码5:未使用管理员权限运行脚本
- 错误码2118:同名共享已经存在
- 错误码2102:目标文件夹路径不存在
内容的提问来源于stack exchange,提问作者Noamm
相关产品推荐
相关产品推荐

