Vincent Trent (FKing)

There is no gene for human spirit

博客园 首页 新随笔 联系 订阅 管理
 

关键字:

网络驱动器 Web应用程序 DirectoryNotFoundException 异常 IO 权限 machine.config

  近日有同事在调试系统时发现在Web程序里如果使用File.IO里的类操作映射网络驱动器时,会出现DirectoryNotFoundException 的异常。但同样的操作放在WinForm里的确实执行正常的。请教我是怎么回事。我在自己Windows 2000 Pro的机上用最简单的程序测试 也是如此。自然地想到是权限搞得鬼。于是把权限设定为最宽松的形式来试验:将ASP.NET帐号加入到Administrators组,同时把 Everyone用户加入到映射过来的网络驱动器上,并赋予最高权限。而网络驱动器映射则是以共享机上的Administrator身份来登陆的。 测试,仍然不行!

  比较困惑,在网上搜索了一下,都是说权限设置的。而涉及到网络驱动器映射的搜索结果比较少,而且提出的解决办法都没什么参 考价值。只有自己来研究了。

  在ASP.NET里,Web应用程序都是运行在一个特定的帐号身份下的进程里的。它所能访问的资源都和这个帐号权限有关。而用哪个帐 号可以通过machine.config文件里的processModel节点设定。默认情况下,是使用ASPNET帐号的(userName属性设为machine)。如果 贪图方便的,把userName设为SYSTEM则是使用SYSTEM的特殊帐号,拥有最大的权限。但光是改这个,无论怎么设,都是会出现异常的。 这时我突然想到建立网络驱动器连接时是用共享机上的Administrator帐号登陆的,但Web应用程序是用另一个帐号运行的,是不是和这 个有关呢?经后面的验证看来也确实是因为这个“简单”的原因。问题的关键就是在建立网络驱动器连接时,要用Web应用程序所使用的 帐号来连接。其实这是不同的机上的帐号,但就是要设置为一致才能正常运行。

  下面以我总结的解决方法步骤:
1、先明确Web应用程序是以哪个身份运行的。这可以通过查看machine.config文件的processModel节点userName属性看到。如果为 machine,就是用ASPNET帐号,如果为SYSTEM,就是SYSTEM帐号(这个是无法用来登陆连接到共享机上的,必需使用其它帐号)。 如果系统是Windows 2003,帐号可能还会有所不同。请查看参考资料链接里的那个回帖。
2、在共享机上用相同帐号相同密码建立帐号。并赋予该帐号应有的读写权限。如果使用的是默认的ASPNET帐号,因为无法获得密码, 可能还要在运行Web程序的机上重置该帐号的密码。如果重置了ASPNET密码,还要注意修改machine.config文件,将processModel 节点的password属性(默认为Autogenerate)改为你设置的密码。
3、用该帐号(该例子为ASPNET)建立网络驱动器映射。
4、运行程序,看是不是可以了 :)

  这里涉及到两台机上要建立相同的帐号,可能会有些麻烦。如果有更好的解决办法请告知。还有就是对于Windows 2003系统因帐号的问 题可能解决办法会有些出入,也望有测试过的人能多提供经验。

参考资料:

  1. Problem Creating Directory
posted on 2005-07-27 10:52  Vincent Trent  阅读(2959)  评论(4编辑  收藏  举报