錯誤案例:在Microsoft Virtual PC 2007和一台筆記本電腦上安裝MSDN訂閱下載的SQL Server 2005企業版時出現問題。安裝環境為Windows Server 2003 企業版 + sp1,另外一個系統是帶sp2的,安裝用戶使用超級管理員(Administrator)。在安裝“Integration Services”步驟時出現安裝錯誤,提示“錯誤: -2146233087”。
錯誤記錄如下:
標題: Microsoft SQL Server 2005 安裝程序
------------------------------
無法在 COM+ 目錄中安裝和配置程序集 C:Program FilesMicrosoft SQL Server90DTSTasksMicrosoft.SqlServer.MSMQTask.dll。錯誤: -2146233087
錯誤消息: Unknown error 0x80131501
錯誤說明: 要執行此任務,您必須具有管理憑據。請與您的系統管理員聯系以獲得幫助。
有關幫助信息,請單擊:
go.microsoft.com/fwlink?LinkID=20476&ProdName=Microsoft
+SQL+Server&ProdVer=9.00.1399.06&EvtSrc=setup.rll&EvtID=
29549&EvtType=sqlca%5csqlassembly.cpp%40Do_sqlAssemblyReg
Svcs%40Do_sqlAssemblyRegSvcs%40x80131501
通過幫助信息的超鏈接頁面,提示“需要為MS DTC服務配置 Network Service帳戶運行”,不過筆者的MS DTC本來就是在Network Service帳戶下運行。
通過百度和Google搜索了一下,有不少朋友碰到類似錯誤消息,不過沒有得到好的解決方式,只好自己尋找線索進行嘗試。可以肯定的是問題應該出現在訪問權限,而這方面常見的問題一般都是對文件系統目錄和系統注冊表的訪問。在微軟的客戶幫助和支持網站搜索SQL Server的相關安裝信息。有一篇文章提到設置“C:WindowsRegistration”的權限,確認該目錄以及目錄下的clb和crmlog文件有完全的讀寫權限,再次安裝SQL Server 2005在“Integration Services”步驟還是提示失敗。在安裝過程中選擇服務帳戶時使用內置系統帳戶或使用域用戶帳戶都一樣。
看來問題沒有這麼簡單,筆者在另外一個系統中安裝時啟用RegMon進行注冊表操作監視,過濾後只監視“msIExec.exe:484”進程,在報以上面提到的錯誤後保存監視日志到文件。
通過監控日志查看失敗的情況。由於沒有仔細查找,在後來通過微軟SQL Server組的技術支持工程師才想到問題早應該解決。以下是我事後再次查看RegMon Trace發現的問題故障點,通過下面的日志看出使用本機Administrator訪問注冊表.HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.DataFileMessage項時被拒絕。
11305 32.35072327 msIExec.exe:484 OpenKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.DataFileMessage Access DENIED NBCN-ZZAdministrator
11306 32.36096954 msIExec.exe:484 QueryKey HKCUSoftwareClasses SUCCESS Name: REGISTRYUSERS-1-5-21-730333180-4162487032-3015738926-500_CLASSES
11307 32.36102295 msIExec.exe:484 OpenKey HKCUSoftwareClassesMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.DataFileMessage NOT FOUND
11308 32.36108017 msIExec.exe:484 OpenKey HKCR SUCCESS
11309 32.36190796 msIExec.exe:484 CreateKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.DataFileMessage Access DENIED NBCN-ZZAdministrator
11310 32.36222076 msIExec.exe:484 CreateKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.DataFileMessage Access DENIED NBCN-ZZAdministrator
由於粗心結果又多做了很多工作,查看系統的“組件服務”配置是否有問題,但是沒有發現什麼異常。
在再次出現安裝問題後,這次就直接點擊“忽略”按鈕繼續安裝SQLServer的其他部分,安裝結束後,提示安裝成功完成。
運行“dcomcnfg”,打開系統組件服務。展開控制台根目錄->組件服務->計算機->我的電腦->COM+應用程序節點,沒有發現Microsoft.SqlServer.MSMQTask節點,可見該COM+應用程序沒有安裝上。
再次運行SQL Server 2005安裝程序進行添加刪除安裝,提示安裝成功,在“組件服務”中看到“Microsoft.SqlServer.MSMQTask”。看來問題解決了,但是那時還不知道問題出在哪裡。卸載SQL Server 2005,發現“Microsoft.SqlServer.MSMQTask”並沒有卸載,測試只安裝SQL Server 2005的Integration Services服務。結果安裝失敗,選擇“中止”取消安裝,再次確認存在“Microsoft.SqlServer.MSMQTask”服務。
接下去筆者把安裝過程中出現的錯誤發送給微軟,請SQL Server 組的技術支持工程師幫助解決。在工程師查找問題過程中,雖然許多檢查點我都做過,不過他查找分析解決問題的思路清晰,以下我列了大概幾個步驟。
一.MSDTC運行帳戶問題
確認MSDTC (Microsoft Distributed Transaction Coordinator)服務正在運行,並且其啟動帳戶是NT AUTHORITYNetwork Service”。按照以下步驟來檢查:
1. 點擊“開始”->“運行”->services.msc
2. 在服務列表中找到Distributed Transaction Coordinator,雙擊以編輯其屬性
3. 在屬性窗口切換至登錄選項卡,確認其啟動帳號為”NT AUTHORITYNetwork Service”(密碼為空即可)
4. 啟動DTC服務再嘗試安裝SQL Server 2005
結果:這個步驟我已經嘗試過,不是這個問題。
二.分析SQL Server 2005安裝日志
將C:Program FilesMicrosoft SQL Server90Setup BootstrapLOG目錄下所有的文件(包括Summary.txt和Files子目錄下的所有文件)發送給微軟技術支持工程師進行分析。
結果:這個步驟我沒有做過,不過微軟工程師好像也沒有發現線索。
三.COPY安裝程序到硬盤安裝嘗試
建立 D:SQLServer2005 文件夾, 創建以下兩個子文件夾:Servers和Tools。ServIErs文件夾拷貝SQL Server2005的第一張安裝盤,包含所有要安裝主 SQL Server 2005 組件。 Tools文件夾拷貝SQL Server 2005的第二張盤,包含為 SQL Server 2005 聯機叢書和工具組件。運行D:SQLServer2005Servers 文件夾下的Setup.exe,啟動 SQL Server 2005 安裝程序。
結果:以上方式安裝過程中還是碰到同樣的問題。
四.重新安裝 COM+應用程序
1.從控制面板的“添加或刪除程序”中,單擊“添加/刪除 Windows 組件”。
2.在“Windows 組件向導”中,不對選擇做任何更改,單擊“下一步”。一直單擊以完成向導,然後再次運行 SQL Server 2005 安裝程序。
結果:問題沒有解決。
通過以上分析微軟的工程師總結如下:
目前還不確定引起這個錯誤的原因,並且在安裝日志中也沒有找到更多的有用信息。可能引起此類錯誤的原因有以下幾種:
1. COM+的配置問題。
2. 帳號權限問題。
3.有一些安裝失敗的Microsoft.SqlServer.MSMQTask.dll情況出現在測試版中,或者是由於未完全刪除的測試版組件而導致安裝失敗。
4. 除此之外還有一些類似的問題都是與64位操作系統或者Cluster環境有關。
我認為以上的一些原因可以排除,看來又是Live Meeting的時候了,和微軟工程師約定時間聯機查找問題。
五.手工注冊Microsoft.SqlServer.MSMQTask.dll
使用regsvcs.exe應用程序工具注冊.Net服務
使用cmd執行過程如下:
C:WindowsMicrosoft.NetFrameworkv2.0.50727>regsvcs.exe "C:Program FilesMicr
osoft SQL Server90DTSTasksMicrosoft.SqlServer.MSMQTask.dll"
Microsoft(R) .Net Framework 服務安裝實用工具版本 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
出現下列安裝錯誤:
1: 要執行此任務,您必須具有管理憑據。請與您的系統管理員聯系以獲得幫助。
2: 注冊程序集“Microsoft.SqlServer.MSMQTask, Version=9.0.242.0, Culture=neutral,
PublicKeyToken=89845dcd8080cc91”失敗。
3: 對注冊表項“HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.
DataFileMessage”的訪問被拒絕。
分析結果:
這看起來是由於當前Windows用戶在該注冊表鍵值上沒有足夠的權限造成的。經過研究類似案例,在某些情況下,即使是Administrators組的用戶也可能出現對這些鍵值沒有Full Control的情況。需要確認一下在這些注冊表值上,Administrators組用戶是否有Full Control。在注冊表中右鍵點擊注冊表值->選擇權限來查看及改變該值上的權限設置。如果權限設置都正確的話,可以試著抓一個RegMon trace來看到底是不是注冊表鍵值的權限問題導致這個錯誤。
看來問題終於找到了。
六.監控注冊表
1. 運行RegMon工具,通過菜單Options->Filter中設置Include list,把Regsvcs.exe加入Include list中。
2. 執行regsvcs.exe "C:Program FilesMicrosoft SQL Server90DTSTasksMicrosoft.SqlServer.MSMQTask.dll"
3. 在Regsvcs.exe執行失敗停止後,保存RegMon生成的log。
分析RegMon Trace。定位問題如下:
5484 17.98829079 RegSvcs.exe:3404 OpenKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask Access DENIED NBCN-ZZAdministrator
5488 17.98927116 RegSvcs.exe:3404 CreateKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask Access DENIED NBCN-ZZAdministrator
5489 17.98955727 RegSvcs.exe:3404 CreateKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask Access DENIED NBCN-ZZAdministrator
6431 19.89454460 RegSvcs.exe:3404 OpenKey HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask Access DENIED NBCN-ZZAdministrator
以上其實就是我一開始使用RegMon 時應該發現的問題,結果到現在才發現。
從這幾條記錄來看,問題是對注冊表值HKCRMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask的權限問題。而RegSvcs進程在遇到這些權限問題之後,並沒有馬上終止,還有一些別的注冊表活動。我查看了注冊表HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.
DataFileMessage項的權限,Administrators組沒有“完全控制”和“讀取”權限,對其進行授權。重新運行注冊,結果又報另外的注冊表項沒有權限,對其進行添加,直到注冊成功,以下是輸出結果。
C:WindowsMicrosoft.NetFrameworkv2.0.50727>regsvcs.exe "C:Program FilesMicr
osoft SQL Server90DTSTasksMicrosoft.SqlServer.MSMQTask.dll"
Microsoft(R) .Net Framework 服務安裝實用工具版本 2.0.50727.42
Copyright (c) Microsoft Corporation. All rights reserved.
正在自動將“Microsoft.SqlServer.ManagedDTS, Version=9.0.242.0, Culture=neutral,
PublicKeyToken=89845dcd8080cc91”導出為“C:WindowsassemblyGAC_MSILMicrosoft.
SqlServer.ManagedDTS9.0.242.0__89845dcd8080cc91Microsoft.SqlServer.ManagedDTS.
tlb”。
警告: 程序集未聲明 ApplicationAccessControl 屬性。默認情況下啟用應用程序安全性。
已安裝的程序集:
程序集: C:Program FilesMicrosoft SQL Server90DTSTasksMicrosoft.Sql
Server.MSMQTask.dll
應用程序: Microsoft.SqlServer.MSMQTask
TypeLib: C:Program FilesMicrosoft SQL Server90DTSTasksMicrosoft.Sq
lServer.MSMQTask.tlb
C:WindowsMicrosoft.NetFrameworkv2.0.50727>
修改授權的相關注冊表項如下:
HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.MessageQueueTask
HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.EncryptionAlgorithmWrapper
HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.ServCompMQTask
HKEY_CLASSES_ROOTMicrosoft.SqlServer.Dts.Tasks.MessageQueueTask.Formatter
再次運行“dcomcnfg”,打開系統組件服務。展開控制台根目錄->組件服務->計算機->我的電腦->COM+應用程序節點,發現Microsoft.SqlServer.MSMQTask節點,該COM+服務已經安裝成功。