Sql 查询 - SCCM rba "GrantedOperations"

Sql query - SCCM rba "GrantedOperations"

你好 sccm 管理员,

我想在ssrs中做一个报告,以便快速找到一个组或用户在sccm中有什么权限。 也是为了把它放在 excel 格式和文档

经过一些工作后这里是一个简单的查询:

select RoleName,ObjectTypeName,GrantedOperations,BitFlag,OperationName
from vRBAC_AdminRoles ad
join RBAC_RoleOperations ro on ro.RoleID = ad.RoleID
join vRBAC_AvailableOperations av on av.ObjectTypeID = ro.ObjectTypeID
where RoleName = '[NEW] - Exploitation N1 - 163 SCCM Exploitation N1'

结果如下所示:

RoleName    ObjectTypeName                          calc BitFlag    OperationName
ARO - test security role Query  SMS_Subscription    1047    1       Read
ARO - test security role Query  SMS_Subscription    1047    2       Modify
ARO - test security role Query  SMS_Subscription    1047    4       Delete
ARO - test security role Query  SMS_Subscription    1047    16      Set Security Scope
ARO - test security role Query  SMS_Subscription    1047    1024    Create

我的问题是 "calc" 列值,它是所有 bitflag 的总和。在该示例中,该组拥有所有可能的权利;因为 1024+16+4+2+1=1047

但是当一些用户拥有更多奇特的权利时,这个数字就会激增。下面是一个简短的例子:

RoleName    ObjectTypeName  calc    BitFlag OperationName
AF - ETI    SMS_Collection  1827831463  1   Read
AF - ETI    SMS_Collection  1827831463  2   Modify
AF - ETI    SMS_Collection  1827831463  4   Delete
AF - ETI    SMS_Collection  1827831463  8   Read BitLocker Recovery Key
AF - ETI    SMS_Collection  1827831463  16  Rotate BitLocker Recovery Key
AF - ETI    SMS_Collection  1827831463  32  Remote Control
AF - ETI    SMS_Collection  1827831463  64  Run CMPivot
AF - ETI    SMS_Collection  1827831463  128 Modify Resource
AF - ETI    SMS_Collection  1827831463  512 Delete Resource
AF - ETI    SMS_Collection  1827831463  1024    Create

1827831463 是许多 bitflag 的总和,但我怎么知道哪个 "operationname" 指的是? 以最好的方式,我想要一个简单的 yes/no 或 true/false 就像 CASE 语句

如果我对你的理解正确,你想检查为其设置操作的 GrantedOperations。

在这种情况下,这不仅仅是一个总和(尽管它是),而是每个操作都选择为 2 的幂(读取为 2^0,写入 2^1,创建 2^10),这意味着如果你查看二进制形式的 GrantedOperations,每个操作集都是从 0 翻转到 1 的不同位。

因此,要检查是否存在任何操作,您可以对操作使用二进制 AND 运算符(只会设置一位),如果结果是操作的编号,则表示它已设置. (这整个 Bitflag 的 2 次幂是一种非常古老的编程技术,用于将设置存储为整数,因此如果需要,您可能会找到很多详细解释优点的文章)。

所以这意味着您可以这样编写查询:

select 
    RoleName,
    ObjectTypeName,
    GrantedOperations,
    BitFlag,
    CASE GrantedOperations & BitFlag
      WHEN BitFlag THEN 1
      ELSE 0
    END OperationGranted,
    OperationName
from vRBAC_AdminRoles ad
join RBAC_RoleOperations ro on ro.RoleID = ad.RoleID
join vRBAC_AvailableOperations av on av.ObjectTypeID = ro.ObjectTypeID

它应该会导致您想要的结果。