asp.net 上传Excel文件时出现: Microsoft JET Database Engine 未指定的错误

来源:互联网 发布:史派西 知乎 编辑:程序博客网 时间:2024/06/06 20:29

原来一网站运行没有问题,后来在IIS中做了一些设定后,在上传Excel文件时出现了:Microsoft JET Database Engine 未指定的错误。跟踪程序可以看到是在把Excel文件上传至服务器后,读取该Excel文件时出现错误即:Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=地方有问题了。一开始怀疑是msolejet驱动出现问题,后来发现是Web.Config中的设定问题。把其中的 <identity impersonate="true"/> 删除掉就可以了,原来是权限设定的原因。

当 <identity impersonate= "true" /> 存在时,用到的权限是IIS中的匿名帐号
当没有以上配置时,用到的权限是Win2000:ASPNET帐号,Win2003:Network Service
你必须对要操作的文件夹或组件添上相应的权限(如读或写权限)
你在本机上试的时候可能用了集成Windows身份验证,所以可能是管理员权限
你可以用
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
Response.Write( " <br> ");
Response.Write(User.Identity.Name);
Response.Write( " <br> ");
显示你的当前帐号和模拟帐号

 

 

另附一相关转帖:

例:<identity impersonate="true" userName="AD\name" password="word"/>

需要给文件夹C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 添加用户"AD\name"的权限
参考1:在Web.Config中有一个<identity>
元素,可以使其impersonate属性为true来设置本应用程序的身份,从而达到扮演其他账号身份的目的。而具体的“扮演”有两种方式:
(1)、<identity impersonate="true" />
这种方式的话ASP.NET进程将扮演http/https请求者的身份。而具体是什么帐号,就跟IIS的安全性设定有关了:
如果IIS允许匿名访问,那么被扮演的将是Iuser_Machine帐号(因为默认的匿名访问账号是Iuser_Machine,当然如果修改过,那被扮演的就是修改过的帐号)。
如果IIS不允许匿名访问,那么浏览器请求者的身份肯定是一个Windows帐号,这个帐号就是被扮演的对象。

(2)、<identity impersonate="true" userName="Account" password="Password"/>
这种方式就直接设置所扮演的固定用户身份

第(2)种扮演方法将把password明文的写在Web.Config里,很不安全

PS1:微软不推荐使用扮演,无论扮演哪个帐号,一方面是安全性问题(被扮演的帐号可能有一些程序并不需要的多余权限,可能被利用),另一方面是可伸缩性问题(Scalability),因为在访问SQL Server等资源时,无法利用连接池等手段。

PS2:在\%windows%\Microsoft.NET\Framework\Version\Config目录中找到machine.config文件,其中有一个<processModel>的tag:

<processModel enable="true" ... userName="machine" password="AutoGenerate" ... />

其中的userName="machine"就是指定使用本机ASPNET帐号(.\ASPNET)作为ASP.NET工作进程的默认账号。

这个默认帐号是可以修改的,如果开发人员将userName修改为一个域用户帐号:
<system.web>
                <processModel enable="true" userName="domain\user" password="password"/>
</system.web>

那么ASP.NET工作进程的身份就变成了domain\user。只要这个域用户帐号拥有需要的权限,那么machine.config所在机器上所有ASP.NET程序都可以访问域中其他服务器的资源,包括存取用网络共享路径指定的文件。

如果指定userName="system",那么ASP.NET程序将以LocalSystem身份运行,可以存取几乎所有本地资源,因此非常危险!

无论machine.config指定哪个默认帐号,这个默认帐号都可以被应用程序的web.config设置的Impersonation覆盖,即特定应用程序可以以其他身份运行。

参考2:如果你的Web服务器上有多个ASP.NET应用程序,或者你的ASP.NET应用程序需要更高的权限以执行特殊的操作,那么可以为程序设置一个单独的账户。
<?xml version="1.0"?>
<configuration>
    <system.web>
        <identity impersonate="true"
              userName="域\机器名"
              password="密码"
              />
  </system.web>
</configuration>
在这里,你可以用明文设置用户名和密码,对此就不做过多解释了。需要特别注意的是,你设置的账户需要对以下目录拥有权限:
·      ASP.NET临时文件夹。这是ASP.NET动态编译的位置,需要有读写权限。
·      全局程序集缓存(%Windir%\assembly)。这是全局程序集缓存,需要有读取权限。
注意:如果正在运行Windows Server 2003,其中的IIS 6.0配置为运行在辅助进程隔离模式下(默认情况),则可通过将ASP.NET应用程序配置为在自定义应用程序池(在特定的域标识下运行)中运行,然后使用指定的域标识访问资源而无需使用模拟。

原创粉丝点击