问题是这样的:
环境:windows xp + Asp.Net + C#
我想在客户端调用服务器端的一个执行程序,该执行程序有两个参数,执行后会生成一个结果文件然后自动退出该执行程序
调用执行程序的代码如下:
     string par2 = -x";
         string par3 = "InFile.Dat"; 
         System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
         Info.FileName = "GOTO.exe";
         Info.WorkingDirectory = "\\F:\\GOTO"; 
         Info.Arguments = String.Format("\"{0}\"   \"{1}\"", par2, par3);         Info.CreateNoWindow = false; 
         Info.Verb = "open";
         Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
         Info.UseShellExecute = true;
         System.Diagnostics.Process.Start(Info);在C#环境下运行,能顺利调用这个执行程序并生成结果文件并自动退出(页面是http://localhost:21863/Sur_Main.aspx)
但是如果在浏览器(IE)上用http://127.11.11.11/Sur_Main.aspx运行时(127.11.11.11代表服务器地址),只能在服务器的任务管理器->进程上看到所调用的执行程序GOTO.exe,但是没有生成结果文件,也不自动退出.这是为什么呢?请各位大虾不吝赐教!要调用的执行程序及结果文件都放在虚拟目录下,对虚拟目录设置了读取+写入+记录访问+索引资源+脚本和可执行文件(是在Internet 信息服务里设置的)

解决方案 »

  1.   

    TO mextb1860:
    文件夾權限? 怎么设?
      

  2.   

    XP不用设文件夹权限的好像可以试试process调用CMD,再用CMD启动应用程序
      

  3.   

    结果文件存放的文件夹访问权限是否放开给INTERNET匿名用户?
    1)右键那个文件夹--属性--安全--添加(如果没有安全:系统菜单--工具--文件夹选项--查看,去掉"使用简单文件共享"前的勾)
    2)--高级
    3)--立即查找;找到IUSR_(服务器的机器名)---确定---确定
    4)在"INTERNET 来宾账户的权限"下,勾上"修改"--确定
    试一下吧
      

  4.   

    谢谢楼上三位!
    TO toury: 文件存放的文件夹访问权限放开给INTERNET匿名用户,是在Internet信息服务里设置的,但是没有.是否因为和你的方法有所不同?
    To anncesky,Wo_You_Xie_SHang_Xin: 我试试两位的方法
      

  5.   

    "是在Internet信息服务里设置的"--->不是一个概念:
    你用的是NTFS格式吧?因为NTFS格式的ACL缘故,要设置一下那个文件夹的ACL访问权限;
    IIS里设置的是INTERNET匿名用户是否可以访问你的网站;而ACL设置的是用户是否可以操作某文件;
    在.NET的IDE里你编译的时候用户不是匿名而是.NET用户,所以可以操作那个结果文件;
    但换了浏览器访问后就产生了匿名用户文件访问权限的问题了.
    你可以做一个测试:
    在WEB.CONFIG里更改一下用户验证,只允许WINDOWS验证的用户进入网站;如果可以操作结果文件,那就是这个原因了
    --------------------
    我只是推断,你试一下看吧,呵呵
      

  6.   

    To   anncesky,Wo_You_Xie_SHang_Xin:  用cmd问题还是一样
    To toury: 
    我按你说的做了,页面、被调用的执行程序、结果文件都放在同一个虚拟目录下,对该目录把 INTERNET 来宾账户 及 ASPNET账户的权限都设置的足够大(只除了没有最后一个特别的权限),还有这两个账户我都把它加到了Administrators组, 但还是不行啊 
    我看了一下,在服务器的任务管理器-> 进程中,当在C#环境中运行时执行程序GOTO.exe所对应的用户是administrator,当在客户端浏览器中调用时执行程序GOTO.exe所对应的用户是AspNet
    哎,我都快做不下去了,toury兄,救救我吧
      

  7.   

    你的是.net1.0还是2.0啊,2.0是network servies用户
      

  8.   

    To anncesky:
    .net是2.0,你是说要把   INTERNET   来宾账户换成network   servies用户吗?
      

  9.   

    服务器安全问题是B/S结构程序必须考虑的问题,所以从ASP开始,MS就做了严格的界定,不然服务器哪里还有安全可言;
    你不要着急,先用WINDOWS集成验证身份通过浏览器访问服务器,具体就是IIS里设置一下,暂时把匿名用户去掉,保留WINDOWS集成验证;看看是不是可以操作那个结果文件;
    如果是,那就肯定是权限问题,再想办法解决---总会有办法的
      

  10.   

    另外,GOTO.exe里最好不要有UI元素
      

  11.   

    To toury:
    谢谢你给我信心!我会按你的方法再试一试,仔细再想想。你说的“GOTO.exe里最好不要有UI元素”是什么意思?
      

  12.   

    如果GOTO.exe 是自己的程序可以加入log看看到底执行到了哪一步出的问题
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) http://feiyun0112.cnblogs.com/
      

  13.   

    To feiyun0112:是别人的程序
    To toury:调用的执行程序有界面元素,这个没有办法改变
      

  14.   

    生成结果文件
    -----------
    你是否给了足够的权限?????
    你不防试试用everyone的读写权限,就全部权限好了
      

  15.   

    To anncesky:
    我自认为是给了足够的权限:在Internet信息服务里设置了虚拟目录的写入权限,在文件夹里也给了权限(除了特别权限).不知道这样算不算足够?
      

  16.   

    试试将winnt/temp目录设置everyone 完全控制
      

  17.   

    谢谢各位!
    To shawn_yang: "将winnt/temp目录设置everyone   完全控制",这个是为什么?
      

  18.   

    .net某些时候会用到临时文件,如果没有权限读写,就会出错
      

  19.   

    先把所有目录的权限设成EveryOne完全控制,如果成功,说明确实是权限问题,再一步步找怎么设置。
    包括C:\windows\temp和.net临时目录、虚拟路径等。
    还有仔细看看你的IIS设置
      

  20.   

    这个问题,你不用理思路了. guest 可以有服务器上exe的执行权限. 太可怕了.
      

  21.   

    TO fcuandy: guest用户关了
      

  22.   

    To shawn_yang:  今早问题解决了一半
    XD们,祝贺我吧!
    我今天用CB新做了一个简单的执行文件,有一个简单界面,功能就只读一个文件然后再写到另一个文件,在浏览器里调用这个服务器执行程序,成功,结果文件写出来了!
    刚开始是把everyone,internet匿名用户,ASPNET用户都给了全部权限,而且internet匿名用户,ASPNET用户都加在Administrators组里,windows及.net临时目录也给了权限,在浏览器里调用成功。后来我把everyone,internet来宾用户,ASPNET用户的特别权限都删除只保留读取与运行权限,从Administrators组里删除了internet匿名用户、ASPNET用户,在浏览器里调用也成功了。
    我想目前的服务器配置对于%POST http://forum.csdn.net/PointForum/Forum/ReplyA�该没问题了,那么为什么我实际想要调用的那个执行程序GOTO.exe还是不成功呢?肯定是它还做了其它的什么操作我没弄清楚,说到底可能也还是权限问题吧,这个执行程序有点复杂,安装时修改了多项注册表,也有点大,本身带有配置文件及一堆DLL。目前是什么问题导致还不明白,期待XD们继续关注!
    无论如何,谢谢各位的鼎力相助,虽然问题还没完全解决,但我现在非常开心,套用 toury兄的一句话:问题总有办法解决的。为我开心吧!
      

  23.   

    不好意思,上面有一段话怎么好象弄乱了,应该是:
    我想目前的服务器配置对于读文件和写文件应该没问题了,那么为什么我实际想要调用的那个执行程序GOTO.exe还是不成功呢?肯定是它还做了其它的什么操作我没弄清楚,说到底可能也还是权限问题吧,这个执行程序有点复杂,安装时修改了多项注册表,也有点大,本身带有配置文件及一堆DLL。目前是什么问题导致还不明白,期待XD们继续关注!
      

  24.   

    To vrhero:
    哈哈,我这个人比较懒,最主要的是在这个极度阳盛阴衰的行业里我有点自卑,各位XD们都是强人
      

  25.   

    先给一半的祝贺 DUE TO 你的"问题解决了一半",呵呵.
    用资源查看软件看看GOTO.EXE里都有些什么东东...得出结论普通用户是否有可能运行它;然后在WEB.CONFIG里动动脑筋吧;
      

  26.   

    guest这个用户你禁了.
    iusr_计算机名 这个用户不是guest吗?
      

  27.   

    To toury:
       谢谢你哟!我试试
    To fcuandy:
        不是吧?!有一个专门的guest用户,和iusr_计算机名用户是两个不同的用户,我的是XP系统,也许我的系统和你的不一样
      

  28.   

    guest和iusr同属guest组.都是guest
      

  29.   

    组和用户搞混了吧?祝贺楼主建议楼主把goto的代码,部分的注释掉来调试,这样总能找到问题
      

  30.   

    IIS配置好有权限的帐号之后在 web.config 的 <configuration>/<system.web>/ 下加上 <identity impersonate="true" />或者不配置IIS直接写 <identity impersonate="false" userName="USER" password="*********" />
    有关如何加密保存帐号和密码的信息可以查看 net 文档或发帖询问。
      

  31.   

    IIS配置好有权限的帐号之后在   web.config   的   <configuration> / <system.web> /   下加上   <identity   impersonate= "true"   /> 或者 不配置IIS直接写   <identity   impersonate= "true"   userName= "USER "   password= "********* "   /> 
    有关如何加密保存帐号和密码的信息可以查看   net   文档或发帖询问。
    修改的.............
      

  32.   

    To fcuandy: 我以为你说的是特定的用户
    To shawn_yang: 你是说让我把页面里的有关goto的代码部分注释掉来调试吗?
      

  33.   

    当然不是我的意思是你的goto里除了写ini文件,肯定还有其他操作,你先把其他的操作先注释掉,只关注写文件
      

  34.   

    To r_swordsman: 你说的是什么意思啊?我不太明白
    To fcuandy: 你说"这个问题,你不用理思路了.   guest   可以有服务器上exe的执行权限.   太可怕了.",你是说这个解决方案本身就有问题是吗?安全性太差?执行程序是个第三方软件,这个解决方案是项目长决定的,因为时间有点紧,我只是听命行事,再加上目前我也没有别的什么好方案提出来,所以先把这个方案完成再说吧
      

  35.   

    你的web根目录下是不是有个web.config文件?没就建一个
    输入下列内容(注意CSDN不再引号前加空格):<?xml version="1.0"?>
    <configuration> <system.web> <authentication mode="Windows"/>
    <identity impersonate="true"/>  </system.web>
    </configuration>
      

  36.   

    CSDN在引号前加了空格,你去掉
      

  37.   

    To shawn_yang:
    你说的这个方法我没有办法实现,因为执行程序是买来的,我没办法对它的原码做任何操作
      

  38.   

    To   r_swordsman: 我的web根目录下有web.config文件,就只没有这一句<identity   impersonate= "true"/>, 你是说要我模拟某个用户吗?不太明白,我试了一下,还是不行
      

  39.   

    那我估计就是你那个exe文件执行的权限超过了你赋予它的权限
      

  40.   

    web.config:
    <?xml version="1.0"?>
    <!-- 
        注意: 除了手动编辑此文件以外,您还可以使用 
        Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
         “网站”->“Asp.Net 配置”选项。
        设置和注释的完整列表在 
        machine.config.comments 中,该文件通常位于 
        \Windows\Microsoft.Net\Framework\v2.x\Config 中
    -->
    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    <appSettings/>
    <connectionStrings/>
    <system.web>
    <!-- 
                设置 compilation debug="true" 将调试符号插入
                已编译的页面中。但由于这会 
                影响性能,因此只在开发过程中将此值 
                设置为 true。
            -->
    <compilation debug="true"/>
    <!--
                通过 <authentication> 节可以配置 ASP.NET 使用的 
                安全身份验证模式,
                以标识传入的用户。 
            -->
    <authentication mode="Windows"/>
        <identity impersonate= "true"/>
    <!--
                如果在执行请求的过程中出现未处理的错误,
                则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
                开发人员通过该节可以配置
                要显示的 html 错误页
                以代替错误堆栈跟踪。        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
                <error statusCode="403" redirect="NoAccess.htm" />
                <error statusCode="404" redirect="FileNotFound.htm" />
            </customErrors>
            -->
    </system.web>
    </configuration>To r_swordsman:好象就比你贴出来的多个调试
      

  41.   

    模拟也不行?没配置好权限?
    修改 Sur_Main.aspx ,在 Sur_Main.aspx 操作 F:\GOTO 目录,看是否也写权限
      

  42.   

    TO  r_swordsman:
    你说"在   Sur_Main.aspx   操作   F:\GOTO   目录,看是否也写权限",我没明白你的意思
      

  43.   

     F:\GOTO 这个目录有写的权限,我今天新做的那个执行程序就是在浏览器调用它后生成一个结果文件,这个结果文件就写在 F:\GOTO 目录里
      

  44.   

    哈哈.....大家存在一个误区...
    System.Diagnostics.Process.Start 创建的进程的身份是从创建他的父进程继承的
    那它的父进程的使用什么身份呢? 也就是 w3wp.exe...是哟任务管理器就可以看出来啦我是2003...帐号是 NETWORK SERVICE ...XP系统可能不一样然后确保你那目录 NETWORK SERVICE 有足够的权限就可以了试试
      

  45.   


    System.Diagnostics.Process.Start 创建的进程的身份是从创建他的父进程继承的那它的父进程的使用什么身份呢? 也就是 w3wp.exe...在任务管理器中就可以看出来啦我是2003...帐号是 NETWORK SERVICE ...XP系统可能不一样然后确保你那目录 NETWORK SERVICE 有足够的权限就可以了试试
      

  46.   

    To   r_swordsman:
    好的,我试试
      

  47.   

    潜水十来天终于可以上来呼吸了! XD们,我终于做成功了!非常感谢各位的热心相助! 我今晚结贴,同时结贴的还有发在C#区的有关这个问题的另一个贴子:http://topic.csdn.net/u/20071101/11/b1286167-422a-4b65-b441-c146729c5d9f.html, 不过那个贴子的人气不如这个高
      

  48.   

    忘了说解决过程了.
    根据toury 和r_swordsman两位的建议, 我用一个查资源(/动作/调用哪些程序)的东东发现那个执行程序真的有做另外的一些动作, 然后还是在config里面作了一个用户模拟,做成了. 
    我试了一下, 执行程序所在目录匿名用户和aspnet用户都不用给最大权限,就只保留读取与运行权限即可,everyone 用户也可以不用加. 
    我想config配置文件有很大的操作空间, 不过这里面有个安全问题要考虑, 这也是我下一步要考虑的问题
      

  49.   

    To jinggangshi:
    我记得你在我有关这个问题的另一个贴子:http://topic.csdn.net/u/20071101/11/b1286167-422a-4b65-b441-c146729c5d9f.html里作过回复,因为这个贴子分不够,就请你到另外的这个贴子领分,可好?
    To shawn_yang:
    因为这个贴子分不够,就请你到我有关这个问题的另一个贴子:http://topic.csdn.net/u/20071101/11/b1286167-422a-4b65-b441-c146729c5d9f.html里领分,好吗?
    多谢两位!