【问题标题】:Windows service does not recognize network path. Whats the workaround?Windows 服务无法识别网络路径。解决方法是什么?
【发布时间】:2011-08-17 20:12:36
【问题描述】:

我们有一个 Buffalo NAS 驱动器作为备份驱动器。

当我们将此驱动器映射为 B:\ 时,我们的备份应用程序似乎理解这一点并作为应用程序运行。

但是当作为服务运行时,它无法识别映射并崩溃。

我尝试将路径作为\\\192.168.x.x\Backups\ 作为备份路径,服务运行但随后许多子模块失败,因为它将\\\ 视为转义字符。

什么是解决方法,以便 Windows 服务可以看到映射的驱动器。

我正在尝试通过CreateProcess() 运行 zip.exe;

""C:\Users\jvenkatraj\Documents\SQLite\Debug\zip.exe" -9 -q -g -u "\\\192.168.123.60\Backup\store\location1\50\f2\25\43\d8\88\b9\68\49\8d\2b\d0\08\9e\7e\df\z.zip" "\\\192.168.123.60\Backup\store\temp\SPD405.tmp\file_contents""

反斜杠与引号混淆。它是 WCHAR 类型,我不能将其更改为任何其他类型,否则我也必须在其他地方重新定义它。我应该使用多少个反斜杠?

【问题讨论】:

  • 注意,您必须通过添加两个反斜杠来指定您的 UNC 路径:\\192.168.x.x\Backups。
  • 我在问题中添加了两个反斜杠,但在我发布后,它只显示一个。让我更新我的问题
  • 澄清一下,作为系统服务安装的备份应用程序是您自己的代码还是第三方应用程序?是这个应用程序在 zip.exe 上调用 CreateProcess 吗?
  • 我在下面提出了另一个建议,但是如果你想修复 CreateProcess 问题,我建议你在调用 CreateProcess 之前弹出一个消息框,这样你就可以准确地看到字符串实际上是什么被传递给 zip.exe。可能只是将反斜杠放在正确的位置。
  • 这是您认为您正在传递的字符串,但您是否确认过,即通过将其输出到消息框或文本文件?它在我看来也好像网站正在修改它,你真的在​​路径的开头有三个反斜杠吗?

标签: c++ windows service backup share


【解决方案1】:

您可以使用 WNetAddConnection2 API 函数在服务本身内映射网络驱动器。

【讨论】:

    【解决方案2】:

    在某处创建指向 NAS 共享的符号链接:

    mklink /D c:\nas-backups \\192.168.x.x\Backups
    

    并将您的备份应用程序指向c:\nas-backups\etc

    【讨论】:

    • 这很棒。你能告诉我如何让它在 XP 和 2003 上运行吗?
    • 糟糕。抱歉,Vista/WS2008 引入了符号链接。它们在 XP 和 2003 上不可用。
    【解决方案3】:

    尝试在“看到”网络的用户下运行您的服务,例如“网络服务”用户,甚至是映射网络驱动器的“人类”用户。

    【讨论】:

      【解决方案4】:

      最简单的方法可能是访问网络路径

      string path = @"\\192.168.x.x\Backups\";
      

      您必须确保的另一件事是服务可以访问此路径。如果您的服务以无权访问的用户身份登录,您必须将服务的登录凭据更改为有权访问此路径的用户/域帐户。

      【讨论】:

      • 你有它向后 - 映射驱动器是每个会话,所以服务不能使用用户的映射驱动器。不过,服务可以使用 UNC 路径。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多