问题描述
我们在 Azure DevOps 服务中有一个连接到 Azure AD 的组织。在 AAD 中有代表企业中每个团队的组。目标是将这些现有的 AAD 组连接到 Azure DevOps 中的团队(即将这些组添加为团队成员),从而在 AAD 中专门管理成员资格。
这意味着任何人都不能更改团队的成员资格(应该为项目管理员及以上级别保留)。
但是,当有人成为团队管理员时,他们会自动获得更改团队成员资格的权利,非团队管理员的人无法编辑团队设置,例如添加迭代或自定义看板(看板中的齿轮)。 如何分离这些权限,即允许用户进行团队级别的配置,而不允许管理团队成员?
即使无法在 GUI 中实现对 ACL's are set directly through the rest api 感兴趣的解决方案。我对 Security Namespaces 进行了一些挖掘,发现通过设置团队中用户的 ManageMembership
命名空间的 Identity
位使该用户成为团队的管理员(在图形用户界面)。用户可以进行团队级别的自定义并(如权限位的名称所示)更新团队的成员资格。
我找不到允许在不授予团队成员管理权限的情况下进行团队级别自定义的权限。
到目前为止我尝试了什么
不是团队管理员会产生消息
您没有足够的权限为此配置卡片 团队。您必须是团队管理员或项目 管理员。
通过 GUI 或通过设置团队上的 Manage Membership
位将用户添加为团队管理员会删除消息,但也会授予我不想要的添加和删除成员的权限
# Input Parameters
$ado_org="TestOragnization" ## Azure devops Organization
$ado_pat="****************************************************" ## Azure devops PAT Token
$projectName = "TestProject" ## Azure devops Project Name
$teamName = "TestTeam" ## Azure devops Team Name (must exist in Project)
$userName = "[email protected]" ## Azure devops user (must exist in organization)
# Construct PAT authentication header
# https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "user",$ado_pat)))
$headers = @{"Authorization" = ("Basic {0}" -f $base64AuthInfo)
}
# Get Project (https://docs.microsoft.com/en-us/rest/api/azure/devops/core/projects/get?)
$project = Invoke-RestMethod -Headers $headers `
-Uri ("https://dev.azure.com/{0}/_apis/projects/{1}?api-version=6.0" -f $ado_org,$projectName) `
# Get Team (https://docs.microsoft.com/en-us/rest/api/azure/devops/core/teams/create)
$team = Invoke-RestMethod -Headers $headers `
-Uri ("https://dev.azure.com/{0}/_apis/projects/{1}/teams/{2}?api-version=6.0" `
-f $ado_org,$projectName,$teamName) `
# Get User (https://docs.microsoft.com/en-us/rest/api/azure/devops/ims/identities/read%20identities)
$user = Invoke-RestMethod -Headers $headers -Method GET -ContentType "application/json" `
-Uri ("https://vssps.dev.azure.com/{0}/_apis/identities?searchFilter=General&filterValue={1}&api-version=6.0" `
-f $ado_org,$userName)
# Construct ACL request
$token = "{0}\{1}" -f $project.id,$team.id
$namespace = "5a27515b-ccd7-42c9-84f1-54c998f03866" # Identity namespace
$allowbits = 8 # Manage Membership bit
$body = @{
"token" = $token;
"merge" = $false;
"accessControlEntries" = @(
@{
"descriptor" = $user.value.descriptor
"allow" = $allowbits;
"deny" = 0;
"extendedinfo" = @{};
};
)
}
# Set ACL
# https://docs.microsoft.com/en-us/rest/api/azure/devops/security/access%20control%20entries
Invoke-RestMethod -Headers $headers -Method POST -ContentType "application/json" `
-Uri ("https://dev.azure.com/{0}/_apis/accesscontrolentries/{1}?api-version=6.0" -f $ado_org,$namespace) `
-Body $(ConvertTo-Json -InputObject $body -depth 10)
解决方法
正如 the document 所提到的,
要配置团队设置,您必须被添加到团队管理员角色或成为项目管理员安全组的成员。
我们没有其他方法可以单独授予用户配置团队设置的权限。
同样,要将用户添加到团队,您必须是团队管理员或项目管理员。我们也没有其他方法可以单独授予用户此权限。有关详细信息,请参阅“Add users to a project or team”。
因此,一旦将用户添加为团队管理员或项目管理员的成员,他就可以将用户添加到团队并配置团队设置。我们没有办法将这些权限与管理员用户分开。