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
它应该会导致您想要的结果。
你好 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
它应该会导致您想要的结果。