2012-10-18 18 views
2

我的問題的描述聽起來有點複雜,是什麼讓我覺得我的方法有缺陷,所以我也會欣賞任何更好的想法。在獨立應用程序中模擬IIS DefaultAppPool

簡短說明:

由於連接字符串MSSQL 2008數據庫和網站名稱部署在IIS6,我希望通過編程驗證網站是否能夠連接到數據庫。

長描述:

  1. 我有MSSQL Server數據庫,姑且稱之爲portal_db
  2. 我有一個應用程序部署在IIS6上,名爲portal。我可以通過url http://localhost/portal訪問它。在Web.config文件中,我指定了連接字符串到我的數據庫,如下所示:"server=(local)\SQLEXPRESS;trusted_connection=yes;database=portal_db"
  3. Web應用程序使用System.Data.SqlClient.SqlConnection訪問數據庫,沒有任何包裝器,ORM,映射,任何東西。
  4. 網站被配置爲在appool PortalAppPool中運行。它使用ApplicationPoolIdentity作爲安全上下文。
  5. 這是不能夠容易地修改Web應用程序代碼(特別是它訪問數據庫的方式)

當我的web應用程序嘗試連接到數據庫它成功或失敗,這取決於用戶IIS APPPOOL\PortalAppPool是否在被配置MSSQL數據庫。這是我理解的一部分,但是在部署我的應用程序時,我經常忘記在數據庫中爲apppool虛擬帳戶創建新的用戶/登錄名。因此,我想要做的,是分開的,獨立的,控制檯應用程序(最好是用C#編寫,但不一定)來驗證,我的web應用程序是否能夠訪問數據庫,以下列方式:

  1. 讀取連接從字符串Web.config
  2. 閱讀應用程序池標識設置(管理通過目錄服務API來做到這一點)
  3. 上的應用程序池定義的憑據,冒充身份(使用模擬類,我發現在這裏:http://platinumdogs.me/2008/10/30/net-c-impersonation-with-network-credentials/它使用在其他許多地方,包括MSDN中發現的想法)
  4. 打開SqlConnection連接對字符串從Web.config

讀它歸結爲下面的代碼片段:

using (new Impersonator("IIS APPPOOL\\PortalAppPool", "", "")) 
{ 
    SqlConnection conn = new SqlConnection(databaseConnectString); 
    conn.Open(); 
} 

一切都運行得非常好,當我的應用程序池的安全上下文設置爲任何其他值比AppPoolIdentity - 特定的用戶,本地系統等等。當我將傳遞給我的用戶名和密碼的憑證更改爲我的用戶名和密碼時,我得到了期望的結果(當我在數據庫中沒有登錄映射時,例外,並且當我添加一個時,一切正常)。但我似乎無法模擬IIS APPPOOLS\PortalAppPool虛擬帳戶 - 只是不知道應傳遞給LogonUser的參數 - 如果連這個都不可能,我也不會感到驚訝。也許我專注於模擬方法太多(我正在使用它來訪問其他用戶的註冊表項和服務,並且效果很好),也許還有更好的方法。

如果您有任何其他更好的想法或需要對此問題進行更多解釋,請讓我知道。

回答

0

我不認爲你可以模擬一個虛擬賬戶(IIS服務帳戶)。它們是主要用於IIS安全性的特殊服務帳戶。它們僅用於本地服務,不能附加到任何域。 Windows Server 2008 R2和Windows 7中的虛擬帳戶是「託管本地帳戶」,它提供以下功能以簡化服務管理:

  • 無需密碼管理。
  • 能夠在域環境中使用計算機身份訪問網絡。

你不能 「登錄到」 虛擬帳戶,它們是由Windows出於安全目的:

一些輕鬆的讀物,如果你有時間:

爲了解決你原來的問題,你可以建立一個應用程序,可以做同樣的邏輯,但檢查SQL服務器,如果它有正確的用戶設置,而不是簡單地嘗試登錄該帳戶。