我编写了一些代码,使用各种参数调用
az devops security permission list
来提取我感兴趣的各个用户的权限,这样我们就可以报告谁拥有特定项目的特权访问权限。其要点是:
$myId = '[email protected]'
$myOrg = 'https://dev.azure.com/example/'
$myProjectId = 'd1d6f447-cd58-431d-ad22-ee7d6579f6b3'
$projectNamespaceId = '52d39943-cb85-4d7f-8fa8-c6baac873819' # per https://learn.microsoft.com/azure/devops/organizations/security/namespace-reference?view=azure-devops#project-level-namespaces-and-permissions
az devops security permission list --org $myOrg --id $projectNamespaceId --subject $myId |
ConvertFrom-Json |
Select-Object token, @{N='EffectiveAllow'; E={
$dict = $_
$dict.acesDictionary |
Get-Member -type NoteProperty |
ForEach-Object {
$dict.acesDictionary."$($_.Name)".extendedInfo.effectiveAllow
}
}} |
Where-Object {$_.token -like "*$myProjectId*"}
返回:
token EffectiveAllow
----- --------------
$PROJECT:vstfs:///Classification/TeamProject/d1d6f447-cd58-431d-ad22-ee7d6579f6b3 112
然后,我将有效允许权限与我对该命名空间感兴趣的权限进行比较;即,如果
$effectiveAllow -band 4
返回 4
,则表明用户有权删除该项目。
这对于在项目级别被授予访问权限的用户来说效果很好,但对于我们这些被分配了比项目本身更高级别的权限的用户(例如
project collection administrators
/ organization owner
/ 等), 返回的值effectiveAllow
始终是 112
,这意味着我们无权删除该项目(112 -band 4
返回 0
)。
这是我的代码/方法中的错误吗?或者有没有办法找到拥有此权限的所有用户,包括那些从比项目本身更高的范围分配的权限?
根据doc,
是此令牌上此身份的所有显式权限和继承权限的组合。这些是确定给定用户是否有权执行某项操作时使用的权限。effectiveAllow
根据我的测试:
az devops security permission list
或 REST API 访问控制列表 - 查询 检查该用户在项目命名空间中的 effectiveAllow
。它的值为112。如果您将此用户添加到项目中并此时运行相同的DevOps CLI或API,则相应项目/令牌中用户的effectiveAllow
将会改变。因此,对于仅属于 PCA 组的用户,
effectiveAllow
正如预期的那样为 112。 112并不代表没有“删除团队项目”权限,而是包括“删除团队项目”权限在内的多种权限的组合。
要检查用户的权限,您可以使用 REST API 权限报告 - 获取。