【问题标题】:How do I get a windows service to have access to a shared network folder?如何让 Windows 服务访问共享网络文件夹?
【发布时间】:2016-10-26 23:29:11
【问题描述】:

我有一个将在客户端服务器上运行的 Windows 服务。此服务需要访问位于不同共享文件夹(Y:\ 和 Z:\)中的 2 个文件夹,它们都位于不同的计算机上(总共 3 台计算机)。

目前该服务只能查看位于同一台机器上的文件。当我对共享文件夹执行 IO.Directory.Exists() 时,它返回 false。

以下是我尝试过的事情:

  1. 作为网络服务运行
  2. 作为本地系统运行
  3. 作为本地服务运行
  4. 使用 \\192.168.1.xx\path\to\folder 测试存在
  5. 使用 Y:\ 和 Z:\ 测试存在性
  6. 在其他计算机上创建具有相同用户名和密码的用户
  7. 验证文件夹为所有人提供了完全访问权限

还没有任何效果,非常感谢任何帮助。

【问题讨论】:

  • 除非机器在域中,否则最好的办法可能是让服务使用 WNetAddConnection2 或类似方法显式连接,并提供用户名和密码。
  • 我尝试这样做并收到此错误:ERROR_NO_SUCH_LOGON_SESSION:指定的登录会话不存在。它可能已经被终止。 (代码:1312)
  • 我已经看到(在 Windows 10 上)当用户名不完全合格时,尝试SERVERNAME\USERNAME(或DOMAIN\USERNAME,如果它是域帐户或服务器也是域控制器)。
  • 哇,效果很好!太感谢了!如果您将其发布为答案,我会批准它

标签: windows networking service directory shared


【解决方案1】:

在 Active Directory 环境中,网络服务和本地系统都可以通过网络访问域中的其他机器;只需将服务器配置为授予对域中客户端计算机帐户的访问权限,即COMPUTERNAME$ 帐户。如果您使用 UNC 路径,将自动建立连接。您仍然不能使用在另一个登录会话中建立的驱动器号,但在大多数情况下,UNC 路径可以。

在独立环境中,这有点棘手。唯一可靠的方法是显式建立网络连接,您可以使用WNetAddConnection2 或任何各种替代方法来完成。 (或者,如果您不能调用 Win32 API,您可以使用 net use 命令。)在任何一种情况下,一旦建立连接,您就可以使用 UNC 路径。通常不需要映射驱动器号。

如果您出于某种原因必须拥有驱动器号,通常最好使用WNetUseConnection 函数而不是WNetAddConnection2。可以将其配置为自动选择驱动器号,因此您不必尝试找出已使用的驱动器号。

请注意,根据具体情况,可能需要为服务器上的帐户使用长格式的用户名,即SERVERNAME\USERNAMEDOMAINNAME\USERNAME,如果它是域帐户。出于某种原因,Windows 10 客户端似乎对此特别挑剔。

【讨论】:

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