Windows服务dll搜索路径

时间:2010-09-08 17:44:10

标签: windows dll windows-services windows-xp

我使用.net开发了一个Windows服务。我的服务调用非托管代码,如下所示 -

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

我已将cmxConnect.dll放在与服务可执行文件相同的文件夹中。如果我将登录用户设置为我的域帐户,则服务正常启动。但是如果我使用本地系统帐户启动服务,我会得到DLL未找到的异常。我猜我的环境设置中有一些东西可以让windows找到cmxConnect.dll。有人能指出究竟是什么吗?

4 个答案:

答案 0 :(得分:1)

本地系统帐户非常强大。为了安全起见,可能会为此帐户禁用DLL搜索顺序。 (如果仅按名称进行搜索,并且某人设法将恶意DLL放入搜索顺序中的某个位置,那么您的特权漏洞就会升级。)如果是.NET服务,您可能希望将DLL添加到您的清单并将您的DLL安装在GAC中。 (我不是一个.NET人。我之前刚刚听过这些术语。)

答案 1 :(得分:1)

从msft尝试进程监视器。此工具将显示服务在哪里查找您的DLL。它甚至可能正在寻找一个依赖的DLL。这也将显示在进程监视器中。

答案 2 :(得分:0)

我猜这里,但你检查了环境变量。您的本地系统a / c是否具有相同的Env集。 VARS?

答案 3 :(得分:0)

据我所知,DllImport属性只是包含对LoadLibrary的调用,因此标准Dynamic Link Library Search Order应该适用。

服务将在一个更加受限制的用户代码环境中运行 - 我可以看到从exe文件夹和System32以外的任何位置加载dll是不可取的 - 在其他地方打开一个直到预加载攻击,这对服务来说非常严重。

可能很简单:服务只能从System32搜索dll?

查找dll的受信任位置是:

  1. 当传递一个显式路径时,它清楚地向LoadLibrary显示应用程序知道它想要的dll。你能把完全限定的路径传递给DllImport吗?
  2. 搜索dll最受信任的非完全限定位置是在WinSxS中 - 如果您自己构建dll,可能会将其部署为本机并排组合是一种选择。
  3. exe自己的文件夹。通常。我无法想象,因为该服务是一个.net应用程序,这不适用。但显然这里有一个问题。
  4. System32 - 您可能需要在此处安装。