Visual Basic
调试
COM+
组件遇到的问题
Article last modified on 2002-1-20
--------------------------------------------------------
The information in this article applies to:
- Microsoft Visual Basic Enterprise Edition for Windows, versions 6.0(SP 5)
--------------------------------------------------------
现象
|
|
||
|
用
Visual Basic
创建的
COM
组件放置到
COM+
中的某个应用下后,在某种情况下调试时,
Visual Basic IDE
会弹出如下对话框:
|
|||
重新产生本现象的步骤
|
|
||
|
Visual Basic
版本:
6.0(SP5)
|
|||
|
1
|
标识为“交互式用户
---
目前已登录的用户”!
这时
Visual Basic IDE
可以调试
Test.Dll
;
|
||
|
2
|
标识为当前登录的用户名!
Visual Basic IDE 可以调试 Test.Dll ; |
||
|
3
|
标识的用户不是当前登录的用户名!
这时调试
Test.Dll
,就会遇到
0x80004015
的错误对话框!
|
||
原因
|
|
这个定义显然要比
VB IDE
报出的语焉不详的“运行单一线程时尝试再次调用
CoInitialize
”更让人清楚明白!
首先,让我们看一看
VB
是怎么做的:
从
VB IDE
运行一个
ActiveX Dll
时,
IDE
将调用
CoRegisterClassObject()
。
CoRegisterClassObject()
将会察看要调用的进程
(COM Server)
的安全标识是否匹配这个
Class
注册的安全标识。
对于设置为运行在“
Interactive User
”标识下的
Server
,
CoRegisterClassObject()
将会动态地确认当前登录的交互式用户的标识,以完成这种比较。
但是对于设置为运行在不同于当前登录用户的另一个用户标识下的
Server
,
RunningObjectTable::Register(ROTFLAGS_ALLOWANYCLIENT)
将会返回
CO_E_WRONG_SERVER_IDENTITY
,这样是为了强制安全,阻止了恶意欺骗。
COM
不相信调用
CoRegisterClassObject()
的代码,它只相信注册表
(
注册表是一个安全的数据库
)
。
于是
那么上面所说的
Class
注册的安全标识在哪里查到呢??
我的
Test.WrongServerID
的
CLSID
是
{54BD886F-76CB-49E9-8515-5992B9F9CC50}
,所以在注册表的
HKEY_CLASSES_ROOT\AppID\{54BD886F-76CB-49E9-8515-5992B9F9CC50}
下:
“
RunAs
”的值就是。它还可以为“
mydomain\myaccount
”、“
Interactive User
”等值。
但是
COM+
应用的标识设置的改变,却并没有在这个键值上体现出来。所以如果把组件不放入到
COM+
中,则
Class
注册的安全标识应该依赖于这个“
RunAs
”键值。那么把组件放入到
COM+
之后,看哪一个键值呢
?
我猜想这已经存入到
COM+
自己的数据库了,而不再是注册表。这个有待研究。
|
|
小结
|
|
|
当一个
client
试图调用一个
COM Server
,需要在
client
和
server
之间建立一个经过验证的
COM Session
。这时
COM
需要检查双方的安全性。
该
Server
调用
CoRegisterClassObject()
注册它的
Classes
。然后
COM
试图假冒
client
来调用该
Server
。
对于我们这种情况,
Visual Bsic IDE
用的是当前登录用户的标识,而这个标识是通不过
Server
端的验证的。
|
|
参考文献:
1.
《
PRB: System Error Message "&H80004015" Running ActiveX DLL in ID [Q228487]
》
2.
《
COM Security Frequently Asked Questions [Q158508]
》
3.
《
FIX: CoRegisterClassObject Fails with CO_E_WRONG_SERVER_IDENTITY [Q170364]
》
4.
《
INFO: COM Servers Activation and NT Windows Stations [Q169321]
》
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12659

