2010-09-08 84 views
2

我開發了一個使用.net的Windows服務。我的服務對非託管代碼調用一些像如下 -Windows服務DLL搜索路徑

[DllImport("cmxConnect.dll")] 
private unsafe static extern String cmxQuery([MarshalAs(UnmanagedType.LPStr)] String s, long* connPointer); 

我都放在同一個文件夾作爲服務可執行文件中cmxConnect.dll。如果我將登錄用戶設置爲我的域帳戶,服務就會正常啓動。但是,如果我使用本地系統帳戶啓動服務,則會出現DLL未找到異常。我猜測我的環境設置中有一些東西讓Windows能夠找到cmxConnect.dll。有人能指出這到底是什麼嗎?

回答

0

本地系統帳戶非常強大。爲了安全起見,可能會爲此帳戶禁用DLL搜索順序。 (如果它只是按名稱搜索,並且有人設法在搜索順序中放置一個惡意DLL,那麼你的權限漏洞就會升級)。如果它是一個.NET服務,那麼你可能想要將DLL添加到您的清單並將您的DLL安裝在GAC中。 (我不是.NET的人,我剛剛聽過這些條款。)

+1

我想出問題不在於我指的是dll,而是由該dll引用的其他dll。 Windows無法找到其他DLL並輸出一個錯誤的錯誤消息,它無法找到cmxConnect.dll – user434541 2010-11-08 01:27:29

0

我在這裏猜測,但你有檢查環境變量。您的本地系統a/c是否具有相同的Env組。瓦爾?

0

據我所知,DllImport屬性只是簡單地調用LoadLibrary,所以標準Dynamic Link Library Search Order應該適用。

服務將運行在一個更受限制的用戶代碼環境中 - 我可以看到,從exe文件夾和System32以外的任何位置加載dll是不可取的 - 在其他地方打開一個直到預加載攻擊,這對服務來說會非常嚴重。

它可能很簡單:服務只能從System32搜索dll?

受信任的位置找到的DLL:

  1. 當通過該應用程序知道哪些dll它想要一個明確的路徑其明確給LoadLibrary。你能否將完全合格的路徑傳遞給DllImport?
  2. 最值得信任的非完全合格的搜索dll的地方是在WinSxS中 - 如果您自己構建dll,可能將其部署爲本地並排組裝是一種選擇。
  3. 該exe文件夾。通常。我無法想象,因爲該服務是一個.net應用程序,這不適用。但顯然這裏有一個問題。
  4. System32 - 您可能需要在此處安裝它。
1

從msft嘗試進程監視器。這個工具會告訴你服務在哪裏尋找你的dll。它甚至可能正在尋找一個相關的DLL。這也會顯示在進程監視器中。

+1

我該如何啓動進程監視器? – 2014-07-22 09:34:58