Windows services 服务无法访问映射的驱动器

Windows services 服务无法访问映射的驱动器,windows-services,process,mapped-drive,security-context,Windows Services,Process,Mapped Drive,Security Context,我在许多论坛上读到,由于没有用户登录,映射驱动器无法从服务访问 问题1)我尝试将我的服务作为某个帐户登录,并将我的网络驱动器映射到该帐户中。服务仍然无法访问它。为什么? 问题2)从相同的服务中,我调用另一个过程。进程将在哪个用户帐户下运行 感谢您使用UNC路径,这样您就不需要访问映射的驱动器号。至于为什么即使在同一个帐户中运行也无法访问它们,如果没有看到您的实际代码,很难确定 2) 这取决于您如何启动流程。如果使用ShellExecute()或CreateProcess(),则它将在调用线程的用

我在许多论坛上读到,由于没有用户登录,映射驱动器无法从服务访问

问题1)我尝试将我的服务作为某个帐户登录,并将我的网络驱动器映射到该帐户中。服务仍然无法访问它。为什么?

问题2)从相同的服务中,我调用另一个过程。进程将在哪个用户帐户下运行

感谢您使用UNC路径,这样您就不需要访问映射的驱动器号。至于为什么即使在同一个帐户中运行也无法访问它们,如果没有看到您的实际代码,很难确定

2) 这取决于您如何启动流程。如果使用
ShellExecute()
CreateProcess()
,则它将在调用线程的用户帐户中运行。如果使用
CreateProcessAsUser()
CreateProcessWithLogonW()
,或
CreateProcessWithTokenW()
,则它会在传入的用户帐户中运行。

1)改用UNC路径,则不需要访问映射的驱动器号。至于为什么即使在同一个帐户中运行也无法访问它们,如果没有看到您的实际代码,很难确定


2) 这取决于您如何启动流程。如果使用
ShellExecute()
CreateProcess()
,则它将在调用线程的用户帐户中运行。如果您使用
CreateProcessAsUser()
CreateProcessWithLogonW()
,或
CreateProcessWithTokenW()
,则它在您传入的用户帐户中运行。

服务无权访问XP及更高版本上的映射驱动器,因为映射驱动器是每个用户的资源,因此它们取决于登录的用户。由于可能没有人登录,因此可能没有映射驱动器


您的服务可能会映射驱动器本身。

服务无法访问XP及更高版本上的映射驱动器,因为映射驱动器是每个用户的资源,所以它们取决于谁登录。由于可能没有人登录,因此可能没有映射驱动器


您的服务可能会映射驱动器本身。

在服务模式下运行JBoss时,我遇到了类似的问题,即使我将“登录为:”选项更改为映射驱动器的同一用户后执行服务,我的Java代码也无法访问映射驱动器

然后我发现,如果我可以使用相同的服务映射驱动器,那么它应该可以工作

最后,在service.bat文件顶部添加一个简单的命令就解决了这个问题

net use x: \\SERVERNAME\SHARENAME

我在服务模式下运行JBoss时也遇到过类似的问题,即使我将“登录为:”选项更改为映射驱动器的同一用户后执行服务,我的Java代码也无法访问映射驱动器

然后我发现,如果我可以使用相同的服务映射驱动器,那么它应该可以工作

最后,在service.bat文件顶部添加一个简单的命令就解决了这个问题

net use x: \\SERVERNAME\SHARENAME

谢谢你的快速回复,雷米。但该要求指出,我们需要使用映射驱动器而不是UNC路径。我尝试过使用UNC路径,而且一切正常。大约2)-我尝试了以下场景:a)创建了一个服务并以某个用户的身份运行。b) 从服务中调用进程。(根据Remy的说法,该进程应该在为服务提供的相同用户上下文中运行。)c)我仍然无法访问映射的驱动器:(我的坏朋友迫切需要帮助。感谢您的帮助。我见过很多人忽视了Microsoft禁止的内容。建议使用UNC路径。您可以看到,即使IIS不支持映射驱动器,在UNC路径上使用映射驱动器号也没有好处,因为映射驱动器号无论如何都会映射到UNC路径。要求在这种情况下需要放松记忆。@Rohit,你没有回答我关于#2-你到底是如何启动新流程的问题?有很多不同的方法。请尝试使用CreateProcessAsUser()以便也可以使用CreateEnvironmentBlock()加载用户帐户的环境。我相信映射驱动器具有某种UNC路径所没有的缓冲。映射驱动器通常比UNC路径更快地访问和传输数据。我没有确认这一点,只是观察到了这一点。感谢Remy的快速回复。但要求指出,我们需要使用映射驱动器而不是UNC我已经试过使用UNC路径,并且一切正常。大约2)-我尝试了以下场景:a)创建了一个服务,并以某个用户的身份运行。b) 从服务中调用进程。(根据Remy的说法,该进程应该在为服务提供的相同用户上下文中运行。)c)我仍然无法访问映射的驱动器:(我的坏朋友迫切需要帮助。感谢您的帮助。我见过很多人忽视了Microsoft禁止的内容。建议使用UNC路径。您可以看到,即使IIS不支持映射驱动器,在UNC路径上使用映射驱动器号也没有好处,因为映射驱动器号无论如何都会映射到UNC路径。要求在这种情况下需要放松记忆。@Rohit,你没有回答我关于#2-你到底是如何启动新流程的问题?有很多不同的方法。请尝试使用CreateProcessAsUser()以便也可以使用CreateEnvironmentBlock()加载用户帐户的环境。我相信映射驱动器具有某种UNC路径所没有的缓冲。映射驱动器通常比UNC路径更快地访问和传输数据。我没有确认这一点,只是观察到了。是的,但这并不意味着服务可以访问用户帐户的驱动器号映射。MSDN甚至says as ALGO:严格来说,这不是真的。如果你模拟一个登录的用户,那么你将能够访问他们的驱动器映射。我认为使用UNC路径更简单,但是