Windows2016/IIS10下经典ASP应用登出后Server.CreateObject失败求助
解决Windows Server 2016 IIS 10中经典ASP登出服务器后Server.CreateObject失败的问题
你遇到的这个问题非常典型——登录服务器时应用正常,登出就报错ASP_0177_:_8000401a|Server.CreateObject_Failed,核心差异在于运行ASP应用的身份不同:登录时是你的用户账户,登出后切换为IIS应用池的默认身份。既然已经注册了32位DLL,咱们可以从以下几个方向排查:
1. 确认应用池的32位启用状态
首先确保你的IIS应用池已经开启32位支持,因为你注册的是32位DLL,64位IIS默认不会加载32位COM对象:
- 打开IIS管理器,找到目标应用池,右键选择「高级设置」
- 在「常规」分类下,将「启用32位应用程序」设置为
True - 重启应用池后再测试
2. 检查应用池身份的权限
登录时用的是你的用户账户(通常有较高权限),而应用池默认的ApplicationPoolIdentity权限有限,可能无法访问COM对象或其依赖资源:
- 先临时测试:将应用池身份改为
LocalSystem(不建议长期使用,仅用于排查),重启应用池后登出服务器访问应用,如果正常,说明是权限问题 - 长期解决方案:给
IIS AppPool\你的应用池名称账户分配以下权限:- 访问
C:\Windows\PCMSRV32.DLL所在目录的读取权限 - 访问该COM对象的启动、激活和访问权限(下一步会讲DCOM配置)
- 访问
3. 配置32位COM对象的DCOM权限
因为是32位DLL,需要在32位组件服务里配置权限:
- 运行
mmc comexp.msc /32打开32位组件服务(直接运行dcomcnfg默认是64位,找不到32位组件) - 展开「组件服务」→「计算机」→「我的电脑」→「DCOM配置」
- 找到
PCMSRV32.DLL对应的COM组件(如果找不到,可通过注册表HKEY_CLASSES_ROOT查找该DLL对应的ProgID,再找组件名称) - 右键组件选择「属性」,切换到「安全」选项卡:
- 在「启动和激活权限」中,选择「自定义」并点击「编辑」,添加
IIS AppPool\你的应用池名称,赋予「本地启动」「本地激活」权限 - 在「访问权限」中,同样添加该账户并赋予「本地访问」权限
- 在「启动和激活权限」中,选择「自定义」并点击「编辑」,添加
4. 排查DLL的依赖缺失
注册成功不代表所有依赖DLL都存在,应用池身份的环境变量可能和你的用户账户不同:
- 用Dependency Walker(
depends.exe)打开PCMSRV32.DLL,检查是否有红色标记的缺失DLL - 如果发现缺失,将对应的DLL复制到
C:\Windows\SysWOW64目录,或者把DLL所在路径添加到系统环境变量的PATH中(注意是系统PATH,不是用户PATH)
5. 查看事件查看器的详细错误
当报错发生时,打开Windows事件查看器→「应用程序日志」,找到对应的ASP.NET或IIS事件,里面会包含更具体的错误细节(比如是权限不足、找不到组件还是依赖缺失),这能帮你快速定位问题根源
6. 直接测试应用池身份下的COM对象创建
用PsExec工具模拟应用池身份运行命令行,测试能否创建COM对象:
- 下载PsExec,运行命令:
PsExec.exe -i -u "IIS AppPool\你的应用池名称" cmd - 在弹出的cmd窗口中,运行
cscript进入脚本环境,输入:
如果报错,就能直接看到应用池身份下的具体问题Set obj = CreateObject("PCMSRV32.你的组件ProgID") WScript.Echo "对象创建成功"
按照这个顺序排查,大概率能解决登出后Server.CreateObject失败的问题——毕竟登录/登出的核心差异就是运行身份,权限和COM配置是最常见的诱因。
内容的提问来源于stack exchange,提问作者Off The Gold
相关产品推荐
相关产品推荐

