【问题标题】:Service not able to access a mapped drive服务无法访问映射的驱动器
【发布时间】:2011-02-15 08:04:50
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: windows-services process mapped-drive security-context


    【解决方案1】:

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

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

    【讨论】:

    • 感谢雷米的快速回复。但要求规定我们需要使用映射驱动器而不是 UNC 路径。我尝试过使用 UNC 路径,并且一切正常。关于 2) - 我尝试了以下场景: a) 创建了一个服务并以某个用户身份运行。 b) 从服务中调用流程。 (根据 Remy 的说法,该进程应该在为服务提供的相同用户上下文中运行。) c)我仍然无法访问映射的驱动器。 :(我的坏需要紧急帮助。谢谢
    • 忘记这个要求。我见过很多人忽视了微软的禁令。建议使用 UNC 路径。你可以看到即使 IIS 不支持映射驱动器,support.microsoft.com/kb/257174
    • 在 UNC 路径上使用映射的驱动器号没有任何优势,因为映射的驱动器号无论如何都会映射到 UNC 路径。在这种情况下需要放宽要求。
    • @Rohit,您没有回答我关于 #2 的问题 - 您究竟是如何开始新流程的?有很多不同的方法可以做到这一点。尝试使用 CreateProcessAsUser() 以便您也可以使用 CreateEnvironmentBlock() 加载用户帐户的环境。
    • 我相信映射驱动器具有某种 UNC 路径所没有的缓冲。映射驱动器通常比 UNC 路径更快地访问和传输数据。我没有证实这一点,只是观察到了。
    【解决方案2】:

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

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

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

    net use x: \\SERVERNAME\SHARENAME
    

    【讨论】:

    • 我在使用 TFSBuildServiceHost 服务时遇到了同样的问题。
    【解决方案3】:

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

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

    【讨论】:

    • 是的,但这并不意味着该服务可以访问用户帐户的驱动器号映射。 MSDN 甚至这么说:support.microsoft.com/kb/180362
    • 严格来说并非如此。如果您模拟登录用户,那么您将能够访问他们的驱动器映射。不过,我认为使用 UNC 路径更直接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多