【问题标题】:Windows service dll search pathWindows 服务 dll 搜索路径
【发布时间】:2011-04-09 21:18:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: windows dll windows-services windows-xp


    【解决方案1】:

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

    【讨论】:

    • 我发现问题不是我所指的 dll,而是该 dll 引用的其他 dll。 Windows 无法找到其他 dll,并输出了一条错误消息,表明它无法找到 cmxConnect.dll
    【解决方案2】:

    尝试使用 msft 的进程监视器。这个工具会告诉你服务在哪里寻找你的 dll。它甚至可能正在寻找一个依赖的 dll。这也会显示在进程监视器中。

    【讨论】:

    • 如何启动进程监视器?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      据我了解,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 - 您可能需要在此处安装它。

      【讨论】:

        猜你喜欢
        • 2011-01-20
        • 1970-01-01
        • 2011-01-25
        • 2018-11-16
        • 1970-01-01
        • 2011-04-19
        • 2011-03-01
        • 2021-11-02
        • 1970-01-01
        相关资源
        最近更新 更多