Visual Basic
調(diào)試
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)
--------------------------------------------------------
現(xiàn)象
|
|
||
|
用
Visual Basic
創(chuàng)建的
COM
組件放置到
COM+
中的某個(gè)應(yīng)用下后,在某種情況下調(diào)試時(shí),
Visual Basic IDE
會(huì)彈出如下對(duì)話框:
|
|||
重新產(chǎn)生本現(xiàn)象的步驟
|
|
||
|
Visual Basic
版本:
6.0(SP5)
|
|||
|
1
|
標(biāo)識(shí)為“交互式用戶
---
目前已登錄的用戶”!
這時(shí)
Visual Basic IDE
可以調(diào)試
Test.Dll
;
|
||
|
2
|
標(biāo)識(shí)為當(dāng)前登錄的用戶名!
Visual Basic IDE 可以調(diào)試 Test.Dll ; |
||
|
3
|
標(biāo)識(shí)的用戶不是當(dāng)前登錄的用戶名!
這時(shí)調(diào)試
Test.Dll
,就會(huì)遇到
0x80004015
的錯(cuò)誤對(duì)話框!
|
||
原因
|
|
這個(gè)定義顯然要比
VB IDE
報(bào)出的語(yǔ)焉不詳?shù)摹斑\(yùn)行單一線程時(shí)嘗試再次調(diào)用
CoInitialize
”更讓人清楚明白!
首先,讓我們看一看
VB
是怎么做的:
從
VB IDE
運(yùn)行一個(gè)
ActiveX Dll
時(shí),
IDE
將調(diào)用
CoRegisterClassObject()
。
CoRegisterClassObject()
將會(huì)察看要調(diào)用的進(jìn)程
(COM Server)
的安全標(biāo)識(shí)是否匹配這個(gè)
Class
注冊(cè)的安全標(biāo)識(shí)。
對(duì)于設(shè)置為運(yùn)行在“
Interactive User
”標(biāo)識(shí)下的
Server
,
CoRegisterClassObject()
將會(huì)動(dòng)態(tài)地確認(rèn)當(dāng)前登錄的交互式用戶的標(biāo)識(shí),以完成這種比較。
但是對(duì)于設(shè)置為運(yùn)行在不同于當(dāng)前登錄用戶的另一個(gè)用戶標(biāo)識(shí)下的
Server
,
RunningObjectTable::Register(ROTFLAGS_ALLOWANYCLIENT)
將會(huì)返回
CO_E_WRONG_SERVER_IDENTITY
,這樣是為了強(qiáng)制安全,阻止了惡意欺騙。
COM
不相信調(diào)用
CoRegisterClassObject()
的代碼,它只相信注冊(cè)表
(
注冊(cè)表是一個(gè)安全的數(shù)據(jù)庫(kù)
)
。
于是
那么上面所說(shuō)的
Class
注冊(cè)的安全標(biāo)識(shí)在哪里查到呢??
我的
Test.WrongServerID
的
CLSID
是
{54BD886F-76CB-49E9-8515-5992B9F9CC50}
,所以在注冊(cè)表的
HKEY_CLASSES_ROOT\AppID\{54BD886F-76CB-49E9-8515-5992B9F9CC50}
下:
“
RunAs
”的值就是。它還可以為“
mydomain\myaccount
”、“
Interactive User
”等值。
但是
COM+
應(yīng)用的標(biāo)識(shí)設(shè)置的改變,卻并沒有在這個(gè)鍵值上體現(xiàn)出來(lái)。所以如果把組件不放入到
COM+
中,則
Class
注冊(cè)的安全標(biāo)識(shí)應(yīng)該依賴于這個(gè)“
RunAs
”鍵值。那么把組件放入到
COM+
之后,看哪一個(gè)鍵值呢
?
我猜想這已經(jīng)存入到
COM+
自己的數(shù)據(jù)庫(kù)了,而不再是注冊(cè)表。這個(gè)有待研究。
|
|
小結(jié)
|
|
|
當(dāng)一個(gè)
client
試圖調(diào)用一個(gè)
COM Server
,需要在
client
和
server
之間建立一個(gè)經(jīng)過驗(yàn)證的
COM Session
。這時(shí)
COM
需要檢查雙方的安全性。
該
Server
調(diào)用
CoRegisterClassObject()
注冊(cè)它的
Classes
。然后
COM
試圖假冒
client
來(lái)調(diào)用該
Server
。
對(duì)于我們這種情況,
Visual Bsic IDE
用的是當(dāng)前登錄用戶的標(biāo)識(shí),而這個(gè)標(biāo)識(shí)是通不過
Server
端的驗(yàn)證的。
|
|
參考文獻(xiàn):
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
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

