我使用.net开发了一个Windows服务。我的服务调用非托管代码,如下所示 -
[DllImport("cmxConnect.dll")]
private unsafe static extern String cmxQuery([MarshalAs(UnmanagedType.LPStr)] String s, long* connPointer);
我已将cmxConnect.dll放在与服务可执行文件相同的文件夹中。如果我将登录用户设置为我的域帐户,则服务正常启动。但是如果我使用本地系统帐户启动服务,我会得到DLL未找到的异常。我猜我的环境设置中有一些东西可以让windows找到cmxConnect.dll。有人能指出究竟是什么吗?
答案 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的受信任位置是: