【问题标题】:Is there a way to allow a Windows service (unmanaged c++) to write files on a shared network folder?有没有办法允许 Windows 服务(非托管 c++)在共享网络文件夹上写入文件?
【发布时间】:2009-02-05 22:11:27
【问题描述】:

我尝试在“本地系统”中运行该服务:没有用。

我尝试在对网络共享文件夹具有权限的帐户中运行该服务:没有用。

我是否必须为此创建一个独立的应用程序并以对网络共享文件夹具有权限的用户身份启动该应用程序?

谢谢,

网卡

【问题讨论】:

  • 您是否尝试使用映射驱动器或使用 UNC 名称访问共享文件夹?映射驱动器经常失败,因为服务不在驱动器被映射的登录上下文下运行。 UNC 名称是正确的选择。

标签: c++ windows service networking


【解决方案1】:

您应该使用 UNC 路径(如 Scott 建议的那样),并在可以访问网络资源的显式帐户下运行系统;应该可以的。

可能在 LocalSystem 下不起作用,因为这是 Windows 中的一个特殊用户帐户,只能访问本地系统。 LocalSystem 在 NT4 中没有网络访问权限,在 2000+ 中它被视为用于网络访问目的的计算机帐户,并受到本地安全策略中的访问限制。请参阅this page 了解更多信息。

简短回答:使用显式帐户运行有权访问 UNC 路径的服务。 :)

【讨论】:

  • 我认为您对本地系统帐户网络访问有误。在我的回答中查看我的更新。
【解决方案2】:

您的两种方案都应该有效。 “本地系统”是您可以授予共享权限的活动目录中的计算机帐户。我不知道为什么它不适合你。但这是你可以做的。

  • 使用普通帐户(更简单)。
  • 将您的应用程序作为控制台应用程序进行测试。
  • 调整客户端上的审核以将所有内容记录到安全日志中。它是从本地安全策略应用程序中完成的。并在服务器上做同样的事情(如果可以的话)。

这应该足以定位问题。

更新 1:回应我认为错误的评论(但也许我是……)。评论所指的服务(没有网络访问权限的服务)称为本地服务帐户( NT AUTHORITY\LocalService )。它通常用于应用程序池的标识,但可以用于服务。它与本地系统帐户不同。

from msdn:

当服务在 计算机上的 LocalSystem 帐户 是域成员,服务有 授予任何网络访问权限 计算机帐户,或任何组 其中计算机帐户是 会员。

【讨论】:

  • 实际上,它通常不适用于 LocalSystem。 Windows 会从 LocalSystem 令牌中剥离网络权限,以防止网络访问作为安全措施。 LocalSystem 也不是 AD 中的真实帐户。
  • 你可能是对的;这可能已随 Windows 版本而改变。在 NT4 中,LocalSystem 没有网络访问权限,但那是在帐户拆分之前。我不确定默认访问权限是什么,但在 2000 年以上看起来确实可行。
【解决方案3】:

您可能可以使用模拟来获取所需的凭据: http://msdn.microsoft.com/en-us/library/aa376391(VS.85).aspx

【讨论】:

    【解决方案4】:

    在拥有网络共享文件夹权限的帐户中运行服务确实有效。我有一项服务可以做到这一点。

    它不一定适用于 Novell Netware 共享或其他“非标准”共享(过去我们在这方面遇到过麻烦,但现在 Netware 几乎无关紧要。)

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多