如何向一组用户授予对所有 TFS 团队项目的只读访问权限?

How to Grant Read-Only Access to All TFS Team Projects to a Group of Users?

提问人:John Saunders 提问时间:11/1/2011 最后编辑:CommunityJohn Saunders 更新时间:9/7/2016 访问量:11666

问:

我从如何将 Windows 组作为“读者”添加到 TFS 2010 集合中的所有项目?的答案中看到,必须为所有现有项目手动完成此操作。

是否有可用于执行此操作的命令行工具?我知道 TfsSecurity 程序,但我尝试为单个团队项目执行此操作没有奏效。


我为一个团队项目做了什么:

  1. 我将“[DefaultCollection]\All Project Read-Only Users”创建为包含单个 Active Directory 组作为成员的集合级别组。
  2. 然后,我尝试为该组添加对项目的读取访问权限:

tfssecurity /collection:http://tfs:8080/tfs/defaultcollection /a+ 项目 vstfs:///Classification/TeamProject/guid GENERIC_READ“[DefaultCollection]\All 项目只读用户”允许

这确实将该组的 ACL 添加到团队项目中,但该组未显示在团队项目的“安全性”对话框中。

我想做的是为该组提供与团队项目的“读者”组相同的访问权限。

安全 TFS

评论

0赞 Nick Nieslanik 11/2/2011
您是否考虑过在 PowerShell 中编写脚本?blog.myrobertson.com/2011/05/......

答:

9赞 Nick Nieslanik 11/2/2011 #1

下面是一个 powershell 脚本,用于循环访问集合中的每个团队项目,获取“读者”组并添加 SID。

# load the required dll
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")

function get-tfs
{
    param(
    [string] $serverName = $(throw 'serverName is required')
    )

    $propertiesToAdd = (
        ('VCS', 'Microsoft.TeamFoundation.VersionControl.Client', 'Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer'),
        ('WIT', 'Microsoft.TeamFoundation.WorkItemTracking.Client', 'Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore'),
        ('CSS', 'Microsoft.TeamFoundation', 'Microsoft.TeamFoundation.Server.ICommonStructureService'),
        ('GSS', 'Microsoft.TeamFoundation', 'Microsoft.TeamFoundation.Server.IGroupSecurityService')
    )

    [psobject] $tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($serverName)
    foreach ($entry in $propertiesToAdd) {
        $scriptBlock = '
            [System.Reflection.Assembly]::LoadWithPartialName("{0}") > $null
            $this.GetService([{1}])
        ' -f $entry[1],$entry[2]
        $tfs | add-member scriptproperty $entry[0] $ExecutionContext.InvokeCommand.NewScriptBlock($scriptBlock)
    }
    return $tfs
}
#set the TFS server url
[psobject] $tfs = get-tfs -serverName http://YourTfsServer:8080/tfs/YourColleciton


$items = $tfs.vcs.GetAllTeamProjects( 'True' )
    $items | foreach-object -process { 
    $proj = $_
    $readers = $tfs.GSS.ListApplicationGroups($proj.Name) | ?{$_.DisplayName -eq 'Readers' }

    $tfs.GSS.AddMemberToApplicationGroup($readers.Sid, 'TheSidToTheGroupYouWantToAdd')
}
6赞 Gustavo Russo 9/7/2016 #2

我的方法基于这样一个事实,即除非显式拒绝,否则 TFS 权限是继承的。

若要创建一个用户组,该用户组将自动以只读权限访问所有现有项目以及未来的项目,请执行以下步骤:

  1. 在项目集合级别创建新的安全组。可以在 Visual Studio 中使用“团队/团队项目集合设置/组成员身份”菜单执行此操作。

  2. 将新组添加为“项目集合管理员”组的成员。这将授予对集合中所有项目的访问权限,包括期货项目。

  3. 限制新组的权限以删除继承的管理员权限。若要强制只读访问,请拒绝除“创建工作区”、“查看生成资源”和“查看集合级别信息”之外的所有权限。

此组的用户将具有对集合中所有项目的源代码、工作项和生成定义的读取访问权限。

评论

0赞 Sir Swears-a-lot 6/2/2017
我刚刚尝试过这个,但无法让它为我工作。不知道我做错了什么。
0赞 MBender 6/23/2017
@Peter我刚刚在TFS 2017上尝试过这个,它有效。在不知道你尝试了什么的情况下,我不可能告诉你为什么它不起作用。严格按照步骤操作?有趣的是,已经有一个组具有“只读”访问权限(有效用户),但该组本身是“只读”的。通过执行这些步骤,您基本上可以创建一个可修改的“有效用户”组。
0赞 fkucuk 1/9/2020
@Gustavo,我刚刚尝试过,但这种方法为该用户提供了管理员权限,即使我否认除您提到的权限之外的所有权限。(Azure DevOps Server 2019)