Adjust Scaffolded Configuration
This guide shows how to adjust the XML configuration elements created by scaffoldings.
Overview
A scaffolding is an XML element that will generate a complex XML fragment. It is like a configuration shortcut that helps configure easily a set of XML elements that are usually configured together.
See the list of all existing Scaffoldings.
In most situations, scaffoldings are enough to generate the configuration required to meet the functional needs.
However, in some cases, scaffoldings do not meet the exact needs and must be adjusted to generate the right XML configuration.
NETWRIX recommends writing XML configuration by first using scaffoldings, adjusting it if needed, and as a last resort, when no scaffolding meets the needs, writing the configuration manually.
Adjust Scaffolded Configuration
Adjust XML configuration generated by a scaffolding by proceeding as follows:
-
When working via the UI, start by exporting UI configuration elements. See the Usercube-Export-Configuration topic for additional information.
-
Write an XML element whose identifier is the same as the one generated by the scaffolding.
Any identifier can be found in the Scaffoldings topic, in the section displaying the generated XML fragment.
-
Add
ConsolidationMode
to the element's properties.-
By default, the XML item written manually completely replaces the one generated by the scaffolding.
The default behavior should be used when needing to rewrite one or a few of the items generated by a scaffolding, not all of them.
When needing to rewrite the scaffolding's whole output, just remove the scaffolding and write the item(s) manually.
For example, the
ViewTemplateAdaptable
scaffolding generates, for theLDAP_Entry
entity type, a default display name for all LDAP resources, a display table to view the resources, and the corresponding permissions to access the table. Supposing that the resulting display table does not fit the needs, we could need to write a customized display table from scratch:
<DisplayTable Identifier="LDAP_Entry" EntityType="LDAP_Entry" DisplayTableDesignElement="resourcetable" IsEntityTypeDefault="true">
<Column DefaultSortPriority="1" DisplayBinding="dn" IsDisplayInSummaryView="true" IsResizable="true" IsSortable="true" CanBeFiltered="true" ColumnSize="4" />
<Column DisplayBinding="rdn" IsDisplayInSummaryView="true" IsResizable="true" IsSortable="true" CanBeFiltered="true" ColumnSize="2" />
<Column DisplayBinding="displayName" IsDisplayInSummaryView="true" IsResizable="true" IsSortable="true" CanBeFiltered="true" ColumnSize="2" />
<Column DisplayBinding="objectClass" IsDisplayInSummaryView="true" IsResizable="true" IsSortable="true" CanBeFiltered="true" ColumnSize="2" /></DisplayTable>The display table's identifier must be the same as the one generated by the scaffolding. Then the scaffolding is ignored so the display table
LDAP_Entry
is defined by the<DisplayTable .../>
properties written manually here, as well as its<Column .../>
child elements written manually here.Still from the
ViewTemplateAdaptable
scaffolding, suppose now that the default display name does not fit the needs, then we could write a customized display name from scratch:
<EntityPropertyExpression Identifier="LDAP_Entry_InternalDisplayName" Expression="C#:resource:return Usercube.Expressions.Functions.UtilExpressions.ToFormatedDN(resource.dn);" EntityType="LDAP_Entry" Property="InternalDisplayName" />The entity property expression's identifier must be the same as the one generated by the scaffolding. Then the scaffolding is ignored so the display name
LDAP_Entry_InternalDisplayName
is defined by the<EntityPropertyExpression .../>
properties written manually here. -
Set to
Merge
, the XML item generated by the scaffolding is completed with additional parent properties and/or child elements written manually, while keeping the parent properties and the child elements defined in the scaffolding.For example, the
WorkforceModule
scaffolding generates theDirectory_User
entity type (among other things) with a specific set of properties. We could choose to add some properties in the entity type:
<EntityType Identifier="Directory_User" ConsolidationMode="Merge">
<Property Identifier="OwnedApplications" DisplayName_L1="Managed Applications" Type="ForeignKey" />
<Property Identifier="OwnedBots" DisplayName_L1="Managed RPA Bots" Type="ForeignKey" />
<Property Identifier="Guests" DisplayName_L1="Sponsored Guests" Type="ForeignKey" /></EntityType>The entity type's identifier must be the same as the one generated by the scaffolding. Then the entity type
Directory_User
is defined by the<EntityType .../>
properties of the scaffolding, as well as its<Property ... />
child elements written in the scaffolding, and we add the properties written manually here.The
WorkforceModule
scaffolding also generates theDirectory_UserRecord_UniqueValue_Email
aspect (among other things) that uses unicity check rules to generate a unique email address for each new user. We could choose to add a unicity check rule in the aspect to compare the new email address to the existing ones from Microsoft Entra ID (formerly Microsoft Azure AD):
<BuildUniqueValueAspect Identifier="Directory_UserRecord_UniqueValue_Email" ConsolidationMode="Merge">
<UnicityCheck SourceBinding="Workflow_Directory_User:Directory_User.Records"
SourceExpression="C#:record:var firstName =
record.FirstName.Simplify()?.ToLowerInvariant(); var lastName =
record.LastName.Simplify()?.ToLowerInvariant(); if (string.IsNullOrEmpty(firstName) ||
string.IsNullOrEmpty(lastName)) { /_ Data missing _/ return null; }
var result = firstName + "." + lastName;
if (iteration > 0)
{
result += iteration.ToString();
}
return result;" TargetEntityType="MicrosoftEntraID_DirectoryObject" TargetExpression="C#:azure_ad:
if(string.IsNullOrEmpty(azure_ad.mail))
{
return null;
}
var result = azure_ad.mail;
var index = result.IndexOf('@');
if(index >=0)
{
result = result.Substring(0, index);
}
return result;" /></BuildUniqueValueAspect>The aspect's identifier must be the same as the one generated by the scaffolding. Then the aspect
Directory_UserRecord_UniqueValue_Email
is defined by the<BuildUniqueValueAspect .../>
properties of the scaffolding, as well as its<UnicityCheck ... />
child elements written in the scaffolding, and we add the unicity check rule written manually here. -
Set to
Update
, the XML item written manually replaces all parent properties, while keeping the child elements defined in the scaffolding.For example, the
OptimizeDisplayTable
scaffolding generates theDirectory_User
display entity type (among other things) with a specific set of properties. We could choose to change just the parent properties of the display entity type without changing its child properties:
<DisplayEntityType Identifier="Directory_User" ConsolidationMode="Update" Color="#95c18b" D0IsActive="true" D1IsActive="true" D2IsActive="true" D3IsActive="true" IconCode="People" PluralDisplayName_L1="Users" Priority="0" />The display entity type's identifier must be the same as the one generated by the scaffolding. Then the display entity type
Directory_User
is defined by the<DisplayEntityType .../>
properties written manually here, as well as the<Property ... />
child elements written in the scaffolding. -
Set to
Delete
, the XML item generated by the scaffolding is deleted, including its child elements.For example, the
AssignProfileAccessControlRules
scaffolding generates theAdministrator_Category_AccessControl_AssignedProfile
access control rule (among other things) with possibly child elements. We could choose to remove the whole access control rule:
<AccessControlRule Identifier="Administrator_Category_AccessControl_AssignedProfile" ConsolidationMode="Delete" />The access control rule's identifier must be the same as the one generated by the scaffolding. Then the access control rule
Administrator_Category_AccessControl_AssignedProfile
is completely removed.
-
-
Deploy the Configuration again. See the Usercube-Deploy Configuration for additional information.