0

使用 TFS 对象模型时,可以使用 VersionControlServer.SetPermissions 方法设置项级 ACL。此方法采用 PermissionChange 继承的 SecurityChange 对象数组。PermissionChange 类为 Allow 权限、Deny 权限和 Removes 获取字符串数组(以便将某个权限重置为未设置)。然后可以使用 VersionControlServer.GetPermissions 方法查看这些项目级权限。

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

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

4

2 回答 2

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);
}

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

于 2012-04-29T20:33:20.950 回答
-1

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

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

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

于 2012-04-27T09:35:49.377 回答