【问题标题】:TFS API to create a TFS Group and set permissions?TFS API 创建 TFS 组并设置权限?
【发布时间】:2016-04-10 23:31:20
【问题描述】:

您好,我正在尝试使用 TFS API 创建一个新组,为此我有以下代码:

var teamProjects = this.VersionControlServer.GetAllTeamProjects(false);
foreach (var teamProject in teamProjects)
{
     var result = _gss.CreateApplicationGroup(teamProject.ArtifactUri.AbsoluteUri, "NewGroup","TestDescription");

     //NOW I WANT TO SET THE PERMISSIONS FOR THIS GROUP
}

由于我需要为这个组设置“编辑项目级信息”权限,我尝试了很多方法和不同的方法,但似乎任何东西都可以解决我的需求。例如:

var ProjectSecurityToken = AuthorizationSecurityConstants.ProjectSecurityPrefix + teamProject.ArtifactUri.AbsoluteUri;
var groupACL = securityNamespace.QueryAccessControlList(ProjectSecurityToken, new[] {list[4].Descriptor}, false);

securityNamespace.SetAccessControlEntry(ProjectSecurityToken, new Microsoft.TeamFoundation.Framework.Client.AccessControlEntry(list[4].Descriptor, 115, 0), true);

我硬编码了“list[4]”,因为它是我刚刚创建的组,我需要一些帮助来查看我的代码中有什么问题。我没有收到错误消息,它也不起作用。

【问题讨论】:

  • 在我看来,TFSSecurity 命令行比 TFS API 更容易为服务器级、集合级或项目级组中的用户或组添加权限。您可以考虑使用 TFSSecurity 命令行:msdn.microsoft.com/Library/vs/alm/TFS/administer/command-line/…
  • TFSSecurity 工作正常!但是 API 方法要好一些。我正在寻找一种拒绝项目管理员自定义工作项的方法,有什么方法可以做到吗?

标签: api tfs


【解决方案1】:

我可以通过以下代码设置权限:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.Framework.Client;

namespace API
{
    class Program
    {
        static void Main(string[] args)
        {
            string project = "http://xxx.xxx.xxx.xxx:8080/tfs";
            TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri(project));
            var tps = tpc.GetService<VersionControlServer>();
            var ttt = tps.GetTeamProject("ProjectName");
            ISecurityService securityService = tpc.GetService<ISecurityService>();
            System.Collections.ObjectModel.ReadOnlyCollection<SecurityNamespace> securityNamespaces = securityService.GetSecurityNamespaces();
            IGroupSecurityService gss = tpc.GetService<IGroupSecurityService>();
            Identity SIDS = gss.ReadIdentity(SearchFactor.AccountName, "GroupName", QueryMembership.Expanded);//GourName format: [ProjectName]\\GourpName
            IdentityDescriptor id = new IdentityDescriptor("Microsoft.TeamFoundation.Identity", SIDS.Sid);
            List<SecurityNamespace> securityList = securityNamespaces.ToList<SecurityNamespace>();
            string securityToken;
            foreach (SecurityNamespace sn in securityList)
            {
                if (sn.Description.DisplayName == "Project")
                {
                    securityToken = "$PROJECT:" + ttt.ArtifactUri.AbsoluteUri;
                    sn.SetPermissions(securityToken, id, 115, 0, true);
                }
            }                
        }
    }
}

【讨论】:

  • 它按预期工作!惊人的!我直接使用枚举器而不是整数: sn.SetPermissions(securityToken, id, 0, TeamProjectPermissions.AllPermissions, true);有没有办法设置“创建标签定义”?这是唯一没有使用此代码设置的权限。
  • @Fabito 查看此链接:roadtoalm.com/2014/07/28/…
  • 似乎在链接中说要使用命名空间“标记”,但它不存在,而且我在 MSDN 或某些 Microsoft 网站中也没有找到任何参考。 :(
  • 知道如何使用控制台应用程序中的 API 设置区域级权限而不是项目级权限?所有发布的博客/答案,经过几天的研究后我设法遇到,指的是区域级权限已过时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多