Windows 服务无法访问“Windows XP Home”家庭网络上的文件

Windows 服务无法访问“Windows XP Home”家庭网络上的文件

注意:我能够通过使用另一台 WinXp 计算机而不是插入路由器的 USB 驱动器来重现我的问题。完全相同的问题。因此,最重要的是,如果我手动执行此操作,我可以通过网络访问(和修改)文件,但我的 Windows 服务在尝试执行相同操作时会失败。如果我通过 Visual Studio 运行该程序,它可以正常工作。如果我将完全相同的代码作为 Windows 服务运行,它会失败。

我创建了一个需要访问常见网络位置的 Windows 服务。为了在家测试它,我将一个 USB 驱动器插入我的 Netgear N600 WNDR3400 路由器。USB 存储设置显示工作组名称为 Workgroup,文件路径为:

\\readyshare\USB_存储

该服务无法访问该网络文件夹中的文件。根据我的尝试,我收到一条错误消息,提示找不到该文件或权限被拒绝。(该文件确实存在。)但是,我可以直接从我的笔记本电脑(Win8)访问/修改这些文件,也可以在我妻子的笔记本电脑(WinXP)上执行相同的操作。该服务以用户身份运行Local System

我尝试过以 、 和 的形式运行Network Service.\administrator.\JaneDoe都失败了。

我还尝试更改 newtwork 文件夹的权限,但没有成功。例如,如果我尝试授予Everyone完全控制权:

在此处输入图片描述

我点击“应用”后它就恢复到之前的状态:

在此处输入图片描述

我也尝试添加新用户(参见上面的添加按钮),但随后出现此错误:

在此处输入图片描述

有什么想法可以让我做到这一点吗?我只是希望我的服务能够对该网络上的文件夹具有读/写(甚至是完全的,我不关心)访问权限。

编辑-我使用了进程监视器,并且正如预期的那样,出现了以下错误:

在此处输入图片描述

更多失败的尝试

  • 使用不同的 USB 驱动器
  • 在 XP 上禁用 Windows 防火墙
  • 不要使用 UNC 路径,而要使用映射驱动器

编辑-访问网络文件的代码 注意:找不到该文件(即使它存在)。

private UpdaterManifest GetUpdaterManifest()
{
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest");

    if (!File.Exists(filePathAndName))
    {
        // Always hit here
    }
}

答案1

所以你想访问一个共享通过网络的 XP Home 机器,其中客户端作为 Windows XP Home 或 Windows 8 上的服务运行?!

这涉及很多方面,你需要了解全部没错。假设您的服务以SYSTEM(又名LocalSystem) 的身份运行,您必须确保以下几点:

  1. 共享本身需要具有正确的权限(Everyone需要设置适当的 ACL)-这是 Windows XP Home 的一个问题,因为它缺少安全编辑器(另一方面,这意味着在正常情况下,你甚至不能首先弄乱权限,默认设置可能会起作用)...似乎有一个 XP Home 特定工具可以分配共享权限。您可以将其作为shrpubw(大概是“共享...向导”?)执行。请参阅此链接
  2. 您共享的文件夹需要适当的权限Everyone。-你可以这样做cacls命令行上
  3. 以我的经验来看,最重要的是正确设置计算机策略。不幸的是,这正是您在 XP Home 中遇到的问题,因为 MS 故意削弱了该 Windows 版本的功能。
    • 影响这一点的一项政策设置是“网络访问:可以匿名访问的共享”HKLM\System\CurrentControlSet\Services\LanmanServer\Parameters- 我认为您可以通过操作值NullSessionShares( )在注册表中手动设置 REG_MULTI_SZ...这是一个由多个值组成的值。它将regedit以多行形式出现。一行添加共享的名称。例如,如果您的共享来自\\readyshare\USB_Storage客户端,则共享名称为USB_Storage。之后运行net stop lanmanservernet start lanmanserver此服务在计算机管理/MMC 下调用Server)...
    • 影响它的另一项政策是“网络访问:让每个人的权限适用于匿名用户”- 我对这个不是 100% 确定,但我认为它与HKLM\SYSTEM\CurrentControlSet\Control\LSA值的设置相关RestrictAnonymousREG_DWORD参见此知识库文章) 需要有值0(但默认为1)。我不确定您是否可以通过此设置避免重新启动。

还有一件事,很可能缺少了另一个要素。但这对我运行的某个软件有用,该软件需要设置这一点才能使其 LAN 中的更新机制正常工作。


感谢聊天工具,我们以交互方式解决了这个问题。使用shrpubw(在对上面第一点的编辑中提到)可以达到以下效果。

从开始菜单中选择“运行”

...输入shrpubw并按ENTER。

运行对话框

立即继续向导中的下一步

...跳过这个:

步骤 1 shrpubw

指向要共享的正确文件夹并命名共享

像这样:

第2步

...并继续“下一步”

下一步权限选择“自定义”

这里:

步骤3

...单击“自定义”按钮后,您将看到以下内容:

安全编辑器

...现在确保根据需要调整权限。通常要调整的是“Everyone”实体。在 XP Home 上,它应该暗示“ANONYMOUS LOGON”,这受此答案第一部分(第 3 点)中指出的设置的影响。

保存权限并进入下一步。

完成向导

... 像这样:

最后一步

...或者在单击按钮之前选中复选框以重新开始添加另一个共享。

笔记:上述策略设置很可能也会影响这一点(第 3 点)。因此,这一步在“服务器”(即提供共享的机器)上可能仍是必要的。

相关内容