首页 > 解决方案 > 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]。我尝试了各种不同的格式——原始字符串、转义反斜杠、用正斜杠替换、转义空格等——没有任何效果或以任何方式改变错误的性质。

当脚本通过普通用户帐户运行时,路径的格式是可以接受的,但当脚本通过本地系统帐户运行时,基本上会出现语法错误,这让我感到莫名其妙。

有什么帮助吗?提前致谢。

标签: pythonwindowssmbunc

解决方案


推荐阅读