如果您在安裝 Exchange 2000 Server Service Pack 3 (SP3) 的位置在電腦上使用共同作業資料物件的 Windows (CDOSYS) 應用程式,Exchange 2000 (CDOEX) 應用程式的共同作業資料物件或
System.Web.Mail 傳送簡易郵件傳送通訊協定 (SMTP) 郵件您會收到下列錯誤訊息:
CDO.message.1 (0x80040220)
SendUsing 」 設定值不正確。
附註System.Web.Mail 是 CDOSYS 可讓您建立及使用 CDOSYS 訊息元件來傳送訊息到受管理的包裝函式。
原因
之所以發生這個問題,是因為網際網路資訊服務 (IIS) 中繼庫和 Microsoft Active Directory 目錄服務的讀取權限已被移除為每個人] 群組。這個存取已被移除因為的安全性所做的修改在 Exchange 2000 Server SP3。 CDOEX、 CDOSYS 和
System.Web.Mail 必須可存取 IIS Metabase 存取收取目錄路徑位置的相關資訊。此問題的發生原因,是當您使用
Sendusingpickup 方法時,且應用程式的程式碼中未指定此資訊。因為存取受限制所以非管理使用者的安全性內容下執行應用程式無法從 IIS Metabase] 與 [Active Directory 讀取這項資訊。
解決方案
如果要解決這個問題,使用其中一個因應措施 > 因應措施 > 一節中。
附註範例程式碼的因應措施是撰寫動態伺服器網頁 (ASP) 頁面的內容。
因應措施
如果要解決這個問題,您必須修改組態] 或 [程式碼。組態變更可以被展快速,但更刻意,同時考慮應用程式和其資源的安全性,必須進行程式碼變更。
附註還原至 IIS Metabase 的讀取權限的 「 每個人群組不是這個問題的因應措施。還原此存取 reintroduces Exchange 2000 Server SP3 解決的弱點。
如此套用 Exchange 2000 Server SP3 之後,使用 CDOEX 和 CDOSYS 應用程式,請使用下列因應措施的其中一個選項。在 < 其他可行方案 1 和其他可行方案 2,您可以修改系統管理的組態。在 < 其他可行方案 3 和其他可行方案 4,您可以修改程式碼。雖然您只能有套用一個因應措施解決問題,您必須決定哪一種解決辦法是針對使用者的應用程式最適合的解決方案。
若要修改系統管理組態,您必須選擇性地授與存取到 IIS Metabase。在 < 其他可行方案 1 和其他可行方案 2,不會變更應用程式的程式碼,但需要 IIS Metabase 的 「 讀取 」 權限的帳戶被授與存取。您可能可以授與 IIS 中繼資料庫存取帳戶 (因應措施 1) 下執行應用程式,或者您也可以為該用途 (因應措施 2) 建立新的帳戶。
Adadd.vbs、 Adlist.vbs 和 Addel.vbs 指令碼檔案至 IIS Metabase 授與存取權。請參閱附錄 > 一節結尾的本文,這些指令碼檔案的相關資訊。
因為共同作業資料物件 (CDO) 呼叫
RevertToSelf 函式,才能存取 IIS Metabase,您可以加入應用程式處理序執行該帳戶。這是典型的 ASP 網頁 IWAM_
ComputerName 帳戶。
解決方法 1
至少 destabilizing 選項是判斷應用程式正在執行之下,並再授與帳戶存取權 IIS Metabase 哪一個帳戶。但是,因為其他應用程式可能會使用現有的帳戶 (比方說 IWAM_
XXX 或 IUSR_
XXX),這項因應措施可能會造成弱點如果這些其他應用程式授權給 IIS Metabase 的存取。這項因應措施的優點是應用程式的程式碼和 SMTP 組態不變更。這項因應措施的缺點就是將它可能不必要地存取權授與 IIS Metabase。
若要判斷哪一個帳戶應用程式下執行和要授與帳戶存取權 IIS] Metabase 請依照下列步驟執行:
- 將.vbs 檔案儲存到目錄中,您的伺服器上。
- 在 IIS,找出包含您的應用程式的虛擬目錄、 虛擬目錄上按一下滑鼠右鍵,然後按一下 [內容]。
- 按一下 [目錄安全性] 索引標籤,然後按一下 [匿名存取及驗證控制,之下的 [編輯]。
- 在 [驗證方法] 對話方塊請確定已選取 [匿名存取] 核取方塊,然後按一下 [帳號] 用於匿名存取,] 下方的 [編輯]。
- 記下 匿名使用者帳號] 對話方塊所顯示的帳戶名稱。
- 按一下 [取消] 以關閉對話方塊]。
- 在命令提示字元將目錄變更到包含.vbs 檔案,在步驟 1 中的目錄。
- 使用 Adadd.vbs 對 IIS Metabase 到您在步驟 5 中所記下該帳戶授與存取。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adadd.vbs ComputerName \ AccountName
附註在網域控制站上使用 DomainName \ AccountName,或未指定電腦名稱或網域名稱。 您只需要提供 AccountName adadd.vbs 之後。在網域控制站上新增 IWAM_ computername,請在命令提示字元執行下列命令其中之一:
cscript adadd.vbs DomainName \IWAM_ ComputerName
-或者-
cscript adadd.vbs IWAM_ ComputerName
您有時候也必須藉由使用 Adadd.vbs 授與 IIS Metabase IWAM_ ComputerName 帳戶存取。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adadd.vbs ComputerName \IWAM_ ComputerName - 請使用 Adlist.vbs 來確認帳戶已新增至 IIS Metabase 存取清單。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adlist.vbs - 停止並重新啟動 IIS 管理服務及任何依存的服務。
- 執行 Exchange 2000 的電腦上授與使用者程式 Files\exchsrvr\mailroot\vsi # \pickup 目錄路徑的寫入權限。不執行 Exchange 2000 的電腦上授與使用者 Inetpub\mailroot\pickup 目錄路徑的寫入權限。
- 等候 Active Directory 複寫到 IIS Metabase。
- 執行應用程式。
現在的應用程式的運作方式如預期般運作。
解決方法 2
您可以建立帳號、 授與該帳戶存取權給 IIS] 中繼庫,然後設定應用程式以該帳戶身分執行的執行位置的虛擬目錄。這項因應措施的優點是應用程式的程式碼和 SMTP 組態不變更。
建立新的帳戶,讓應用程式下執行,並設定虛擬目錄,請依照下列步驟執行:
- 將.vbs 檔案儲存到目錄中,您的伺服器上。
- 使用 Active Directory 使用者和電腦來建立電腦帳戶 (比方說 CdoExAccount),然後將此帳戶新增到 [使用者] 群組。
這個帳戶不需要信箱。 - 在 IIS,找出包含您的應用程式的虛擬目錄、 虛擬目錄上按一下滑鼠右鍵,然後按一下 [內容]。
- 按一下 [目錄安全性] 索引標籤,然後按一下 [匿名存取及驗證控制,之下的 [編輯]。
- 在 [驗證方法] 對話方塊請確定已選取 [匿名存取] 核取方塊,然後按一下 [帳號] 用於匿名存取,] 下方的 [編輯]。
- 在 [匿名使用者帳號] 對話方塊,請依照下列步驟執行:
- 在 [使用者名稱] 方塊輸入您在步驟 2 中建立帳戶的名稱。
附註在網域控制站上使用 DomainName \ AccountName,或未指定電腦名稱或網域名稱。 您只需要提供 AccountName。如果您建立電腦層級帳戶,以下列格式輸入帳戶名稱: ComputerName \ AccountName - 網域控制站上使用 <DomainName>\<AccountName>或未指定電腦名稱或網域名稱 (只是提供給 <AccountName>)
- 按一下以清除 [允許 IIS 控制密碼] 核取方塊。
- 在 [密碼] 方塊中輸入帳戶的密碼。
- 按一下 [確定],並重新輸入密碼,在產生的對話方塊。
- 按一下 [確定] 以關閉所有對話方塊。
- 在命令提示字元將目錄變更到包含.vbs 檔案,在步驟 1 中的目錄。
- 使用 Adadd.vbs 對 IIS Metabase 到您在步驟 2 中記下該帳戶授與存取。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adadd.vbs ComputerName \ AccountName
附註在網域控制站上使用 DomainName \ AccountName,或未指定電腦名稱或網域名稱。 您只需要提供 AccountName adadd.vbs 之後。在網域控制站上新增 IWAM_ computername,請在命令提示字元執行下列命令其中之一:
cscript adadd.vbs DomainName \IWAM_ ComputerName
-或者-
cscript adadd.vbs IWAM_ ComputerName
您有時候也必須藉由使用 Adadd.vbs 授與 IIS Metabase IWAM_ ComputerName 帳戶存取。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adadd.vbs ComputerName \IWAM_ ComputerName - 停止並重新啟動 IIS 管理服務及任何依存的服務。
- 執行 Adlist.vbs 請確定帳戶已新增至 IIS Metabase 存取清單。如果要執行這項操作,請在命令提示字元執行下列命令:
cscript adlist.vbs - 執行 Exchange 2000 的電腦上授與使用者程式 Files\exchsrvr\mailroot\vsi # \pickup 目錄路徑的寫入權限。不執行 Exchange 2000 的電腦上授與使用者 Inetpub\mailroot\pickup 目錄路徑的寫入權限。
- 等候 Active Directory 複寫到 IIS Metabase。
- 執行應用程式。
現在的應用程式的運作方式如預期般運作。
解決方法 3
如果您沒有明確地指定
sendusing 方法程式碼中,
cdoSendUsingPickup 值會是預設值。但是,您可以明確地指定
cdoSendUsingPickup 和收取目錄路徑在程式碼中。若要使用收取目錄方法,必須設定本機 SMTP 轉送。
這項因應措施的優點是組態的提高應用程式控制項和因應措施不限於第一個 SMTP 服務執行個體。有多部 SMTP 虛擬伺服器的電腦上預設組態選取 IIS Metabase 中的第一個的收取目錄。這個收取目錄可能不是應用程式需要的目錄。藉由明確指定收取目錄,您可以確定預設組態選取正確的收取目錄。這項因應措施的缺點是更易損壞比其他因應措施。Exchange 2000 安裝,或管理組態的變更可能會造成應用程式停止運作由於的收取目錄的位置的變更。
程式碼範例
下列程式碼範例會示範如何明確設定
cdoSendUsingPickup 和收取目錄位置:
<%@ Language=VBScript %>
<%
Dim iMsg
Dim iConf
Dim Flds
Const cdoSendUsingPickup = 1
'For CDOSYS, the pickup directory is located at c:\inetpub\mailroot\pickup.
Const strPickup = "c:\Program Files\Exchsrvr\mailroot\vsi 1\Pickup"
'Create the message object.
Set iMsg = CreateObject("CDO.Message")
'Create the configuration object.
Set iConf = iMsg.Configuration
With iConf.Fields
.item("http://schemas.microsoft.com/cdo/configuration/sendusing")= cdoSendUsingPickup
.item("http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory") = strPickup
.Update
End With
'Set the To, From, Subject, and Body properties of the message.
With iMsg
.To = "someone@example.com"
.From = "someone@example.com"
.Subject = "Test message by using CDOEx and cdoSendUsingPickup sent on: " & now()
.TextBody = "This is a test by using CDOEx"
.Send
End With
Set iMsg = Nothing
%>
因應措施 4
而非訊息寫入本機收取目錄,您可以寫入訊息遠端 SMTP 伺服器在網路上。這項因應措施的優點是較低的整體資源消耗和立即和詳細的錯誤資訊。這項因應措施的缺點是遠端 SMTP 伺服器可能無法使用和您失去自然佇列機制收取目錄中。
範例程式碼
下列的修改過的範例程式碼在 Exchange 2000 Server SP3 上運作。注意這個範例會加入建立並設定組態 object.
<%@ Language=VBScript %>
<%
Dim iMsg
Dim iConf
Dim Flds
Const cdoSendUsingPort = 2
Const strSmartHost = "MySmartHostServer"
'Create the message object.
Set iMsg = CreateObject("CDO.Message")
'Create the configuration object.
Set iConf = iMsg.Configuration
'Set the fields of the configuration object to send by using SMTP through port 25.
With iConf.Fields
.item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort
.item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmartHost
.Update
End With
'Set the To, From, Subject, and Body properties of the message.
With iMsg
.To = "someone@example.com"
.From = "someone@example.com"
.Subject = "Test message by using CDOEx and cdoSendUsingPort, sent on: " & now()
.TextBody = "This is a test by using CDOEx"
.Send
End With
set iMsg = Nothing
%>
附錄
若要下載指令碼檔案,將讀取權限授與 「 IIS Metabase] 與 [Active Directory 請造訪下列 Microsoft Web 網站:
http://download.microsoft.com/download/9/7/0/9706f302-99f8-49f9-8aa4-df66d771feaf/smtppermissionsscripts.exe
(http://download.microsoft.com/download/9/7/0/9706f302-99f8-49f9-8aa4-df66d771feaf/smtppermissionsscripts.exe)
下載包含下列的指令碼檔案。
摺疊此表格展開此表格
| Adlist.vbs | 列出存取控制清單 (ACL) 的伺服器在 Active Directory (如果有的話) 或在 IIS Metabase 上每個 SMTP 服務執行個體。 |
| Adadd.vbs | 授與所有伺服器上的 SMTP 服務執行個體的帳戶唯讀存取。 |
| Addel.vbs | 從伺服器上的所有 SMTP 服務執行個體中移除帳戶的所有存取控制項目 (ACE)。 |
每個指令碼會使用 Active Directory,判斷電腦是否執行 Exchange 2000。如果電腦執行 Exchange 2000,在 Active Directory 進行變更,並 Ds2mb.dll 檔案將所做的變更複寫到 IIS Metabase 的消耗由 SMTP。如果電腦不在執行 Exchange 2000,變更會直接在 IIS Metabase 中進行。