使用popen时访问被拒绝 - Python

1 投票
1 回答
3317 浏览
提问于 2025-04-16 00:01

我在一个Django应用中使用popen来发送一些命令。

问题是我遇到了[错误 5] 访问被拒绝,看起来我没有权限访问cmd.exe,而popen似乎是用这个程序的。

Windows错误在/test/cmd/

[错误 5] 访问被拒绝: 'C:\WINDOWS\system32\cmd.exe /c dir'

我想这可能是因为这个应用运行在一个权限有限的网络服务器后面。


我们能做些什么来解决这个问题吗?任何帮助都非常棒!

1 个回答

4

你遇到这个问题的原因:

你在提问时忘了提到,你是在使用IIS(互联网信息服务)运行它,并且使用的是ISAPI > ISAPI_WSGI(或者在IIS 7/6上用flup作为WSGI的FastCGI包装器)。

这实际上是因为c:\windows\system32\cmd.exe的执行权限问题。

我在IIS 6上也遇到过完全相同的问题。我尝试调整应用池的设置,以为把应用池的用户设置为“本地系统”或类似的选项就能解决这个问题。无论我把应用池的用户设置成什么,我总是会收到“访问被拒绝”的错误。我傻傻地以为是cPython的管道出了问题,因为在同一台机器上用IronPython运行命令是可以的。

这里是解决方法:

A.

放宽IIS服务或c:\windows\system32\cmd.exe的用户权限。(我尝试过在应用池上放宽权限,但IIS进程的权限依然很严格,这对我没有帮助。我猜ISAPI > ISAPI_WSGI的运行权限是受限于IIS进程的权限。)

运行IIS(Web发布)服务的用户必须直接添加,或者至少要在一个拥有c:\windows\system32\cmd.exe的读取和执行权限的组里。

我没有尝试的事情:我在想,是否可以不改变IIS服务的用户权限,而是改变“匿名”用户的权限来解决问题。

B.

如果你认真想让它在Windows上运行,可以考虑放弃cPython,改用IronPython + NWSGI(可以在CodePlex上找到)。我用NWSGI来处理简单的WSGI应用,并且可以使用专门为IronPython编写的subprocess.py来运行子进程。(这个文件在这里:http://bitbucket.org/jdhardy/code/src/126ce1f8fddd/subprocess.py,你可以看看同一个jdhardy的其他代码库。他有一些补丁专门用来让Django在.Net和IronPython上运行。)

撰写回答