我有两台运行Windows Server 2003的服务器,我希望从一台服务器(A)以编程方式将在本地系统帐户下运行的Windows服务复制到另一台服务器上的共享文件夹(B)。 我不断得到“访问被拒绝”的错误,我无法弄清楚我需要设置什么样的安全设置来打开共享文件夹进行写入。
这是我在接收结束时所做的:
我尝试select“安全性”选项卡以提供一些权限,但“添加”对话框只能find本地用户,尽pipeB出现在“工作组计算机”对话框中。 进一步检查之后,“共享”选项卡下的“权限”对话框也是如此(它们是相同的吗?)。
更新:我做了一些进一步的研究,发现服务器A上的程序在SYSTEM帐户下运行。 这是我不敢改变的,因为冒着破坏这个程序也做的其他事情的风险(这是我们TeamCity CI服务器上的一个构build代理)。
因此,我需要一种方法让A \ SYSTEM访问权限写在工作组环境中的B上的共享文件夹中。
更新2:我现在已经能够对我的configuration进行以下更改:
这次我尝试复制文件时,出现一个错误提示
找不到部分path'\\ B \ Shared.Folder.Name'
当通过远程桌面login到TeamCity帐户时,我可以从错误消息中复制path并将其粘贴到Windows资源pipe理器的地址栏中,然后浏览器导航到B上的共享文件夹。
您应该将该服务作为其他帐户运行。 在两台计算机上创build一个具有相同名称/密码的帐户,向服务帐户授予共享权限,并将该服务设置为以LocalSystem身份运行:start> run:services.msc右键单击该服务并转至属性。 将login更改为您创build的用户帐户。
如果这不起作用,您可以将接收文件夹configuration为接受来自匿名的写入,但不能读取/执行。 这将使文件夹像一个下拉框。
要回答你关于“安全”和“分享”权限的问题,不,他们是不一样的。 安全性是NTFS权限…这是访问文件系统的权限。 共享权限是通过networking访问资源的权限。 如果您在安全设置中将“每个人都设置为完全控制”,而“每个人只能在共享中只读”,则您将在本地访问资源时获得完全控制权限,但只有在您尝试从另一台电脑。
本地系统帐户没有权限访问networking资源。 您将需要运行一个可以使用合适凭证进行连接的进程,或者在另一个帐户下运行该服务,这仍然需要使用合适的凭据来访问远程资源。
你很可能在一个域名。 我会build议使用域帐户,如果你是。 如前所述,传递身份validation是可能的,但仅适用于工作组,或者如果您的域pipe理员会给您提供什么限制(虽然这表明您正在为networkingpipe理员赢得一些东西, t支持)。
以下是如何检查您是否在域上的方法。
如果是Workgroup,则使用已提到的传递身份validation。 (在两台机器上完全相同的用户名/密码)
但是,如果它位于某个域中,我build议您向域pipe理员咨询您可以在此处使用的服务帐户。 不要使用自己的帐户,因为密码更改,这将导致您的服务中断。
在添加对话框中,有一个位置…button。 点击它,并确保您的域名被选中(如果你正在往下走的话)。 这将让您访问域用户。
在任何情况下(工作组或域名),更新您使用的A上的服务帐户,以便使用该帐户,而不是使用本地系统。
授予新帐户只有共享和安全选项卡(NTFS权限)所需的权限。 我不会授予每个人访问共享或NTFS的权限,因为这会将您的计算机向域中的任何人开放。
注意:有时在testing过程中使用Everyone组来testing是否可以删除权限,但是一定要收紧最终configuration。 这应该是暂时的。
更新:基于评论中的讨论,这里是一个基于我的工作configuration的TeamCityconfiguration的例子。
<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>
您应该可以通过在每个系统上创build相同的本地用户来完成此操作。 完全相同的用户名,完全相同的密码。 然后使用这些凭据运行您的服务。 还要像以前一样设置NTFS ACL,并在每个系统访问权限以及共享权限上提供本地帐户。