TFS:是否可以从版本控制中删除项目权限对象?

时间:2012-04-26 23:48:14

标签: security tfs permissions tfs2010 acl

使用TFS对象模型时,可以使用VersionControlServer.SetPermissions方法设置项目级ACL。此方法采用PermissionChange继承的SecurityChange对象数组。 PermissionChange类接受允许权限,拒绝权限和删除的字符串数组(以便将某个权限重置为取消设置)。然后可以使用VersionControlServer.GetPermissions方法查看这些项级权限。

使用VersionControlServer.SetPermissions方法设置项目级别权限时,会创建一个新的权限对象,并将ServerItem设置为该项目的服务器路径。权限对象具有Entries属性,该属性包含在源代码管理中项目上方定义的每个用户或组的条目,即使该用户或组的所有权限都是继承的。此外,即使重置先前在项目上设置的权限,权限对象仍保留在服务器上,即使它不包含任何未继承的条目。

简而言之,似乎随着时间的推移,这些权限对象的大小正在严格增加。由于返回了大量信息(例如,在分支级别),这些方法的性能开始受到影响,并且我不知道任何类型的RemovePermissions方法来清理它们。这样的事情存在吗?如何永久删除这些项目,以便项目只是透明地继承其ACL而不在服务器上定义这些混乱对象?

2 个答案:

答案 0 :(得分:1)

2010年,TFS推出了一项新的安全服务,该服务管理产品中的所有权限。每个权限组都被分解为安全命名空间。您可以使用公开此功能的新服务实现您想要的功能。我没有在下面测试过这段代码,但它应该让你接近。

首先,添加以下引用:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.VersionControl.Common;

然后运行此代码:

// Somehow define which paths you want to delete security on.
string[] pathsToDeleteSecurityOn = new string[0];

TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://your-server:8080/tfs/your-collection"));
ISecurityService securityService = tpc.GetService<ISecurityService>();

// Get the version control security namespace
SecurityNamespace vcSecurity = securityService.GetSecurityNamespace(SecurityConstants.RepositorySecurityNamespaceGuid);

// Delete the ACLs on each path
foreach (string path in pathsToDeleteSecurityOn)
{
    vcSecurity.RemoveAccessControlLists(path, false);
}

如果您遇到任何问题,请告诉我。

答案 1 :(得分:-1)

看起来你想做的事情是不可能的。最好的方法是联系Buck Hodges并直接问他。

如果可能,您可以在Microsoft.TeamFoundation.VersionControl.Server命名空间(版本控制的服务器,而不是客户端)中找到答案。

在查看文档后我找不到这样的功能。