![远程共享文件夹的安全权限](https://linux22.com/image/553032/%E8%BF%9C%E7%A8%8B%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E5%AE%89%E5%85%A8%E6%9D%83%E9%99%90.png)
我有两台运行 Windows Server 2003 的服务器,我想使用在本地系统帐户下运行的 Windows 服务以编程方式将文件从一台服务器 (A) 复制到另一台服务器 (B) 上的共享文件夹。我一直收到“拒绝访问”错误,我不知道需要设置哪些安全设置才能打开共享文件夹进行写入。
这是我在接收端所做的:
- 在A上,右键单击要共享的文件夹,选择“共享”选项卡,然后选择“共享此文件夹”。设置共享名称。
- 单击“权限”,添加组“Everyone”并授予其完全控制权。
我尝试选择“安全”选项卡,以便在那里授予一些权限,但“添加”对话框只找到本地用户,尽管 B 出现在“工作组计算机”对话框中。经过进一步检查,“共享”选项卡下的“权限”对话框也是这种情况(它们是一样的吗?)。
更新:我做了进一步的研究,发现服务器 A 上的程序是在 SYSTEM 帐户下运行的。我不敢改变这一点,因为可能会破坏该程序所做的其他事情(它是我们 TeamCity CI 服务器上的构建代理)。
因此,我需要一种方法来授予 A\SYSTEM 在工作组环境中对 B 上的共享文件夹的写入权限。
更新 2:我现在可以对我的配置做以下更改:
- 每台服务器上都有一个名为 TeamCity 的用户帐户。它们具有相同的密码,并且都是各自管理员组的一部分(我已通过使用相同信息通过远程桌面登录两台服务器进行了验证)。
- TeamCity(特别是 \\B\TeamCity)对 B 上的共享文件夹拥有完全控制访问权限。
- A 上的构建代理在 \\A\TeamCity 帐户下运行。
这次尝试复制文件时,出现错误提示
找不到路径“\\B\Shared.Folder.Name”的一部分
当通过远程桌面登录 TeamCity 帐户时,我可以从错误消息中复制路径并将其粘贴到 Windows 资源管理器中的地址栏中,然后资源管理器导航到 B 上的共享文件夹。
答案1
- 在工作组中,没有中央用户存储库,因此您必须在每个工作站(或您的服务器上)手动复制帐户
- 在工作组中,本地系统以匿名身份访问网络。
您应该让服务以不同的帐户运行。在两台计算机上创建一个具有相同名称/密码的帐户,向服务帐户授予共享权限,并将服务设置为以此帐户而不是 LocalSystem 运行:开始 > 运行:services.msc 右键单击服务并转到属性。将登录名更改为您创建的用户帐户。
如果这不起作用,您可以将接收文件夹配置为接受来自匿名的写入,但不接受读取/执行。这将使文件夹像投递箱一样工作。
回答您关于“安全”和“共享”权限的问题,它们并不相同。安全是 NTFS 权限...即访问文件系统的权限。共享权限是通过网络访问该资源的权限。两者中限制最严格的权限获胜,因此如果您在安全设置中将所有人设置为完全控制,但在共享中将所有人设置为只读,则如果您在本地访问资源,您将获得完全控制权,但如果您尝试从另一台计算机使用它,则只能获得读取权限。
答案2
本地系统帐户无权访问网络资源。您需要让它运行一个可以使用合适凭据建立连接的进程,或者在另一个帐户下运行该服务,该帐户仍需要使用合适的凭据来访问远程资源。
答案3
您可能在域中。如果是这样,我建议您使用域帐户。如前所述,可以使用直通身份验证,但它仅适用于工作组,或者如果您的域管理员给您的内容确实受到限制(尽管这表明您正在执行网络管理员不支持的操作)。
您可以按照以下方法检查自己是否在域中。
- 点击开始。 右键点击我的电脑并点击特性
- 点击计算机名标签
- 您可以从此屏幕看出,但点击改变
- 看看成员是域或工作组。
如果是工作组,则使用已经提到的直通身份验证。(两台机器上的用户名/密码完全相同)
但是,如果它在域中,我建议您向域管理员索取一个可以在此处使用的服务帐户。不要使用您自己的帐户,因为密码更改等会导致您的服务中断。
在添加对话框中,有一个位置...按钮。单击该按钮并确保已选择您的域(如果您要沿域路径前进)。这样您就可以访问域用户。
在任何一种情况下(工作组或域),请更新您正在使用的 A 上的服务帐户,以便它使用该帐户,而不是使用本地系统。
仅向新帐户授予其所需的共享和安全选项卡权限(NTFS 权限)。我不会授予所有人对共享或 NTFS 的访问权限,因为这会将您的计算机开放给域中的任何人。
注意:有时使用 Everyone 组来删除测试期间的权限问题是可以的,但一定要严格执行最终配置。这应该只是暂时的。
更新:根据评论中的讨论,这里有一个基于我的工作配置的 TeamCity 配置示例。
<property name="source.root" value="D:\svn\trunk\admin"/>
<property name="staging.directory" value="\\B\Shared.Folder.Name"/>
<property name="directory.to.upload" value="${source.root}\ControlPanel"/>
<target name="network.deploy">
<echo message="-------- NETWORK.DEPLOY ---------------"/>
<copy todir="${staging.directory}" verbose="true">
<fileset basedir="${directory.to.upload}">
<include name="**/*"/>
<exclude name="**/*.vb"/>
</fileset>
</copy>
</target>
答案4
您应该能够通过在每个系统上创建相同的本地用户来做到这一点。完全相同的用户名,完全相同的密码。然后使用这些凭据运行您的服务。还要像以前一样设置 NTFS ACL,并为每个系统上的本地帐户授予访问权限,以及共享权限。