【问题标题】:Windows Service cannot access network location (UNC) PathWindows 服务无法访问网络位置 (UNC) 路径
【发布时间】:2018-08-25 15:44:08
【问题描述】:

我有一个 Windows 服务,它不断轮询文件夹中的新文件。对于本地目录,这工作正常。但是当涉及到同一网络中另一个系统上的 UNC 路径时,该服务似乎无法访问该文件夹。我有参考这篇帖子https://serverfault.com/a/881272;它声明我需要以当前登录的用户身份运行服务。我应该怎么做?

我希望使用该服务监控的路径是

\DESKTOP-PC\Users\me\myfolder

请指教

更新:

我使用 topshelf 开发了该服务。我想轮询同一网络中另一台本地计算机上的文件夹。我去网络地方,双击计算机名,它要求提供凭据,我输入用户名和密码我可以访问该用户系统上文件的远程计算机(在资源管理器中)。

现在,当我将服务设置为在本机下以本地计算机用户身份运行时,它无法访问可使用资源管理器访问的远程 UNC 路径。我已尝试以远程计算机用户身份安装它,但失败了。

myService.exe install -username:DESKTOP-REMOTE\myname -password:mypassword

【问题讨论】:

  • 您必须首先确保您网络中其他系统中的文件夹与您的帐户共享,并且在访问它时您还可以提供您的帐户用户名和密码以对其进行身份验证,如果您提供你的代码,更容易看到你在做什么。
  • @PiJei 我已经使用用户名和密码进行了身份验证,并且可以从 Windows 资源管理器访问。

标签: c# .net networking unc topshelf


【解决方案1】:

如果您尝试在desktop-remote\myname 帐户下运行您的服务,您可能会失败。本地机器只喜欢属于自己的帐户。

我要做的就是扭转局面。使远程计算机共享一个文件夹以供您的计算机轮询。这样远程机器就可以控制它发布的数据,就像一个对象的属性是privatepublic。如果您可以让知道地址\\desktop-remote\my-not-so-secret-folder\ 的任何人能够阅读它,请将其设置为任何人都可以阅读。如果您比较隐秘,请在文件夹后面加上 $,如下所示:\\desktop-remote\my-secret-folder$。现在它不可见但仍然可以访问。
您还可以创建一个可以访问该文件夹的特殊帐户。

然后您让您的服务在您的本地计算机上运行您选择的任何帐户(具有网络访问权限)。让它尝试使用特殊帐户连接到远程文件夹。

(我已经了解到,读取共享文件夹在没有域的机器和域中的机器之间略有不同;任何人都可以读取不起作用。至少在 WindowsXP 中是这样的。我从此不再需要共享文件夹。)

HTH

【讨论】:

  • 感谢您的帮助。文件夹应该如何共享?是否应该将权限设置为所有人,因为只有本地机器使用可见。
  • 要启动并运行,请跳过共享部分。在我的文本中重要的是 1)您的服务应该在本地计算机的帐户中运行,2)它应该在尝试连接到远程计算机时使用远程计算机的 usr/pwd。 (我相信通过共享文件夹污染了我的答案使阅读变得更加困难;但我不想在之后如此彻底地改变它。)
  • 感谢您的更新。我已成功通过以LocalMachine 运行服务并模拟远程用户来解决问题。我遇到了另一个问题。要监视的目录和输出目录保存处理过的文件可以在两台不同的远程机器上。每次都冒充用户保存文件是个坏主意吗?会花很多时间吗?你怎么看?
  • 登录需要时间。如果您经常这样做(为“经常”输入您的首选值)或想要节省 CPU 周期和带宽,您应该记住您登录的会话。但这是另一个问题。 (对于 Stackoverflow 可能会变宽。)
  • 感谢您的更新。该方案仅适用于远程windows系统。会有其他共享网络位置对吗?就像一个独立的共享无线硬盘。在这种情况下,身份验证会失败,对吧? windows服务是否可以访问此类网络资源?
【解决方案2】:
  1. 打开控制面板 > 管理工具 > 服务窗口 您的 Windows 服务器。
  2. 停止您的 Windows 服务。
  3. 打开“属性”>“登录”对话框。
  4. 将服务用户帐户更改为目标用户帐户。
  5. 开始您的服务。

如果您在 Visual Studio 中开发服务,并且想要模拟不同的帐户,您也可以按 shift + 鼠标右键单击 devenv.exe,然后单击“以不同用户身份运行”。

还要确保您指定了文件夹的完整路径,并且您使用的帐户拥有该文件夹的完全权限。

【讨论】:

    【解决方案3】:

    当您将服务设置为以本地系统帐户运行时,它无法访问可通过本地计算机帐户使用资源管理器访问的远程 UNC 路径。

    仅仅因为资源管理器管理登录的用户凭据,因此,您只向 LOGGED 用户添加了 UNC 路径凭据。

    当您将其更改为本地系统帐户时,不会存储共享的用户凭据。

    尝试创建一个没有密码过期的本地用户,然后允许它访问共享。

    您需要做的就是用这个注册的新帐户设置 windows 服务。

    【讨论】:

      【解决方案4】:

      我在 Azure 云中的 UNC 存储时遇到了这个问题。 有效的是在 Windows 凭据管理器中设置凭据:

      windows credential manager

      您可以从 Azure 门户获取连接字符串。

      这解决了我们的问题。

      【讨论】:

        【解决方案5】:

        您可以查看模拟。此外,如果该服务以本地用户身份运行,那么在文件夹所在的计算机上创建具有相似密码的相同用户将有所帮助。

        看看这里(这篇文章中的 OP 遇到了同样的问题,他/她给了共享文件夹“每个人都可以完全控制”。

        https://serverfault.com/questions/177139/windows-service-cant-access-network-share

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          相关资源
          最近更新 更多