C# 以编程方式获取TFS用户';s文件夹权限
我正在尝试获取用户对文件夹的访问权限以及对该文件夹的权限列表。 尝试执行类似于TFS命令的操作: TF权限“$MyRepository/MyFolder”/r 到目前为止,我能够获得用户列表、所有子文件夹列表,然后查询每个用户的所有子文件夹的权限,并检查“签入或合并”。这是我的工作代码:C# 以编程方式获取TFS用户';s文件夹权限,c#,tfs,tfs-sdk,C#,Tfs,Tfs Sdk,我正在尝试获取用户对文件夹的访问权限以及对该文件夹的权限列表。 尝试执行类似于TFS命令的操作: TF权限“$MyRepository/MyFolder”/r 到目前为止,我能够获得用户列表、所有子文件夹列表,然后查询每个用户的所有子文件夹的权限,并检查“签入或合并”。这是我的工作代码: string TfsRepository = "$/Some/Base/Repository"; TeamFoundationServer tfs = TeamFoundationServerFactory.G
string TfsRepository = "$/Some/Base/Repository";
TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer("https://tfs.myserver.net/tfs/DefaultCollection");
VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
ItemSet items;
var identityManagementService = tfs.GetService<IIdentityManagementService>();
var collectionWideValidUsers = identityManagementService.ReadIdentity(IdentitySearchFactor.DisplayName,
"Project Collection Valid Users",
MembershipQuery.Expanded,
ReadIdentityOptions.None);
Console.WriteLine("Please wait while retrieving necessary information from {0}:", TfsRepository);
var validMembers = identityManagementService.ReadIdentities(collectionWideValidUsers.Members,
MembershipQuery.Expanded,
ReadIdentityOptions.ExtendedProperties);
var memberNames = validMembers
.Where(_ => !_.IsContainer && _.Descriptor.IdentityType != "Microsoft.TeamFoundation.UnauthenticatedIdentity")
.Select(_ => _.UniqueName)
.OrderBy(_ => _)
.ToList();
string[] permissions;
bool UserCheck = false;
if (memberNames != null && items != null)
{
foreach (var userName in memberNames)
{
Console.WriteLine("Querying User: {0}\n", userName);
for (int i = 0; i >= items.Items.Length; i++)
{
if (items.Items[i].ItemType == ItemType.Folder)
{
string TfsRepositoryDir = items.Items[i].ServerItem;
Console.WriteLine(" Checking:{0}", TfsRepositoryDir);
permissions = vcs.GetEffectivePermissions(userName, TfsRepositoryDir);
if (permissions != null && permissions.Length > 0)
{
foreach (string perm in permissions)
{
if (perm.ToLower() == "checkin" || perm.ToLower() == "merge")
UserCheck = true;
}
if (UserCheck)
{
string.Join(", ", permissions);
Console.Write("User: {0}: Repo: {1}: Permissions:{2} \n ", userName, TfsRepositoryDir, string.Join(", ", permissions));
UserCheck = false;
}
}
}
}
}
}
string TfsRepository=“$/Some/Base/Repository”;
TeamFoundationServer tfs=TeamFoundationServerFactory.GetServer(“https://tfs.myserver.net/tfs/DefaultCollection");
VersionControlServer vcs=(VersionControlServer)tfs.GetService(typeof(VersionControlServer));
项目集项目;
var identityManagementService=tfs.GetService();
var collectionWideValidUsers=identityManagementService.ReadIdentity(IdentitySearchFactor.DisplayName,
“项目集合有效用户”,
MembershipQuery.Expanded,
ReadIdentityOptions.None);
WriteLine(“正在从{0}检索必要的信息,请稍候:”,TfsRepository);
var validMembers=identityManagementService.ReadIdentifications(collectionWideValidUsers.Members,
MembershipQuery.Expanded,
ReadIdentityOptions.ExtendedProperties);
var memberNames=validMembers
.Where(=>!.IsContainer&&&&.Descriptor.IdentityType!=“Microsoft.TeamFoundation.UnauthenticatedIdentity”)
.Select(=>queName)
.OrderBy(=>41;
.ToList();
字符串[]权限;
bool UserCheck=false;
if(memberNames!=null&&items!=null)
{
foreach(memberNames中的var用户名)
{
WriteLine(“查询用户:{0}\n”,用户名);
对于(int i=0;i>=items.items.Length;i++)
{
if(items.items[i].ItemType==ItemType.Folder)
{
字符串TfsRepositoryDir=items.items[i].ServerItem;
WriteLine(“检查:{0}”,TfsRepositoryDir);
权限=vcs.GetEffectivePermissions(用户名,TfsRepositoryDir);
if(权限!=null&&permissions.Length>0)
{
foreach(权限中的字符串perm)
{
if(perm.ToLower()=“签入”| | perm.ToLower()=“合并”)
UserCheck=true;
}
如果(用户检查)
{
string.Join(“,”,权限);
Write(“用户:{0}:Repo:{1}:Permissions:{2}\n”,用户名,TfsRepositoryDir,string.Join(“,”,Permissions));
UserCheck=false;
}
}
}
}
}
}
但您可能已经猜到,这将需要很长时间,因为用户数量少于我们存储库中的文件夹。因此,查询每个文件夹以获取用户权限需要花费大量时间
问题:我正在寻找一种方法,用于查询每个用户的特定文件夹权限。e、 g我想查询用户“Ahmed”有多少文件夹可供签入和合并。如何实现这一点?下面是一个简单的脚本,它可以快速获取所有用户的所有路径特定权限。根据需要修改。您所缺少的技巧是,不仅递归地提取权限,而且还提取将权限应用于谁 如果您只需要特定用户的权限,则可以使用
使用Microsoft.TeamFoundation.Client;
使用Microsoft.TeamFoundation.VersionControl.Client;
使用系统配置;
void Main()
{
字符串TfsRepository=ConfigurationManager.AppSettings[“TFS_存储库”];
字符串TfsUri=ConfigurationManager.AppSettings[“TFS_URI”];
TfsTeamProjectCollection ttpc=新的TfsTeamProjectCollection(新Uri(TfsUri));
ttpc.确保重新验证();
var数据=ttpc
.GetService()
.GetPermissions(新字符串[]{TfsRepository},RecursionType.Full)
.SelectMany(rr=>rr.Entries.Select(itm=>new{itm,rr.ServerItem}))
.Where(rr=>rr.itm.Allow.Length!=0)
.Select(rr=>new{
User=rr.itm.IdentityName,
Path=rr.ServerItem,
权限=String.Join(“,”,rr.itm.Allow)
})
.OrderBy(itm=>itm.User).ThenBy(itm=>itm.Path);
}
所以当前代码的唯一错误是花费的时间太长?您将TFS文件夹作为参数传入,然后系统中的每个用户都希望看到他们对该文件夹和所有子文件夹的权限?您的用户群是否跨越多个团队项目或团队项目集合?@MichaelPerrenoud。是的,这是主要问题。@baultista。是的,这是要求。我只处理一个项目,但这两种情况可能都是这样。我的新脚本解决了你的问题吗?
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using System.Configuration;
void Main()
{
string TfsRepository = ConfigurationManager.AppSettings["TFS_Repository"];
string TfsUri = ConfigurationManager.AppSettings["TFS_URI"];
TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri(TfsUri));
ttpc.EnsureAuthenticated();
var data = ttpc
.GetService<VersionControlServer>()
.GetPermissions(new string[] { TfsRepository }, RecursionType.Full)
.SelectMany(rr => rr.Entries.Select(itm => new { itm, rr.ServerItem }))
.Where(rr=>rr.itm.Allow.Length != 0)
.Select(rr => new {
User = rr.itm.IdentityName,
Path = rr.ServerItem,
Permissions = String.Join(",", rr.itm.Allow)
})
.OrderBy(itm=>itm.User).ThenBy(itm=>itm.Path);
}