python - Python/Windows:使用 UNC 路径打开文件在由普通用户帐户运行时成功,但在由本地系统运行时失败并显示 [ERRNO 22]
问题描述
我有一个使用 UNC 路径写入 SMB 共享(我的 LAN 上的 Synology NAS)的脚本。我把它提炼成这样:
# test.py
file = r'\\server_name\path\to\desination\file.txt'
with open(file, 'wt') as f:
f.write('test')
在我的普通用户帐户下工作正常。但是当我运行与本地系统相同的脚本时 - 通过将其作为服务运行或使用 psexec:
psexec.exe -s python test.py
...我收到以下错误:
Traceback (most recent call last):
File "test.py", line 3:
with open(file, 'wt') as f:
OSError: [Errno 22] Invalid argument: '\\server_name\path\to\desination\file.txt'
python exited with error code 1.
(期待答案:“只需将 SMB 作为卷安装,并使用文件路径访问它” - 我不能这样做。据我了解,网络安装是用户特定的,并且作为用户登录。但我将此脚本作为服务运行,使用本地系统帐户,因为它需要独立于任何用户登录运行 24/7。)
我认为问题可能出在网络凭据上,因此我psexec.exe cmdkey
将 server_name 的凭据分配给本地系统帐户与用户帐户相同。该cmdkey
命令有效,我可以通过查看本地系统帐户的列表来验证它。不过,我收到相同的错误消息。
我还怀疑这可能是 Windows 机器上的权限问题,例如本地系统帐户被阻止访问网络。但我的研究表明,本地系统是一个完全受信任的帐户,甚至比管理员更高,默认情况下没有网络限制。
错误的性质表明问题出在请求的格式上,特别是作为 UNC 而不是文件系统路径。如果域无效,我会得到 [Errno 1],这是合乎逻辑的。但是如果域是正确的,那么无论路径是否正确映射到卷内的任何共享,我都会得到 [Errno 22]。我尝试了各种不同的格式——原始字符串、转义反斜杠、用正斜杠替换、转义空格等——没有任何效果或以任何方式改变错误的性质。
当脚本通过普通用户帐户运行时,路径的格式是可以接受的,但当脚本通过本地系统帐户运行时,基本上会出现语法错误,这让我感到莫名其妙。
有什么帮助吗?提前致谢。
解决方案
推荐阅读
- javascript - 当我为反应原生项目运行“npm start”命令时没有任何反应
- git - 如何转到特定文件的最后 5 次提交?
- dart - Flutter 中的 JSON 解码
- reactjs - 简单的 React-Redux 组件不更新
- bash - 将 shell 脚本表达式求值转换为变量
- java - 在当前主题中找不到样式“textInputStyle”
- reactjs - 带有 React 显示的 Ruby on Rails link_to
- android - 如何使用 BindingAdapter 来更新 RecyclerView?
- javascript - 具有动态调用函数的类型(代理)的打字稿定义
- python - 为什么我的代码不能计算一个数字可以被二除多少次?