В Dynamics AX 2009 есть отчет о безопасности OOTB, в котором перечислены все group
и связанные с ним разрешения.
В Dynamics AX 2012 у нас есть роли, заменяющие группы. В приложении можно увидеть, какие разрешения есть у каждой роли, но, похоже, нет отчета OOTB, в котором перечислялась бы эта информация, чтобы предоставить аудиторам необходимые им данные.
Мы могли бы написать собственный код, чтобы предоставить нам эту информацию, но вполне вероятно, что, поскольку это требуется для SOX, будет существующее решение.
Я понял, что есть вторая база данных для AX2012; то есть модель. Покопавшись, я обнаружил несколько таблиц безопасности и попытался найти взаимосвязи между ними. Я не смог найти никакой документации по этим таблицам в Google, поэтому, если кто-то еще использует это, обратите внимание, что может быть много упущений и проблем.
--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