使用TFS对象模型时,可以使用VersionControlServer.SetPermissions方法设置项目级ACL。此方法采用PermissionChange继承的SecurityChange对象数组。 PermissionChange类接受允许权限,拒绝权限和删除的字符串数组(以便将某个权限重置为取消设置)。然后可以使用VersionControlServer.GetPermissions方法查看这些项级权限。
使用VersionControlServer.SetPermissions方法设置项目级别权限时,会创建一个新的权限对象,并将ServerItem设置为该项目的服务器路径。权限对象具有Entries属性,该属性包含在源代码管理中项目上方定义的每个用户或组的条目,即使该用户或组的所有权限都是继承的。此外,即使重置先前在项目上设置的权限,权限对象仍保留在服务器上,即使它不包含任何未继承的条目。
简而言之,似乎随着时间的推移,这些权限对象的大小正在严格增加。由于返回了大量信息(例如,在分支级别),这些方法的性能开始受到影响,并且我不知道任何类型的RemovePermissions方法来清理它们。这样的事情存在吗?如何永久删除这些项目,以便项目只是透明地继承其ACL而不在服务器上定义这些混乱对象?
答案 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命名空间(版本控制的服务器,而不是客户端)中找到答案。
在查看文档后我找不到这样的功能。