C++ C++;名为DLL的windows服务程序工作不正常

C++ C++;名为DLL的windows服务程序工作不正常,c++,windows,service,C++,Windows,Service,我编写了一个运行在Windows服务上的websocket服务器程序。根据项目需要,调用了一个DLL。此DLL需要读取我的计算机和我文档下的文件。但是,名为DLL的windows服务程序可以成功,但DLL无法读取我文档下的文件。当服务器未作为windows服务运行时,DLL可以成功读取“我的文档”下的文件。我很沮丧,不知道为什么。谁能帮我。谢谢你当几个用户使用同一台电脑时,每个普通用户都有一个我的文档目录,并且无法访问其他用户的我的文档。 当您运行服务时,它默认运行为本地系统或本地服务,这是对用

我编写了一个运行在Windows服务上的websocket服务器程序。根据项目需要,调用了一个DLL。此DLL需要读取我的计算机和我文档下的文件。但是,名为DLL的windows服务程序可以成功,但DLL无法读取我文档下的文件。当服务器未作为windows服务运行时,DLL可以成功读取“我的文档”下的文件。我很沮丧,不知道为什么。谁能帮我。谢谢你

当几个用户使用同一台电脑时,每个普通用户都有一个
我的文档
目录,并且无法访问其他用户的
我的文档
。 当您运行服务时,它默认运行为本地系统本地服务,这是对用户的限制,并且无权访问您的
我的文档
目录

您必须思考:该服务如何从您电脑中的所有其他用户中选择它应该从哪个用户获取文件

简单的解决方案是以用户身份运行服务。您可以手动尝试,方法是打开服务属性(在服务上,右键单击并选择属性,或双击),选择登录选项卡,然后将帐户用户名和密码填入用户名和密码


真正的解决方案是将文件放置在一个固定的位置,如
%LocalAppData%\AppName
,而不依赖于任何用户。

调用通过DLL的事实有多重要?再服务安全性,自Windows 2000出现以来,已经发生了(我认为是根本性的)改变,可能已经改变了好几次。所以不要依赖你在网络上找到的旧信息:它很容易过时。调用DLL是必要的,你能给我一个解决方案吗?谢谢。也许是必要的,但它与问题有关吗?无论如何,技术解决方案在于用户帐户、模拟、访问控制列表等方面。自从我做那件事已经有20年了,所以我只是在某种程度上放弃你。这个DLL是由制造商提供的,很多操作都是通过DLL执行的。我不知道windows服务是否调用DLL,Win32控制台是否调用DLL。为什么DLL执行不同的结果?当DLL开始运行时,它需要读取computerServices上“我的文档”中的一个文件。默认情况下,该文件在本地系统帐户下运行,而不是在您的用户帐户下运行。“我的文档”是每个用户的文件夹,因此该服务加载的DLL可能位于错误的位置,或者没有权限,或者两者都没有。非常感谢您的回答和帮助。我会试试。最好的RegardsA真正的解决方案是模拟用户来访问该用户拥有的资源。此外,将本地系统称为受限用户帐户实际上是在扩展它。毕竟,所有这些都是由帐户来管理的。@I受限制的不可检查,我的意思是不是管理员。只有管理员才能访问私人用户帐户。当然,您可以将本地系统访问权限授予用户帐户,但请运行该服务,因为该用户将执行相同的操作。在%LocalAppData%文件夹存在的情况下,强制服务作为本地服务运行,并强制特定用户存在,只是从It documents文件夹中获取文件,这看起来有点像是有点重复。这是向后的。帐户的令牌包括
内置\Administrators
。DLL可能无法读取该文件,因为它在错误的位置查找,而不是因为它缺少权限。LocalSystem帐户对本地计算机上的所有内容都具有完全的、不受限制的访问权限,因此得名。如果不访问用户令牌,例如从模拟用户或提取给定会话的登录用户等方面,它就无法找到特定于用户的路径,如
文档
。这就是为什么像
SHGetFolderPath()
SHGetKnownFolderPath()
这样的API将可选用户令牌作为输入,特别适用于需要访问每用户路径的管理员和服务。