Classic ASP调用Server.CreateObject提示未授权操作问题排查
问题现象
编写如下代码尝试创建上传组件对象:
Set objUpload = Server.CreateObject("ASPUploadComponent.cUpload")
代码执行失败,添加调试代码输出错误信息:
Response.Write(" begin ") Response.Write(" Err : " & Err & " ") Response.Write(" TypeName(Err) : " & TypeName(Err) & " ") Response.Write(" Str(Err.Number): " & Err.Number & " ") Response.Write(" Str(Err.Source): " & Err.Source & " ") Response.Write(" Str(Err.Description): " & Err.Description & " ") Response.Write(" TypeName(objUpload) : " & TypeName(objUpload) & " ") Response.Write(" end ")
调试输出结果:
begin Err : -2147352567 TypeName(Err) : Object Str(Err.Number): -2147352567 Str(Err.Source): ASPUploadComponent Str(Err.Description): Unhandled error: 007~ASP 0104~Opération non autorisée~ TypeName(objUpload) : Empty end
错误提示为unauthorized operation(未授权操作),完全相同的对象创建代码在其他脚本中可正常运行,仅当前场景下执行失败。
补充说明
该问题与IIS7下Classic ASP启用大文件上传的常见问题场景存在差异:排查初期无法直接关联到文件大小相关配置,无法通过检索大文件上传相关问题直接定位该故障。
故障诱发原因
这个错误的核心特征是组件本身注册、基础运行权限正常(同服务器其他脚本可正常创建对象),仅特定场景下初始化失败,结合错误码ASP 0104的触发逻辑,常见诱因如下:
- 请求体大小触发了IIS/ASP的前置拦截
Classic ASP默认仅允许最大200KB的请求体,IIS7及以上版本默认请求体最大长度为30MB,只要当前POST请求的总大小(含上传文件、表单其他字段)超过任意一个配置阈值,IIS会在将请求交给ASP脚本处理前直接标记请求为非法。部分上传组件在初始化阶段就会读取请求上下文,不需要显式调用文件读取方法就会触发这个前置拦截错误,这也是初期排查很难关联到文件大小配置的原因——甚至还没走到处理上传文件的逻辑,创建对象就已经失败了。 - 应用层级配置不一致
同服务器不同脚本运行正常、当前脚本异常,最常见的原因是两个脚本所属的站点、应用程序、虚拟目录的配置不一致:正常运行的脚本所在目录可能单独通过web.config调整过请求大小限制、ASP执行权限配置,而故障脚本所在目录继承了系统默认的严格限制,或是被单独配置了更小的请求阈值、更严格的执行权限规则。 - 上传表单编码配置错误
如果提交请求的表单未添加enctype="multipart/form-data"属性,或是请求头的Content-Type与实际请求体格式不匹配,ASP模块解析请求时判定为非法请求格式,也会抛出0104未授权错误,导致组件初始化失败。 - 临时目录权限不匹配
ASPUpload组件初始化时会尝试访问ASP运行时的临时缓存目录(默认路径为C:\Windows\Temp,也可通过站点配置单独指定),如果故障脚本所属的应用程序池运行身份对该临时目录没有读写权限,组件创建临时缓存文件失败,也会抛出未授权错误。这种情况一般是故障站点使用了独立的、权限受限的应用程序池身份导致的。
内容的提问来源于stack exchange,提问作者Virus721
相关产品推荐
相关产品推荐

