我写了一个ACM online judge 网站。
asp.net 3.5 + .net framework 3.5 + Sql Server 2005 (C#语言)
该系统在进行判题的时候,调用了一个保存于硬盘的 "core.exe" 程序。
我用管理员账号“Administrator”在系统新建了一个“零权限”用户
---- 用户名:text, 密码“test”
(所谓“零权限”是指 test 用户不属于任何用户组, 比如它不属于“Administrators” , 不属于"Guests", )
如果用户提交了一段代码, 通过了编译。系统给它产生一个target.exe
随即启动“core.exe” ,core.exe根据运行参数里的零权限用户参数,利用零权限用户(“test”用户)启动target.exe。用于实时监测target.exe的内存使用、运行时间情况。target.exe是使用零权限用户 test启动的。
给“core.exe”设置一个运行参数, 参数如下:
FILE:"D:\target.exe" USERNAME:"test" PASSWORD:"test"
USERNAME 和 PASSWORD 的参数选项是用于启动运行target.exe的用户名和密码。
调用core.exe的C#代码如下:
_process = new Process();
_process.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
_process.StartInfo.UseShellExecute = false;
_process.StartInfo.CreateNoWindow = false;
_process.StartInfo.RedirectStandardOutput = true;
_process.StartInfo.FileName = @"D:\core.exe";
_process.StartInfo.Arguments = "FILE:\"D:\target.exe\" USERNAME:\"test\" PASSWORD:\"test\"";
_process.Start();
_process.WaitForExit();
String result;
result = _process.StandardOutput.ReadToEnd();
本地调试网站的时候,WebDev.WebServer.EXE(ASP.NET Development Server)是以 “Administrator” 系统管理员身份启动的。
该虚拟服务器在执行 "_process"对象所启动的程序(即" core.exe") 也是以“Administrator” 系统管理员身份启动运行的。core.exe 被启动之后, 根据参数以零权限用户“test”启动target.exe。
WebDev.WebServer.EXE --- Administrator用户运行
core.exe ---- Administrator用户运行
target.exe ---- test用户运行
本地调试通过。 无任何异常。
但是网站系统被部署到IIS 上面后。可怕的结果出现了。
我在网站的“应用程序池 --> 高级设置 --> 进程模型 --> 标识”(应用程序池标识)设置为"Administrator"用户。
以期望:
"w3wp.exe" (IIS Worker Process) -- Administrator用户运行
core.exe -- Administrator用户运行
target.exe -- test用户运行
但是target.exe却无法被test用户运行,有一个WerFault.exe (Windows 错误报告)在后运行。无任何错误提示。
我的分析是: 通过IIS7 启动运行的 core.exe 无法让target.exe 被 test 用户执行。会产生Windows错误。 我又试着把 test 零权限用户添加到Administrators 用户组里面, 让 test 成为系统管理员。 结果还是一样, target.exe 无法正常被test用户运行。
最奇怪的事情来了,把core.exe的运行参数
由 FILE:"D:\target.exe" USERNAME:"test" PASSWORD:"test"
改成 FILE:"D:\target.exe" USERNAME:"Administrator" PASSWORD:"MyPassword"
即让target.exe 被 Administrator 系统管理员运行,居然可以运行成功了~ 。_ 。
但是在本地调试中, 不管参数是上面两者的哪一个, 都可以运行成功。
由于考虑到系统的安全性, 必须让target.exe 被 test 零权限用户运行。
这个问题困扰我三天了。感谢您看完这么长的问题, 同时希望您能给提供给我一些建议, 以及解决方法。
我的qq是 47985617
如果您知道如何解决问题, 请您联系并告诉我, 感激不尽。
谢谢您看完这个问题。
可能是不允许改变用户权限吧?你可以看一下系统日志,异常应该记录在系统日志中
尝试新建一个应用程序池,不要用Default Pool,之前在IIS 6 中有些时候发现默认的池不好用。
@SunnyHong: 你是怎么解决的呢?