您目前已離線,請等候您的網際網路重新連線

如何為 Visual Basic 主從架構應用程式疑難排解 DCOM

本文曾發行於 CHT269330
結論
本文將告訴您,當您嘗試使用「分散式元件物件模型」(DCOM) 產生遠端伺服器物件時,可用來疑難排解一些最常遇到的錯誤的各種步驟。在 Visual Basic 中,最常見的錯誤訊息是:
執行階段錯誤 70: 使用權限遭拒。
執行階段錯誤 429: ActiveX 元件無法建立物件。
執行階段錯誤 462: 遠端伺服器電腦不存在或無法使用。
其他相關資訊

從何處開始進行疑難排解

當您嘗試使用 DCOM 在遠端電腦上產生 COM 物件時,所發生的問題大部分是由 Dcomcnfg 中的錯誤設定或網路問題所造成。問題很少是因為程式碼而造成。

首先,請寫下與您的環境和應用程式本身有關的資訊,例如:
  1. 關於伺服器電腦:

    伺服器電腦是執行伺服器應用程式的電腦。請收集下列資料:
    • 作業系統與所安裝的 Service Pack。
    • 是否有人登入電腦?
    • 如果有人登入電腦,他們的權限為何?他們是系統管理員群組的成員嗎?他們是以「網域使用者」身分登入嗎?
  2. 關於用戶端電腦:

    用戶端電腦是執行用戶端應用程式的電腦。請收集下列資料:
    • 作業系統與所安裝的 Service Pack。
    • 誰登入了此電腦?他們是以「網域使用者」還是「本機使用者」身分登入?如果是以「網域使用者」身分登入,他們在伺服器電腦的權限為何?他們是伺服器電腦上系統管理員群組的成員嗎?
  3. 關於伺服器應用程式:
    • 伺服器是搭配何種語言、版本與 Service Pack 而開發的?
    • 它會回撥至用戶端嗎?
    • 它會提出事件嗎?如果會,用戶端電腦上的 DCOM 安全性是設定為授與存取權給 Everyone 帳戶嗎?
    • 它有使用者介面嗎?
    • 它是否標記為 [自主式執行]
    • 它是否以程式設計的方式透過呼叫如 CoInitializeSecurityCoSetProxyBlanket 函式來設定安全性參數?
  4. 關於用戶端應用程式:
    • 此應用程式是搭配何種語言、版本與 Service Pack 而開發的?
    • 它是否以程式設計的方式透過呼叫如 CoInitializeSecurityCoSetProxyBlanket 函式來設定安全性參數?
  5. 關於網路:
    • 用戶端與伺服器電腦是位於相同的「區域網路」(LAN) 嗎?
    • 用戶端與伺服器電腦是透過網際網路連線,且它們之間沒有防火牆與 Proxy 嗎?
    • 用戶端與伺服器電腦是透過網際網路連線,且它們之間有防火牆與 Proxy 嗎?

基本疑難排解

  1. 依據您先前所收集的資料,檢查 Dcomcnfg 中的所有設定值是否恰當。
    268550 HOWTO:使用 Dcomcnfg 設定 Visual Basic DCOM 主從架構應用程式
  2. 如果用戶端或伺服器電腦使用 Microsoft Windows 95,請確定已經安裝了 DCOM95。您可以從下列 Microsoft 網站下載 DCOM95:
  3. 如果伺服器電腦使用 Windows 95、Microsoft Windows 98、Windows Millennium Edition (Me),在嘗試使用用戶端之前,您必須先執行伺服器元件。檢查時,請確認伺服器正在執行,且正在等候用戶端的連線。
    165101 How To Use a Windows 95, Windows 98, or Windows Me Computer as a DCOM Server
  4. 如果用戶端與伺服器電腦透過網際網路連線,且它們之間有防火牆與 Proxy,當它們之間有任何類型的「網路位址轉譯」(NAT) 時,DCOM 便無法運作。如果沒有位址轉譯,您就需要設定這些 Proxy 與防火牆,讓 DCOM 可以通訊。您可以在 Microsoft Developers Network (MSDN) 或下列 Microsoft 網站上找到有關此主題的一些白皮書: 此主題不在本文所討論的範圍中。

其他疑難排解

如果在依環境與應用程式特性將 Dcomcnfg 設定為正確設定之後,仍然有問題,以下是另外一些您可以用來解決問題的步驟:
  1. 當您使用 Dcomcnfg 變更設定時,請使用「工作管理員」來確認伺服器沒有在執行。當它這樣啟動時,所有設定值會指派到一個處理序,如果您在變更設定時伺服器也正在執行,新的設定值只會在伺服器下一次啟動時生效。
  2. 確認伺服器與用戶端可在同一部電腦上正確執行。在遠端執行之前,您一定要測試用戶端與伺服器是否可以在本機正確執行;亦即,位於同一部電腦上。
  3. 檢查您所遇到的問題是否真的是 DCOM 問題,此種問題通常和程式碼本身無關,或者您所遇到的問題是應用程式特有的程式碼問題。您可以只使用一或兩個非常簡單的方法來建立很簡單的主從架構應用程式,以執行此項作業。請遵循一般的封裝與安裝程序。如果伺服器有提出事件,那麼您的小範例也應該會提出事件。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    266717 HOWTO:使用 Visual Basic 建立 DCOM 主從架構應用程式
    267836 How To Create a DCOM Client/Server with Events by Using Visual Basic
    理論上,您應該使用上述文件作為指南,因為這些文件會從頭開始逐步帶領您執行,直到最後的封裝與部署程序。請使用與您的應用程式所使用的相同設定,看看是否可以運作。如果您的問題和 DCOM 有關,小範例也會遇到和應用程式一樣的問題。請繼續使用小範例疑難排解此問題,直到您找到問題所在為止。如果小型應用程式可以運作,但您自己的應用程式卻無法使用相同的設定來運作,那麼您可能遇到兩種問題:
    • 程式碼中有個地方會造成問題。例如,如果您存取程式碼中的資料庫,而您伺服器的識別身分卻沒有這方面的權限。如果您正嘗試存取檔案或產生其他物件,可能會發生相同的問題。
    • 您的程式碼沒問題,但是「登錄」中有一些問題,例如有多個對伺服器的登錄項目。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
      180525 PRB:DCOMCNFG Reports Multiple Copies of DCOM Server
    • 您將用戶端電腦指向錯誤的伺服器電腦。檢查用戶端電腦上 Dcomcnfg 中的位置標籤。如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
      268550 HOWTO:使用 Dcomcnfg 設定 Visual Basic DCOM 主從架構應用程式
  4. 確認用戶端與伺服器的封裝與安裝都正確。建立正確的散發封裝是安裝成功的基礎。如需有關如何使用 Visual Basic 建立 DCOM 主從架構應用程式之逐步執行範例的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    266717 HOWTO:使用 Visual Basic 建立 DCOM 主從架構應用程式
    267836 How To Create a DCOM Client/Server with Events by Using Visual Basic
  5. 經由從伺服器電腦 Ping 用戶端,以及從用戶端電腦 Ping 伺服器,來確認網路是否正確運作。在伺服器電腦上,開啟命令提示字元視窗,然後執行下面指令,其中 ClientcomputerName 應該是用戶端電腦的名稱:
    Ping ClientcomputerName
    如果一切都正確運作,您應該會看見三個或四個回覆,以及每個回覆所花費的時間。如果您看見逾時或其他錯誤,表示網路設定出了問題,您必須先修正這些問題才能繼續進行。在用戶端電腦上使用伺服器的電腦名稱重複相同的步驟。
  6. 在用戶端電腦上的 Dcomcnfg 中,透過使用伺服器的 IP 位址來取代伺服器的名稱,以變更伺服器的位置。如果使用 IP 位址時有效,而使用伺服器的電腦名稱時無效,那麼很可能網路設定有問題。
  7. 試著重新啟動伺服器與用戶端。有時候一些設定會被快取儲存在記憶體中,在變更 Dcomcnfg 中的設定值之後重新啟動就能解決此問題。
  8. 在 Windows 95 或 Windows 98 上,使用 TCP/IP 通訊協定。如果要執行這項操作,請移除列在 Dcomcnfg 的預設通訊協定清單中的所有其他通訊協定。
  9. 通常,如果 DCOM 有問題,當您嘗試透過呼叫 CreateObject 函數來產生遠端物件時,或當您使用 New 關鍵字來設定物件變數時,就會收到錯誤訊息。重要的是,要能區分您收到的錯誤訊息是由於建立物件本身所造成,還是由於您在物件的「初始化」事件中的動作所造成。如果您嘗試產生的物件的「初始化」事件沒有任何程式碼,那麼毫無疑問的,您所收到的錯誤訊息是和物件的產生有關。然而,如果「初始化」事件含有程式碼,例如連線至資料庫或產生其他物件,您就應該在「初始化」事件內加入錯誤設陷,並提出自訂的使用者錯誤。如果您不在「初始化」事件內設陷錯誤,而引發錯誤,它便會出現在用戶端,且可能會讓您混淆。當實際上是「初始化」事件中的程式碼發生問題時,您可能會認為問題是發生在物件的建立上。
  10. 如果伺服器是在 Microsoft Windows NT 4 或 Microsoft Windows 2000 上執行,您可以使用「事件檢視器」找出有關 DCOM 連線為何失敗的其他稽核資訊。然而,這些類型事件的記錄功能通常不會預設為啟用。您必須設定稽核選項以啟用此功能。

    在 Windows NT 4 中,請依照下列步驟啟用這些選項:

    • [開始] 功能表上,選取 [程式集],選取 [系統管理工具],然後選取 [使用者管理員]
    • 如果您執行 NT 4 伺服器,就必須選取網域;在這個例子中,請在 [使用者] 功能表上,選取 [網域] 選項,然後選取您的本機電腦。
    • [原則] 功能表上,選取 [稽核] 選項。為最前面三個項目啟用成功與失敗的稽核:[登入及登出]、[檔案及物件存取]、[使用者權利的使用]。按一下 [確定] 然後關閉「使用者管理員」。

    在 Windows 2000 中,請依照下列步驟啟用這些選項:

    • [開始] 功能表上,選取 [程式集],選取 [系統管理工具],然後選取 [本機安全性原則]
    • 在左邊窗格上,您會看見一個樹狀檢視。按一下 [本機原則] 左邊的加號 (+),您會看見 [稽核原則] 項目。選取 [稽核原則] 項目,並請注意,右邊窗格會包含所有的稽核選項,有些已啟用,有些則否。用滑鼠右鍵按一下這些選項中任何一個,可讓您啟用或停用它們。
    • 為下面選項啟用成功與失敗的稽核:[稽核登入事件]、[稽核物件存取]、[稽核特殊權限使用]。
    • 關閉 [本機安全性原則] 視窗。

    在啟用這些記錄選項之後,請再次測試用戶端。收到錯誤訊息之後,請使用「事件檢視器」來查看是否有任何 DCOM 事件。事件或許可以告訴您存取為何遭拒。此外,它可以告訴您誰登入了用戶端電腦,以及這是網域使用者或本機使用者。它可以告訴您伺服器上沒有用戶端所請求的通訊協定等等。COM 記錄檔通常是加到系統記錄檔中。
  11. 如果伺服器有多個類別,並且有些類別有效,而有些無效,請檢查用戶端電腦上 Dcomcnfg 中的每一個類別項目。根據預設,每一個類別都有自己的 AppID,也因此會有自己的設定,所以有可能是有些類別的設定正確,而有些類別的設定則不正確。 如需有關在用戶端的應用程式清單中找出您的伺服器的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    268550 HOWTO:使用 Dcomcnfg 設定 Visual Basic DCOM 主從架構應用程式

執行階段錯誤 70: 使用權限遭拒

此錯誤通常和安全性設定有關。此錯誤是一個很好的指標,它指出呼叫已經到達目標電腦,所以此時網路應該不是問題所在。以下列出需要檢查的項目:
  • 如果您將驗證等級設為 [連線],請確認使用者是以網域使用者的身分登入用戶端電腦,而不是使用本機使用者的身分。
  • 如果您將驗證等級設為 [連線],請確認伺服器電腦確實是屬於此網域。如果是獨立的電腦,它就無法驗證使用者,除非您在用戶端與伺服器電腦上都有相符的使用者名稱/密碼。
  • 如果您將驗證等級設為 [無],請檢查您在用戶端與伺服器電腦上是否都將此選項設為 [無]。
  • 如果您將驗證等級設為 [無],並已確認兩部電腦上的這個設定都是正確的,請確定用戶端或伺服器應用程式都沒有使用如 CoInitializeSecurityCoSetProxyBlanket 等函數以程式的方式來設定驗證。以程式的方式來設定驗證會覆蓋 Dcomcnfg 的登錄項目。
  • 如果您將驗證等級設為 [無],而您有非網域使用者,請檢查您是否有在存取與啟動權限中加入「Everyone」(如果是 Windows 95 與 Windows 98,則為「The World」)。
  • 請檢查 Dcomcnfg 中的存取與啟動權限,並確認登入用戶端電腦的使用者確實列出在這些清單中,或是屬於所列出的其中一個的群組。
  • 請參閱本文稍後的<需要檢查的已知問題>一節。如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    216051 FIX:DCOMCNFG Windows NT 4.0 SP4 Does Not Write .exe Name under HKCR\APPID

執行階段錯誤 429: ActiveX 元件無法建立物件

下列是可能造成這個錯誤的一些原因:
  • 伺服器沒有正確安裝在伺服器電腦上。請在伺服器電腦上執行 Dcomcnfg,在應用程式清單上選取伺服器應用程式,然後按一下 [內容]。在 [位置] 索引標籤上,確認唯一選取的選項是 [在這台電腦上執行應用程式]
  • 您在沒有二進位碼相容性的情況下重新編譯伺服器,也沒有重新編譯用戶端。用戶端可能正在尋找舊的類別 ID。即使您重新編譯用戶端,登錄中仍然可能會有多個舊的與新的項目。如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    180525 PRB:DCOMCNFG Reports Multiple Copies of DCOM Server
  • 您可能在位置索引標籤中用了錯誤的伺服器名稱。例如,您在 ServerA 電腦上安裝了伺服器,卻因故在 Dcomcnfg 中將位置定義為 ServerB。在用戶端電腦上執行 Dcomcnfg,在應用程式清單上找出伺服器,然後按一下 [內容]。選取 [位置] 索引標籤,然後確認伺服器電腦名稱是正確的。如果在應用程式清單中找不到您的伺服器,請參閱下列「Microsoft 知識庫」文件中的<在用戶端的應用程式清單中找出伺服器>一節:
    268550 HOWTO:使用 Dcomcnfg 設定 Visual Basic DCOM 主從架構應用程式
  • 同時請參閱本文稍後的<需要檢查的已知問題>一節。如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    193143 BUG:DCOM Client Hangs and Then Gives Error Message 429

錯誤 462: 遠端伺服器電腦不存在或無法使用

下列是造成此錯誤訊息的一些原因:
  • 您可能在位置索引標籤中用了錯誤的伺服器名稱。例如,您在 ServerA 電腦上安裝了伺服器,卻因故在 Dcomcnfg 中將位置定義為 ServerB,而 ServerB 並不是有效的電腦。請在用戶端電腦上執行 Dcomcnfg,在應用程式清單上找出伺服器,然後按一下 [內容] 按鈕。選取 [位置] 索引標籤,然後確認伺服器電腦名稱是正確的。如果無法在應用程式清單中找出伺服器,請查看下面「Microsoft 知識庫」文件中的<在用戶端的應用程式清單中找出伺服器>一節:
    268550 HOWTO:使用 Dcomcnfg 設定 Visual Basic DCOM 主從架構應用程式
  • 從用戶端 Ping 伺服器,並確認可以連到伺服器。同時從伺服器 Ping 用戶端,看看是否可以連到用戶端。分別使用名稱與 IP 位址來 Ping。請參閱本文的<其他疑難排解>一節中的項目 5。
  • 伺服器是在 Windows 95、Windows 98 或 Windows Me 電腦上執行,且伺服器並未執行以等候用戶端的連線,或 RPCSS.EXE 並未執行。如需有關這個主題的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    165101 How To Use a Windows 95, Windows 98, or Windows Me Computer as a DCOM Server
  • 電腦擁有多張網路卡。如需有關這個主題的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
    183930 FIX:IP Is Mangled When Using UDP on Multihomed Computers
  • 請參閱本文的<需要檢查的已知問題>一節。
  • 伺服器電腦並未執行,或是仍然在重新啟動狀態中。

伺服器當機

如果伺服器沒有使用者介面,請確認已選取 [自主式執行] 選項。如果您沒有選取這個選項,伺服器可能會因為未設陷的錯誤而顯示訊息方塊,例如,如果伺服器沒有以 [互動使用者] 的身分在執行,便沒有人可以看見此訊息方塊,而伺服器會一直等候某人來關閉此訊息方塊,但永遠等不到。透過使用 [自主式執行] 選項,訊息方塊會被重新導向至記錄檔。

用戶端在安裝之後當機

如需有關這個主題的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
185193 PRB:Clireg32 Fails to Register the Type Library of DCOM Server
221173 PRB:Installing VB6 Doesn't Update Clireg32.exe

需要檢查的已知問題

下面將列出可能會影響安裝的已知問題。這些問題在其他 Microsoft 知識庫文件中有說明。這裡會提供這些文件的文件編號。如果檢閱本文中的疑難排解步驟和已知問題清單之後,DCOM 應用程式仍然有問題,請務必搜尋「知識庫」,以找出本文可能沒有列出的其他文件。
  1. 下面錯誤訊息會影響使用 Service Pack 1 之前的 Visual Basic 6.0「初始版本」所建立的伺服器應用程式。
    193143 DCOM Client Hangs and Then Gives Error Message 429
  2. NT 4.0 的 Service Pack 4 隨附的 Dcomcnfg 中會有下面問題,但此問題在 NT 4.0 的 Service Pack 6 中已獲得修正。然而,即使您已經有 SP6 隨附的修正版本,但如果在安裝 SP6 之前已經安裝了伺服器,您還是可能會遇到此問題。問題是出在 Dcomcnfg 沒有包含一個位於 Hkey_Classes_Root\AppID 下的必要登錄機碼。HKCR\AppID 是將伺服器執行檔對應至其 AppID 的機碼。例如,如果伺服器的執行檔是 MyServer.exe,在 HKCR\AppID 下必定有一個和此名稱相同的機碼。此機碼下的其中一個值應該會是包含伺服器的 AppID GUID 的 AppID。有關如何手動新增遺失的項目,請參閱下面的 Microsoft 知識庫文件中的指示。
    216051 FIX: DCOMCNFG Windows NT 4.0 SP4 Does Not Write .exe Name under HKCR\APPID
    此錯誤的後果是系統會忽略您在 Dcomcnfg 中為此伺服器定義的所有自訂項目。例如,如果您定義一份有權存取及啟動伺服器的使用者清單,且此清單包含 User1,但是當 User1 嘗試連線至伺服器時,您還是收到錯誤 70「拒絕存取」,表示您有可能遇到此問題。另一個問題是,例如,您將伺服器的身分識別定義為「互動式使用者」,但伺服器卻繼續以「啟動的使用者」的身份識別 (這是預設值) 在執行。
  3. Visual Basic 5.0 隨附的 Clireg32.exe 中有錯誤。後果是用戶端會在安裝之後當機。Visual Basic 6.0 隨附的 Clireg32 版本已經修正了這個錯誤,但如果您在電腦上安裝 Visual Basic 6.0 時已經安裝了舊版本,安裝程序並不會更新此檔案,所以您可能還是在使用舊版本。

    Clireg32.exe 是一個在用戶端電腦中註冊 VBR 與 TLB 檔的公用程式。當您建立用戶端的散佈封裝並加入 VBR 檔時,「封裝暨部署精靈」(PDW) 會自動將 Clireg32.exe 新增至您的散佈封裝中。如果您的開發用電腦上安裝了有問題的 clireg32.exe 版本,可能就會將此不良版本和您的應用程式一起散發出去。如果目標電腦還沒有安裝新版本,系統就會使用此不良版本。Visual Basic 5.0 隨附的問題版本是 5.00.3716,日期是 1/16/1997 12:00。
    185193 PRB: Clireg32 Fails to Register the Type Library of DCOM Server
    221173 PRB: Installing VB6 Doesn't Update Clireg32.exe
  4. 如果您在擁有多張網路卡的電腦上使用 DCOM,下面錯誤可能會造成問題。其中一個可能的錯誤訊息是:
    462 Remote server computer is unavailable. (462 無法使用遠端伺服器電腦)
    為了避免這個問題,請只在此電腦的通訊協定清單中保留 TCP/IP。此問題已經在 NT4 SP4 中獲得修正。
    183930 FIX: IP Is Mangled When Using UDP on Multihomed Computers
  5. 如果 Windows NT 電腦上的 COM 用戶端是在遠端電腦無法驗證的身分識別下執行,此用戶端所啟動的 COM 伺服器會在大約六分鐘之後關閉。
    175020 BUG: Remote COM Server Shuts Down After 6 Minutes
参考
如需詳細資訊,請參閱下列手冊:
70 429 462
內容

文章識別碼:269330 - 最後檢閱時間:01/31/2007 08:09:09 - 修訂: 2.3

  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • kbdcom kbhowto KB269330
意見反應