Отчет по списку ролей и их разрешений в AX2012

В Dynamics AX 2009 есть отчет о безопасности OOTB, в котором перечислены все group и связанные с ним разрешения.

Для Dynamics AX 2012 у нас есть роли, занимающие место групп. В приложении можно увидеть, какие разрешения имеет каждая роль, но, по-видимому, нет отчета OOTB для перечисления этой информации, чтобы предоставить аудиторам необходимые данные.

Мы могли бы написать собственный код, чтобы дать нам эту информацию, но кажется вероятным, что, поскольку это требуется для SOX, будет существующее решение.

  • Кто-нибудь знает о таком сообщении?
  • В противном случае, есть ли какое-нибудь дополнение для этого (например, загружаемый инструмент, существующее решение, доступное как XPO, или что-то в Dynamics LCS)?
  • Или есть какое-либо руководство о том, как проводить аудит SOX, которое могло бы предложить лучший способ удовлетворения требований SOX без таких данных?

1 ответ

Решение

Я понял, что есть вторая база данных для AX2012; т.е. модель. После осмотра я обнаружил несколько таблиц безопасности и попытался выяснить отношения между ними. Я не смог найти никакой документации по этим таблицам от Googling, поэтому, если кто-то еще использует это, пожалуйста, обратите внимание, что может быть много упущений и проблем.

--use your model database
use [AxDbName_Model]
go

--ensure you don't cause locking when running this script
set transaction isolation level read uncommitted
go

--I got these IDs by comparing the TypeId fields for results with what I saw in the AOT and guessing on relationships.

declare @SubRoleType table (Id int, SubRoleDesc nvarchar(32))
insert @SubRoleType (Id, SubRoleDesc)
values (133, 'Role / SubRole')
, (134, 'Privilege')
, (135, 'Duty')
, (136, 'Process Cycle')

declare @KernelType table (Id int, KernelTypeDesc nvarchar(32))
insert @KernelType (Id, KernelTypeDesc)
values (11, 'Class')
, (44, 'Table')
, (45, 'ServerMethod')

--here's the actual code to fetch the security model/
--it could probably be improved to make it hierarchical, but
--for our company's purposes we don't seem to require that so 
--I didn't put any time into investigating that route.

;with permissionsModelCte (ParentId, ItemId, ItemName, ItemTypeId, ItemType, IsEnabled) as 
(
    --duties & privileges (sub role type describes what type of permission this is; this seems to hold all security related groupings of aot objects)
    select mssr.ROLEHANDLE
    , mssr.RECID
    , mssr.SUBROLENAME
    , mssr.SUBROLETYPE
    , srt.SubRoleDesc
    , mssr.ISENABLED
    from ModelSecuritySubRole mssr 
    left outer join @SubRoleType srt on srt.id = mssr.SUBROLETYPE

    union 

    --permissions (kernel type defines the related object type; this seems to hold everything in the AOT)
    select msp.OWNERHANDLE
    , msp.RECID
    , msp.OBJECTNAME
    , msp.KERNELTYPE 
    , 'Permission\' + kt.KernelTypeDesc
    , msp.ISENABLED
    from ModelSecurityPermission msp 
    left outer join @KernelType kt on kt.Id = msp.KERNELTYPE 
)
select msr.Name
, pmc.ItemType ChildItemType
, pmc.ItemName ChildItemName
, pmc.IsEnabled
--, pmc.ItemId ChildItemId  --interesting for investigating the script, but causes duplicate results
, msr.ROLEHANDLE ItemId
, pmc.ItemTypeId ChildItemTypeId
--, *
from ModelSecurityRole msr
left outer join permissionsModelCte pmc on pmc.ParentId = msr.ROLEHANDLE
--where msr.Name in ('CustInvoiceAccountsReceivableClerk', 'CCIARCollections') 
where msr.UTILTYPE = 133 --Roles only
group by msr.Name
, msr.ROLEHANDLE 
, pmc.ItemName 
--, pmc.ItemId --see select statement's ChildItemId
, pmc.IsEnabled
, pmc.ItemType 
, pmc.ItemTypeId 
order by msr.Name, pmc.ItemType, pmc.ItemName

go 
Другие вопросы по тегам