4. Attestation (Recertification)

21 декабря 2021 г.

14:06

Identity Manager 8.1.2 - Attestation Administration Guide (oneidentity.com)

Напомню как выглядит на текущий момент таблица пороговых значений (таблица из набора матрицы критичности): риска критичносги пользователя 0-0,19 Описание приемлемыи внимание уведомление критичныи Действия, полняемы СУ предоставление доступе предоставление доступе уведомление ДИБ ресертификация и уведомление ДИБ Дополнительные Нет действий Нет действий Установке на контроль Ресертифи кация

Включение вычисления RiskIndex

QER\CalculateRiskIndex

Структура аттестации

Attestation types включают в себя Attestation procedures. Просто группируя их.

Attestation procedures определяют базовый объект для аттестации, например - членство в Business role (объект PersonInOrg). В них задается отображение записи аттестации на портале - можно указать отображаемые свойства и колонки для группировки.

Значение Related object указывает на свяхь с другой таблицей, через указание XObjectKey (\$FK(UID_ADSAccount).XObjectKey\$), поля которого мы указываем в Grouping column 1 и т.п.

Compliance frameworks для классификации attestation policies, compliance rules, and company policies в соответствии с требованиями.

Attestation policies указывают конкретные условия для аттестации. В них указывается Attestation procedure, расписание.

Указывается условие Where для ограничения объектов для аттестации, которые указаны в Attestation procedure. Если мы на портале задаем условие для отбора объектов аттестации - то это условие сохраняется в Where Attestation policy!

В Attestation policy задается Apprval Policy, которая включает в себя Approval Workflow с шагами для прохождения аттестации.

Additional approver possible

Specifies whether a current attestor is allowed to instruct another employee as an attestor. This additional attestor has parallel authorization to make approvals for the current attestation case. The attestation case is not passed on to the next approval level until both attestors have made a decision.

This option can only be set for approval levels with a single, manual approval step.

Approval can be delegated

Specifies whether a current attestor can delegate the attestation to another person. This employee is added to the current approval step as the attestor. This employee then makes the approval decision instead of the attestor who made the delegation.

This option can only be set for approval levels with a single, manual approval step.

Approval by affected employee

Specifies whether the employee who is affected by the approval decision can also approve it. If this option is set, employees to be attested can attest themselves.

If this option is not set, use the QER | Attestation | PersonToAttestNoDecide configuration parameter to define whether the employees to be attested can attest themselves.

Do not show in approval history Specifies whether or not the approval step should be displayed in the attestation history. For example, this behavior can be applied to approval steps with the CD - calculated approval procedure, which are used only for branching in the approval workflow. It It makes it easier to follow the attestation history.

From \<https://support.oneidentity.com/technical-documents/identity-manager/8.1.2/attestation-administration-guide/18>

Для того, чтобы сотрудник мог сам себя аттестовать, надо поставить галку Approval by affected employee.


Recertifying existing users

IMPORTANT: Access to connected target systems may possibly be denied to One Identity Manager users as a result of recertification. You can configure this behavior to meet your company’s requirements. Read the following section thoroughly before you use the recertification function.

One Identity Manager provides an attestation policy for performing cyclical attestation of existing users allowing companies to regularly test and authorize employee master data stored in the One Identity Manager database. Cyclical attestation is triggered through a scheduled task. This resets the certification status for all employees stored in the database. One Identity Manager uses the same procedure for this as for attesting new users. The case is referred to as recertification.

Result of recertification

  • Certified, activated employees who can access all entitlements assigned to them in One Identity Manager and the connected target systems.
    Company resources are inherited. Account definitions are assigned to internal employees.
  • OR -

  • Denied and permanently deactivated employees.
    Disable employees cannot log in to One Identity Manager tools. Company resources are not inherited. Account definitions are not automatically assigned. User accounts associated with the employee are also locked or deleted. You can customize the behavior to meet your requirements.

From \<https://support.oneidentity.com/technical-documents/identity-manager/8.1.2/attestation-administration-guide/38#TOPIC-1363650>


Для того, чтобы выявлять определенных сотрудников по условиям (сотрудники с определенным индексом риска, например) надо править условие в Attestation policy!


Не отрабатывает автоудаление сотрудника из бизнес-ролей и групп при отклонении аттестации (ресертификации)

  • В QER\Attestation\AutoRemovalScope указать области, откуда будет удаляться сотрудник

  • В Workflow политики надо добавить дополнительный шаг EX с событием AUTOREMOVE

Toolbox Workflow Align layout Approval levels 17 Delete Approval steps Assignments Remove positive Remove negative Remove reroute Remove escalation CCC Member of Business role Person (ZI Approval level - Person) Single step Approual procedure Fallback apprcnrr Description Approual reason Rejectreason General Mail templates Remoue memberships EX- Approuals to be made eRernaIIy AUTOREMOVE Approual by affected employee Do not showin approual history Approval level Manager OF person (CM - Recipient's manager) Approval level Remove memberships (EX - Approvals to be mad

Identity Manager 8.1 - Attestation Administration Guide (oneidentity.com)


Условие отбора объектов для аттестации PersonInOrg с учетом членства сотрудника в определенной Бизнес-роли и его индекса риска

(EXISTS (select top 1 1 FROM (SELECT UID_Org FROM Org WHERE UID_Org IN ('8f42bafa-2350-4dac-81ac-c7aa117b269f','8e98371f-4d04-4f02-8266-00e1a4ae023f','19590942-9839-480f-8760-18a9aefc5c2b')) x WHERE x.UID_Org = PersonInOrg.UID_Org))AND(EXISTS (select top 1 1 FROM (SELECT UID_Person FROM Person WHERE RiskIndexCalculated >= 0 and RiskIndexCalculated \<= 0.1) p WHERE p.UID_Person = PersonInOrg.UID_Person))


Не удаляется пользователь из динамических Бизнес ролей при включенном параметре QER\Attestation\AutoRemovalScope\RoleMembership\RemoveDynamicRole

В версии 8.2 должно будет работать, так как там появится возможность делать исключения для динамических бизнес ролей.


Процесс ресертификации для Х5 (перевод сотрудника в другое подразделение)

Есть 2 расписания ресертификации - ежедневно (для проверки перевода сотрудника с высоким индексом риска в другое подразделение и плановое (3 года) для ресертификации сотрудников с высоким индексом риска)

При изменении подразделения сотрудника в его CustomProperty08 записывается строка NeedRecert (условие сработки процесса - индекс риска > значения определенного и отличие текущего департамента от прошлого).

При создании AttestationCase проверяется CustomProperty08 на значение NeedRecert и если оно там записано - создается AttestationCase.

В PropertyInfo3 AttestationCase записывается UID_Person, чтобы определить в его в шаге зачистки кастомных параметров

В Workflow на последнем шаге затирается CustomProperty08 сотрудника, чтобы аттестация не возникала снова на следующий день.


Процесс ресертификации для Х5 (изменение руководителя сотрудника)

Так как при изменении руководителя сотрудника с высоким индексом риска нужно проводить согласование с предыдущим руководителем, то при изменении руководителя UID прошлого руководителя записывается в CustomProperty09.

При создании AttestationCase проверяется CustomProperty09 на не пустое значение и если оно там записано - создается AttestationCase.

В AttestationCase CustomProperty09 сохраняется в Property4 template для того, чтобы в Workflow в шаге выяснения был ли предыдущий руководитель делать проверку на заполненность поля (NOT isnull(PropertyInfo4, N'') = N'') и после этого отправлять на согласование предыдущему руководителю.

В PropertyInfo3 AttestationCase записывается UID_Person, чтобы определить в его в шаге зачистки кастомных параметров

В Workflow на последнем шаге затирается CustomProperty09 сотрудника, чтобы аттестация не возникала снова на следующий день.

Событие Autoremove для AttestationCase - чтобы удалить членство в Бизнес ролях!


Attestation by mail

From \<https://support.oneidentity.com/technical-documents/identity-manager/8.1.1/attestation-administration-guide/34#TOPIC-1245537>


Информирование о необходимости аттестовать

Настройки в QER\Attestation\MailApproval

Надо включить QER\Attestation\MailTemplateIdents\RequestApproverByCollection для того, чтобы приходило одно письмо, а не несколько

Запуск расписания Inform approver about pending attestations для отправки писем


Условие отбора Attestation cases по дате устройства сотрудника

Выводятся PersonInOrg (членства в бизнес ролях), которые работают 3,6,9 … лет для ресертификации

select centralaccount, EntryDate, DateDiff(yy, EntryDate, GetUTCDate()) as DateDif from Person where DateDiff(dd, EntryDate, GetUTCDate()) % 1095 = 0 and DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0

Условие WHERE для Attestation Policy

(EXISTS (select top 1 1 FROM (SELECT UID_Person FROM Person WHERE RiskIndexCalculated >= 0.5 and RiskIndexCalculated \<= 1 and DateDiff(dd, EntryDate, GetUTCDate()) % 1095 = 0 and DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0 and isInActive = '0') p WHERE p.UID_Person = PersonInOrg.UID_Person))

По расписанию - запускать каждый день.

Вывод членства UNSAccount в UNSGroup (ADSAcoountInADSGroup, UNSAccountBInUNSGroupB …)

Условие WHERE для Attestation Policy

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person

WHERE

RiskIndexCalculated >= 0.5

AND RiskIndexCalculated \<= 1

)

)

)

Доп (с учетом тех, кто устроился 3,6,9 … лет от текущей даты)

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person

WHERE

RiskIndexCalculated >= 0.5

AND RiskIndexCalculated \<= 1

AND DateDiff(dd, EntryDate, GetUTCDate()) % 1097 = 0

AND DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0

AND isInActive = '0'

)

)

)


С учетом исключений

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person

WHERE

(

RiskIndexCalculated >= 0.2

AND RiskIndexCalculated \<= 0.69

AND DateDiff(dd, EntryDate, GetUTCDate()) % 1097 = 0

AND DateDiff(yyyy, EntryDate, GetUTCDate()) \<> 0

AND isInActive = '0'

)

OR (

RiskIndexCalculated >= 0.7

AND isInActive = '0'

)

)

AND UID_UNSAccount NOT IN (

SELECT

UID_ADSAccount

FROM

ADSAccount

WHERE

CCC_msExchExtAttr27 = 'CEO -1'

OR CCC_msExchExtAttr27 = 'CEO -2'

OR SAMAccountName = 'User040-3'

OR Department LIKE N'Наблюдательный совет'

)

)

)


С учетом новых случаев и кол-во дней (100) от ресертификации

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person

WHERE

(

--DefaultEmailAddress is not null

isInActive = '0'

)

OR (

RiskIndexCalculated >= 0.7

AND isInActive = '0'

)

)

AND UID_UNSAccount NOT IN (

SELECT

UID_ADSAccount

FROM

ADSAccount

WHERE

CCC_msExchExtAttr27 = 'CEO -1'

OR CCC_msExchExtAttr27 = 'CEO -2'

OR SAMAccountName = 'User040-3'

OR Department LIKE N'Наблюдательный совет'

OR Mail is null

)

AND UID_UNSAccount IN (

SELECT

UID_ADSAccount

FROM

ADSAccount

WHERE

UID_DPRNameSpace = 'ADS-DPRNameSpace-ADS'

)

)

)

AND(

not EXISTS (

SELECT

top 1 1

FROM

AttestationCase

WHERE

ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey

AND UID_AttestationRun IN (

SELECT

UID_AttestationRun

FROM

AttestationRun

WHERE

UID_AttestationPolicy = '\$UID_AttestationPolicy\$'

AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \< 100

--AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0

-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0

)

)

)


С учетом новых случаев, старше определенного года

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person

WHERE

(

--DefaultEmailAddress is not null

isInActive = '0'

)

OR (

RiskIndexCalculated >= 0.7

AND isInActive = '0'

)

)

AND UID_UNSAccount NOT IN (

SELECT

UID_ADSAccount

FROM

ADSAccount

WHERE

CCC_msExchExtAttr27 = 'CEO -1'

OR CCC_msExchExtAttr27 = 'CEO -2'

OR SAMAccountName = 'User040-3'

OR Department LIKE N'Наблюдательный совет'

OR Mail is null

)

)

)

AND(

Not EXISTS (

SELECT

top 1 1

FROM

AttestationCase

WHERE

ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey

AND UID_AttestationRun IN (

SELECT

UID_AttestationRun

FROM

AttestationRun

WHERE

UID_AttestationPolicy = '\$UID_AttestationPolicy\$'

AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<= 1097

--AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0

-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0

)

)

)

AND(

DateDiff(yy, XDateInserted, GetUTCDate()) > 1

)


Рабочая версия?

(

UID_UNSAccount IN (

SELECT

UID_UNSAccount

FROM

UNSAccount

WHERE

UID_Person IN (

SELECT

UID_Person

FROM

Person p

WHERE

UID_Department NOT IN (

SELECT

UID_Department

FROM

Department

WHERE

DepartmentName = N'Supply Chain' -- Наблюдательный совет

)

AND (

--DefaultEmailAddress is not null

isInActive = '0'

AND p.CentralAccount = 'User040'

)

OR (

RiskIndexCalculated >= 0.7

AND isInActive = '0'

)

)

AND UID_UNSAccount NOT IN (

SELECT

UID_ADSAccount

FROM

ADSAccount

WHERE

CCC_msExchExtAttr27 = 'CEO -1'

OR CCC_msExchExtAttr27 = 'CEO -2'

OR SAMAccountName = 'User040-3'

OR Department LIKE N'Наблюдательный совет'

-- OR Mail IS NULL

)

)

)

AND(

NOT EXISTS (

SELECT

top 1 1

FROM

AttestationCase

WHERE

ObjectKeyBase = UNSAccountInUNSGroup.XObjectKey

AND UID_AttestationRun IN (

SELECT

UID_AttestationRun

FROM

AttestationRun

WHERE

UID_AttestationPolicy = '\$UID_AttestationPolicy\$'

AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<= 2 --AND DateDiff(dd, PolicyProcessed, GetUTCDate()) % 1097 = 0

-- AND DateDiff(dd, PolicyProcessed, GetUTCDate()) \<> 0

)

)

)

--AND(DateDiff(yy, XDateInserted, GetUTCDate()) > 1)



Убрать колонку RiskIndex на портале при согласовании аттестации

  • Конфигурационный параметр Display columns of table "Attestation case"

  • В компоненте VI_Attestation_EditCases_Default убрать RiskIndex

Attestation EditC Configuration Compilationsettingsl Attestation VI Attestation AllowSeIect411 Elfi Container Grid band: AttestationCase ERended properties Database access options Row definitions DisplayName StructureDispIayIHeIper StructureDispIay2HeIper StructureDispIay3HeIper AttestationStateDispIay IsNot4pproued8eforeProxy TosolueTill VI Common DecisionControI


В модуле VI_Attestation удалить как расширение RiskIndex колонку

Attestatio Configuration Collections Local components Functions Euents Select8aseObjectForm SelectPoIicyForm ApprouaIs_DetaiI Elfi Containers Elfi Container6 Head Container27 All AttestationCase_PreuiewAutoRemoue Grid band: AttestationCase ERended properties Row definitions Column41 DisplayName LlID_AttestationPoIicy TosolueTill Risklnde

В компоненте VI_Attestation_AttestationCase_ViewMultiplyPolicy

Vl_Attestation_AttestationCase_ViewMuItipIePoIicy Configuration Definition Initializer Control list Gridl Grid band: AttestationCase Extended properties Database access options List view GridFiItersI RN/ definitions DisplayName UID_AttestationPoIicy AttestationStateDispIay IsNotApproved8eforeProxy TOSOlveTill • Risklndex Tablesl Controlsl Functions I DataEventHandIersI B—• Componentlnteffacel


Добавить колонку Product для отображения в кейсах аттестации

  • В Manager зайти в Attestation, Attestation Procedures и в нужной процедуре Grouping Column (template) =\$FK(UID_UNSGroup).FK(UID_AccProduct).Ident_AccProduct\$

Grouping Column = Product

  • В WebDesigner сделать копию компонента VI_Attestation_AttestationCase_ViewMultiplyPolicy и добавить колонку дополнительную

CCC_Attestation_AttestationCase_ViewMuItipIePoIicy Configuration Definition Initializer Control list Gridl Grid band: AttestationCase Extended properties Database access options List view ControlList2 Title Actions Content GridFiItersI Row definitions DisplayName StructureOispIa}I [E]uu Header cell A Product Ce112 A from AttestationCase select current DisplayVaIue(StructureDispIayI) UID_AttestationPoIicy AttestationStateDispIay IsNotApproved8eforeProxy

Изменения в модулях аттестации

VI_Attestation

  • Удаление в кастомной конфигурации Column22 - RiskIndex

Title8ar ControlListIO TextO - following a Select8aseObjectForm SelectPoIicyForm Approvals_DetaiI Initializer Title Main Containers Container6 - Head Container27 Grid2 Grid band: AttestationCase Extended properties List view ControlList2 Actions Content GridFilters2 Row definitions Column41 DisplayName UID_AttestationPoIicy TOSOlveTill Column46

  • Удаление ContainerColumnTemplate2

Select8aseObjectForm SelectPoIicyForm Approvals_DetaiI Initializer Title Main Containers Container6 - Head Container27 Grid2 Grid band: AttestationCase Extended properties List view ControlList2 Actions Content Control list LayoutPaneII ContainerCoIumnTempIatQ ColumnList5 ExpressionCoIumnListI Risklndex Container36 - Title column for norn Container35 - Value column for nol ContainerCoIumnTempIateI

  • Добавлен редирект на Form2 - вместо того, чтобы сначала отображать типы объектов ресертификации

Forms Form Initializer Load collection: Attestationpolicy Action15 Actions - Load by or UID_At Action20 - only one attestationpolicy given? ActionlO - Load by additional where clause Action21 Title Main Container I - No decisions made Container2 - No decisions made Container3 Activator I Action Load collection: DialogTabIeCandidate Database access options cccædirectl Added in: VI Attestation Node editor CCCRedirectI (Redirection) Redirection target Sorting z; Grouping Go to a form in this module Form2 Cancel action here Do not link back to this form No link to the menu Item linked with th

CCC_Attestation_AttestationCaseViewMultiplePolicy

  • Удалена колонка RiskIndex (Column1)

  • Добавлена виртуальная функция DenySelectAllValue() в ComponentInterface1

  • В VI_Common_DecisionControl - DenySelectAll() = DenySelectAllValue() (значение которого передается из компонента CCC_Attestation_AttestationCase)

CCC_Attestation_AttestationCase

  • Удален Case1, Case2

Switch I -q Casel -All cases in a single grid OptionalAttestationCaseFiIterO - sqland( AttestationCa: IsReadonlyo - IsReadonlyo NoltemsText0 - NoltemsText0 Case3 -No items found Case4 - One grid per product

  • Case2 скопирован в Case4

  • В Case4 удален Tab Page (Iteration) - AttestationPolicy

Case4 - One grid per product ControlList2 Tab page (iterationl: Attestationpolicy Tab page (iteration): ProductCategory

  • Добавлен Tab Page (Iteration) - ProductCategory

ControlList2 page era 10 es Ion o Icy Tab page (iterationl: ProductCategory Tab page A from ProductCategory select current FullPath Content Container (iteration): AttestationObject OptionalAttestationCaseFiIterO - sqland( AttestationCaseDbWhereCIauseO, formattuid_attestationpolicy in (select uid_attestationpolicy from attestationpolicy where {ODE, isnuIIorempty(AttestationPoIicyD... IsReadonlyo - IsReadonlyo DenySeIectAIIVaIueO - if (select countd from AttestationCase where Propertylnfol = (select current UID_AccProductGroup from ProductCategoryJJ > 2 then true else false

  • Добавлена таблица ProductCategory (на основе AccProductGroup)

  • Загрузка категорий происходит

CCC_Attestation_AttestationCase Configuration [30 Definition Initializer Container Activator I Action Load collection: Attestationpolicy Load collection: ProductCategor} Switch I Node editor Load collection: ProductCategory (Load collection) Show extension values Gene ral settings Type • Collection Database table WHERE clause Sorting Maximum number of objects to load Advanced Settings Control ID Sorting z; Grouping Load database objects ProductCategory U s ing database table defined on the "U ID AzeProduetGroup in like ' ADS*' ) " ) I (No ass ) I (No ass ) LoadTabIeI Load new objects 'select AttestationCase ' Remove nonexistent objects from the collection Reload existing objects

Workflow согласования - учет контейнера AD и предыдущего менеджера

  • В Manager зайти в Attestation, Attestation Procedures и в нужной процедуре Property3 (template) = \$FK(UID_UNSAccount).FK(UID_UNSContainer).cn\$

Property3 = CN ADS_Container

Property4 (template) = \$FK(UID_UNSAccount).FK(UID_Person).CustomProperty09\$

Property4 = Previous Manager

Вид на портале

Pending attestation Page shows two options. How to get rid of it? - Forum - Identity Manager Community - One Identity Community


Не удается указать кастомную Approval Policy для Attestation Policy

Нужно временно у Approval Policy указать Approval Workflow одной из Approval Policy, которую можно назначить

Затем, в Attestation Procedures назначить (Assign Approval Policy) кастомную Approval Policy (которая должна отобразиться)

Обратно вернуть кастомный Approval Workflow для кастомной Approval Policy.

But you can create a custom approval procedure and copy the query from the approval procedure "OR" to your custom approval procedure and assign the necessary tables. Than use your custom approval procedure in your workflow.

From \<https://www.oneidentity.com/community/identity-manager/f/forum/5040/unable-to-view-the-custom-approval-policy-created-for-attestation-at-attestation-procedure-level>


Расчет согласования предыдущего руководителя - Approval procedure

select pers.CustomProperty09 as UID_Person ,dbo.QER_FGIPWORulerOrigin(p.XObjectKey) as UID_PWORulerOrigin

from AttestationCase ac join ADSAccountInADSGroup p on ac.ObjectKeyBase = p.XObjectKey join ADSAccount adsa on p.UID_ADSAccount = adsa.UID_ADSAccount join Person pers on adsa.UID_Person = pers.UID_Person

where ac.UID_AttestationCase = @UID_AttestationCase


!На основе истории TimeTrace

SELECT

top 1 wprop.ContentShort AS UID_Person,

dbo.QER_FGIPWORulerOrigin(p.XObjectKey) AS UID_PWORulerOrigin

FROM

attestationCase ac

JOIN UNSAccountInUNSGroup p ON ac.ObjectKeyBase = p.XObjectKey

JOIN Person pers ON pers.UID_Person = ac.PropertyInfo2

JOIN DialogWatchOperation wop ON SUBSTRING(wop.ObjectKeyOfRow, 22, 36) = pers.UID_Person

JOIN DialogWatchProperty wprop ON wprop.UID_DialogWatchOperation = wop.UID_DialogWatchOperation

WHERE

ac.UID_AttestationCase = @UID_AttestationCase

AND wprop.UID_DialogColumn = 'QER-76BFB981AA5F4D69BE4E9014D1605E56'

AND wop.OperationType = 'U'

ORDER BY

wop.OperationDate DESC

//

.UID_DialogColumn = 'QER-76BFB981AA5F4D69BE4E9014D1605E56' - это по изменению колонки UID_PersonHead (руководитель)

OperationType = 'U' - это Update

SUBSTRING(wop.ObjectKeyOfRow, 22, 36) - откусить UID_Person

wop.OperationDate DESC - сначала свежие записи - последний руководитель

----

Не вызываются события на таблице AttestationCase

Причина в том, что не хватает прав на вызов событий.

Можно из Workflow генерировать кастомное событие, которое будет подхватываться процессом на таблице AttestationCase, как вариант.


Форма на портале

CCC_Attestation

Form4 - для отображения категорий продуктов

Form5 - для отфильтрованных по категориям продуктов AttestationCases


Запуск AttestationCases

I would create a script that creates the attestation cases for your attestation policy. The script can use a method available at enabled AttestationPolicy objects that allow you to specify the object keys you want to attest.

You can check the available methods in the object properties windows, tab called Methods. The method for your case would be CreateAttestations(String[] objectKeys) which takes an string array of object keys you want to attest using the current attestation policy. It returns an array of DBObjectKey objects.

So you just need to call the script using the SOAP / REST API.

From \<https://www.oneidentity.com/community/identity-manager/f/forum/26271/trigger-attestation-for-selected-objects-using-soap-service-call>


Или из скрипта

Public Function CCC_AttestationPolicy_CreateForSingleObject(ByVal uidAttestationPolicy As String, ByVal objectkey As String) As String

Try

Dim policy As ISingleDbObject = Connection.CreateSingle("AttestationPolicy", uidAttestationPolicy)

Dim objectKeyAttestationCase As String = policy.Custom.CallMethod("CreateAttestation", objectkey).ToString

Return objectKeyAttestationCase

Catch ex As Exception

Return String.Empty

End Try

End Function

Here uidAttestationPolicy is the policy you want to trigger and objectkey is pointing to the record you want policy to be triggered against.

Hope it helps.

From \<https://www.oneidentity.com/community/identity-manager/f/forum/26271/trigger-attestation-for-selected-objects-using-soap-service-call>


Вызов метода CreateAttestations из скрипта

Public Function CCC_AttestationPolicy_CreateForSingleObject(ByVal uidAttestationPolicy As String, ByVal objectkey As String) As String

Dim dbAttestationPolicy As IEntity

Dim arrObjectkey() As String = {objectkey}

dbAttestationPolicy = Session.Source.Get("AttestationPolicy", uidAttestationPolicy)

dbAttestationPolicy.CallMethod("CreateAttestations", arrObjectkey)

dbAttestationPolicy.Save(Session)

Return "OK"

End Function


При отказе от доступа обычным пользователем при ресертификации выходит ошибка на портале

Error executing script 'VI_AttestationCase_GetRemoveMembershipActions'.

Could not create single object for table ADSAccountInADSGroup.

Object of type Учетные записи пользователей Active Directory: назначения групп does not exist in database or you do not have the relevant viewing permissions.

(2022-06-17 16:34:08)

Проблема связана с тем, что в процессе согласования (Workflow) есть шаг с вызовом события AUTOREMOVE.

На портале при присутствии этого шага запускается скрипт проверки, чтобы высветить сообщение о возможном удалении из групп. Этот скрипт дает сбой. Это баг, есть лечение - Error executing AutoRemove Actions with script VI_AttestationCase_GetRemoveMembershipActions (299351) (oneidentity.com)

Проблему можно обойти, если сделать вызов кастомного события и по нему запуск процесса с копией шага, который удаляет членство (для таблицы AttestationCase).


Не корректно отображаются кнопки Утвердить все, Отказать все (ApproveAll, DenyAll)

Причина в том, что не корректно передается параметр DenySelectAll() для компонента VI_Common_DecisionControl

Я создал копию VI_Common_DecisionControl и в нем создал ещё один ComponentInterface DenySelectAllValue().

Значения передавал в него.

В условиях отображения кнопок учитывал значение DenySelectAllValue().

CCC_Common_DecisionControI Configuration [30 Definition Initializer Column group GridCoIumnI Extended properties Header cell Footer cell Containers c; Container2 - Approve Container3 - Deny all Node editor Container2 (Container) Gene ral settings Viewing condition Identfier (optional) Sorting z; Grouping Extended properties Approve all


Адрес на портале - список аттестаций

https://rumskapp314.open.ru/IdentityMgr/page.axd?MenuID=ATT_Attestation_MyAttestations&ContextID=ATT_Attestation_MyAttestations


Отправка письма о завершении ресертификации

Проблема была в том, что нужно отправлять одно письмо по нескольким AttestationCases.

Если делать просто в конце процесса согласования отправку письма, то будет отправлено столько писем, сколько случаев аттестаций.

Решение:

Сначала идет рандомная задержка в пределах 10 сек, через скрипт (элемент процесса выдает одинаковое значение задержки)

Потом AttCase закрывается с позитивным результатом.

Потом идет скрипт проверки -

Если остались открытые AttCases для этого AttRun - то возвращается False и письмо не отправляется.

Если открытых AttCases не осталось - идет проверка.

Получаем дату и время самого старого AttCase и сравниваем эту дату с датой текущего AttCase, который обрабатывается.

Если даты совпадают - значит AttCase самый старый и отправляем письмо.

CCC AttestationCase hform Delay process Script Make Positive Decision step the pr=ess - finalize change in the IOM dataE:eE Check exists opened Att Cases ma Send Mail adding person Email informing adding apprÜGl step approval

Скрипт задержки (Delay process - Script)

Public Sub CCC_Recertification_Delay

Dim Random As Integer = CInt(Int((10000 * Rnd())))

Threading.Thread.Sleep(Random)

'MsgBox(Random)

End Sub

--

Make Positive Decision - стандартный

--

Check exists opened Att Cases via Script

Public Function CCC_RecertCheckLastAttCase (ByVal UidAttCase As String, ByVal UidRecertPerson As String, ByVal AttRun As String) As Boolean

Dim f As ISqlFormatter = Session.SqlFormatter

Dim ClosedAttestationCases As IEntityCollection

Dim DateHead As String

Dim DatesClosedAtt As New List(Of String)

Dim dtHead As String = ""

Dim LastDateHead As String

Dim CountOpenAttCases As Integer = 0

Dim Random As Integer = CInt(Int((10000 * Rnd())))

Threading.Thread.Sleep(Random)

Dim qCountOpenAttCases = Query.From("AttestationCase") _

.Where(Function (c) c.Column("PropertyInfo2") = UidRecertPerson And c.Column("UID_AttestationRun") = AttRun And c.Column("IsClosed") = "False") _

.SelectCount()

CountOpenAttCases = Session.Source.GetCount(qCountOpenAttCases)

If CountOpenAttCases > 0 Then

Return False

End If

Dim qClosedAttestationCases = Query.From("AttestationCase") _

.Where(Function (c) c.Column("PropertyInfo2") = UidRecertPerson And c.Column("UID_AttestationRun") = AttRun And c.Column("IsClosed") = "True") _

.OrderBy("DateHead") _

.SelectAll()

ClosedAttestationCases = Session.Source.GetCollection(qClosedAttestationCases)

For Each colElement As IEntity In ClosedAttestationCases

DateHead = colElement.GetValue("DateHead").ToString()

DatesClosedAtt.Add(DateHead)

Next

Dim WhereClause As String = f.UidComparison("UID_AttestationCase", UidAttCase)

Session.Source().TryGetSingleValue(Of String)("AttestationCase","DateHead",WhereClause,dtHead)

LastDateHead = DatesClosedAtt(DatesClosedAtt.Count - 1).ToString()

If LastDateHead = dtHead Then

Return True

Else

Return False

End If

End Function


Send mail - стандартный


Для Delay process - Script, Make Positive decision, Check Exists установлен флаг DBQueue does not wait

: : an 一 030 一 一 1-40 一 -5 一 no 之 囗 “ ; 一 u0 ON 囗


Не отзываются права при достижении Timeout

Должно быть включено расписание "Checks reminder interval and timeout of attestation cases"


Проверка изменения значения колонки на основе исторических данных (TimeTrace)

SELECT

COUNT(OperationDate)

FROM

DialogWatchProperty wprop

JOIN DialogWatchOperation wop ON wprop.UID_DialogWatchOperation = wop.UID_DialogWatchOperation

JOIN Person pers ON SUBSTRING(wop.ObjectKeyOfRow, 22, 36) = pers.UID_Person

WHERE

pers.UID_Person = '5544521f-27eb-4993-8679-b27b5428cfb4'

AND wprop.UID_DialogColumn = (

SELECT

UID_DialogColumn

FROM

DialogColumn

WHERE

ColumnName = 'UID_Department'

AND UID_DialogTable = 'QER-T-Person'

)

AND wop.OperationType = 'U'

AND DateDiff(dd, wop.OperationDate, GetUTCDate()) \< 1


Проблемки при переводе сотрудника и ресертификации его доступов:

  1. При условии, что предыдущий руководитель \<> текущему может быть ситуация, когда у сотрудника нет руководителя и он появляется - условие удовлетворяется, но фактически перевод не состоится в другое подразделение. То есть, триггер смены руководителя не всегда означает смену подразделения.

  2. Перевод сотрудника, через увольнение

  3. Если уволился текущий руководитель сотрудника

  4. Если сотрудник уволен и потом принят в тот же департамент - считать ли это переводом? У него перед прошлым был департамент 123, потом департамент стал 0, потом департамент снова становится 123

  5. Надо учитывать дату мероприятия. Может быть случай, когда у сотрудника поменялся новый департамент на null?