Partager via


Créer le modèle de connecteur de service web SAP ECC 7.51 pour ECMA2Host

Ce guide vous explique comment créer un modèle pour le connecteur ECMA (Extensibility Connectivity Management Agent) du service web afin de gérer les utilisateurs SAP ECC.

Limitations et hypothèses

Ce modèle montre comment gérer les utilisateurs. Ce guide n’aborde pas les autres types d’objets comme les groupes d’activités locales, les rôles et les profils, car ECMA2Host ne prend pas encore en charge les références à valeurs multiples. Les opérations sur les mots de passe sont également hors du champ d’application de ce guide.

La création du compte de service dans SAP pour appeler les fonctions BAPI exposées n’est pas abordée dans ce guide. Il part du principe qu’un compte de démonstration préexistant Developpeur est utilisé avec le profil RFC_ALL qui accorde les autorisations requises aux BAPI listées ci-dessous.

L’outil de configuration du service web ne prend pas en charge certaines fonctionnalités par défaut de SAP, telles que les politiques WSP et les liaisons multiples par point de terminaison. Il requiert un WSDL compatible uniquement avec SOAP 1.1, utilisant une liaison tout-en-un en style document, sans stratégies.

Fonctions BAPI SAP ECC utilisées dans ce modèle :

  • BAPI_USER_GETLIST : obtenez la liste de tous les utilisateurs connectés à ce système.
  • BAPI_USER_GETDETAIL : obtenez des détails sur un utilisateur spécifique.
  • BAPI_USER_CREATE1 : créez un utilisateur.
  • BAPI_USER_DELETE : supprimez un utilisateur.
  • BAPI_USER_CHANGE : mettez à jour un utilisateur.

Toutes les propriétés utilisateur SAP de ce guide sont traitées comme des propriétés à valeur unique.

Le langage de programmation est Visual Basic.

Définir un point de terminaison de service web et créer un schéma

Pour concevoir des workflows d’importation et d’exportation, vous devez d’abord créer un modèle et définir un point de terminaison intégrant les fonctions SAP BAPI exposées par une interface SOAP. Après cela, élaborez un schéma des objets ECMA2 et de leurs propriétés, qui sera accessible dans ce modèle.

  1. Dans le dossier « C:\NProgram Files\NMicrosoft ECMA2Host\NWeb Service Configuration Tool », lancez l’outil de configuration du service web wsconfigTool.exe.
  2. Dans le menu Nouveau fichier, choisissez Créer un nouveau projet SOAP.

Capture d’écran de la fenêtre contextuelle Créer un projet SOAP.

  1. Cliquez sur Projet SOAP et choisissez Ajouter un nouveau service web.

Capture d’écran de la fenêtre contextuelle Ajouter un nouveau service web.

  1. Nommez votre service web SAPECC, fournissez une URL pour télécharger le WSDL publié, entrez SAPECC comme espace de noms. Le nom du service web vous aide à identifier ce service web dans votre modèle par rapport à d’autres utilisateurs. Espace de noms définit le nom de l’espace de noms Microsoft .NET utilisé pour générer les classes. Choisissez le mode d’authentification de base, sauf indication contraire de l’administrateur SAP. Sélectionnez Suivant.

Capture d’écran du service web de dénomination.

  1. Fournissez des informations d’identification pour vous connecter au point de terminaison SAP ECC. Sélectionnez Suivant.
  2. Sur la page des points de terminaison et des opérations, assurez-vous que les BAPI sont affichées et cliquez sur Terminer.

Remarque

Si vous voyez plus d’un point de terminaison, c’est que les liaisons SOAP 1.2 et SOAP 1.1 sont activées. Cela provoque l’échec du connecteur. Modifiez votre définition de liaison dans SOAMANAGER et conservez-en une seule. Ensuite, rajoutez un service web.

Capture d’écran des BAPI.

  1. Enregistrez le projet dans le dossier C:\Program Files\Microsoft ECMA2Host\Service\ECMA.
  2. Cliquez sur l’onglet Types d’objets et choisissez d’ajouter un type d’objet utilisateur. Cliquez sur OK.
  3. Développez l’onglet Types d’objets, puis cliquez sur définition de type Utilisateur.

Capture d’écran des types d’objets.

  1. Ajoutez les attributs suivants dans le schéma et choisissez userName comme ancre.

Capture d’écran de l’ajout des attributs.

  1. Enregistrez votre projet.
Nom Type Ancre
city chaîne
company string
department string
e-mail chaîne
expirationTime string
firstName chaîne
lastName chaîne
middleName string
telephoneNumber string
jobTitle string
userName string checked

Créer un workflow pour une importation complète

Bien que facultatif dans ECMA2Host, le workflow d’importation vous permet d’importer des utilisateurs SAP existants dans le cache en mémoire d’ECMA2Host, évitant ainsi la création de doublons lors du provisionnement.

En l’absence de workflow d’importation, votre connecteur opérera en mode Exporter uniquement, ce qui entraînera l’émission par l’ECMA2Host d’opérations Créer un utilisateur pour tous les utilisateurs, y compris ceux déjà existants. Cela peut provoquer des échecs ou des doublons lors de l’utilisation des BAPI SAP standard, sauf si ces doublons sont gérés par le workflow d’exportation.

Comme SAP ECC ne propose pas de mécanisme intégré pour lire les modifications depuis la dernière lecture,

nous mettons en œuvre uniquement le workflow d’importation complète. Si vous devez mettre en œuvre des importations Delta pour des raisons de performance, consultez votre administrateur SAP pour obtenir une liste des BAPI et les publier en tant que service web SOAP. Procédez ensuite à la mise en œuvre du workflow d’importation Delta en suivant l’approche décrite ci-dessous et en utilisant une propriété customData qui enregistre le timestamp de la dernière exécution réussie.

SAP ECC offre plusieurs fonctions BAPI pour obtenir la liste des utilisateurs avec leurs propriétés :

  • BAPI_USER_GETLIST : obtenez la liste de tous les utilisateurs connectés à ce système.
  • BAPI_USER_GETDETAIL : obtenez des détails sur un utilisateur spécifique.

Seules ces deux BAPI sont utilisées pour récupérer les utilisateurs existants de SAP ECC dans ce modèle.

  1. Accédez au workflow Types d’objets - Utilisateur > - Importer > - Importer complètement > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité de séquence dans le volet du concepteur de workflow.
  2. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
  3. Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC.
Nom Type de variable Étendue Par défaut
selRangeTable SAPECC.TABLE_OF_BAPIUSSRGE Séquence nouvelle TABLE_OF_BAPIUSSRGE avec {.item = nouvelle BAPIUSSRGE(){nouvelle BAPIUSSRGE}}
getListRetTable SAPECC.TABLE_OF_BAPIRET2 Séquence nouvelle TABLE_OF_BAPIRET2
pageSize Int32 Séquence 200
returnedSize Int32 Séquence
usersTable SAPECC.TABLE_OF_BAPIUSNAME Séquence nouvelle TABLE_OF_BAPIUSNAME()

Capture d’écran du workflow d’opération d’importation complète.

  1. À partir de la boîte à outils, faites glisser et déposez quatre activités Affecter à l’intérieur de votre activité de séquence et définissez ces valeurs :
selRangeTable.item(0).PARAMETER = "USERNAME" 
selRangeTable.item(0).SIGN = "I" selRangeTable.item(0).OPTION = "GT" selRangeTable.item(0).LOW = ""   

Ces paramètres permettent d’appeler la fonction BAPI_USER_GETLIST et d’implémenter la pagination.

Capture d’écran du workflow d’importation complet.

  1. Pour implémenter la pagination, faites glisser et déposez l’activité DoWhile depuis la boîte à outils dans votre activité de séquence, après la dernière opération Affecter.
  2. Dans le volet droit, accédez à l’onglet Propriétés et saisissez cette condition pour
  • le cycle DoWhile : returnedSize = pageSize

Capture d’écran de l’écran returnedsize.

  1. Cliquez sur Variables et ajoutez la propriété currentPageNumber de type int32 dans le cycle DoWhile avec la valeur par défaut 0.

Capture d’écran de l’écran DoWhile.

  1. Étape facultative : si vous prévoyez d’implémenter le workflow d’importation Delta, faites glisser l’activité Affecter depuis la boîte à outils et déposez-la dans votre activité de séquence, après le cycle DoWhile. Définissez cette valeur :
  • customData(schemaType.Name + "_lastImportTime") = DateTimeOffset.UtcNow.Ticks.ToString() Cette action enregistre le timestamp de la dernière exécution complète de l’importation, qui pourra être utilisé plus tard dans le workflow d’importation Delta.

Capture d’écran de l’écran customdata.

  1. Dans la boîte à outils, sélectionnez l’activité de séquence, puis faites-la glisser à l’intérieur de votre activité DoWhile. Dans cette activité de séquence, faites glisser et déposer l’activité WebServiceCall puis sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS, et l’opération BAPI_USER_GETLIST.

Capture d’écran de la séquence DoWhile.

  1. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom Sens Type Value
MAX_ROWS Dans Int32 pageSize
MAX_ROWSSpecified Dans Boolean True
RETURN Entrée/Sortie TABLE_OF_BAPIRET2 getListRetTable
SELECTION_EXP Entrée/Sortie TABLE_OF_BAPIUSSEXP
SELECTION_RANGE Entrée/Sortie TABLE_OF_BAPIUSSRGE selRangeTable
USERLIST Entrée/Sortie TABLE_OF_BAPIUSNAME usersTable
WITH_USERNAME Dans Chaîne
ROWS Out Int32 returnedSize
  1. Cliquez sur OK. Le signe d’avertissement disparaît. Liste des utilisateurs stockés dans la variable usersTable. Puisque SAP ne renvoie pas une liste complète d’utilisateurs en une seule réponse, la pagination doit être implémentée et la fonction doit être appelée plusieurs fois à chaque changement de page. Ensuite, pour chaque utilisateur importé, il faut obtenir les détails de cet utilisateur en effectuant un appel distinct. Pour un environnement avec 1 000 utilisateurs et un format de page de 200, cela signifie que le connecteur de service web effectuera 5 appels pour obtenir la liste des utilisateurs et 1 000 appels individuels pour récupérer les détails des utilisateurs. Pour améliorer les performances, demandez à votre équipe SAP de développer un programme BAPI personnalisé qui répertorie tous les utilisateurs avec leurs propriétés, évitant ainsi de devoir effectuer 1 000 appels individuels, et d’exposer cette fonction BAPI sur le point de terminaison SOAP WS.
  2. Dans la boîte à outils, sélectionnez l’activité IF, puis glissez-la à l’intérieur de votre activité DoWhile après l’activité WebServiceCall. Définissez cette condition pour vérifier que la réponse n’est pas vide et qu’aucune erreur n’est présente : IsNothing(getListRetTable.item) OrElse getListRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0
  3. Dans la boîte à outils, sélectionnez l’activité Throw et glissez-la dans la branche Else de votre activité IF pour lancer une erreur en cas d’échec de l’importation. Passez à l’onglet Propriétés et saisissez cette expression pour la propriété Exception de l’activité Throw : New Exception(getListRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE)

Capture d’écran de la propriété d’exception

  1. Pour traiter une liste d’utilisateurs importés, glissez l’activité ForEachWithBodyFactory de la boîte à outils vers la branche Then de votre activité IF. Allez dans l’onglet Propriétés et sélectionnez SAPECC.BAPIUSNAME comme TypeArgument. Cliquez sur le bouton ... et saisissez cette expression pour la propriété valeurs : if(usersTable.item,Enumerable.Empty(of BAPIUSNAME)())

Capture d’écran de l’activité IF.

  1. Dans la boîte à outils, sélectionnez l’activité de séquence, puis faites-la glisser à l’intérieur de votre activité ForEach. En gardant la fenêtre de l’activité de séquence active, cliquez sur le bouton Variables et définissez les variables suivantes :
Nom Type de variable Étendue Par défaut
company SAPECC.BAPIUSCOMP Séquence nouvelle BAPIUSCOMP()
address SAPECC.BAPIADDR3 Séquence nouvelle BAPIADDR3()
defaults SAPECC.BAPIDEFAUL Séquence nouvelle BAPIDEFAUL()
logondata SAPECC.BAPILOGOND Séquence nouvelle BAPILOGOND()
getDetailRetTable SAPECC.TABLE_OF_BAPIRET2 Séquence nouvelle TABLE_OF_BAPIRET2()

Votre activité IF ressemble à ceci :

Capture d’écran de l’activité IF avec ForEach.

  1. Faites glisser et déposez l’activité CreateCSEntryChangeScope à l’intérieur de votre activité de séquence. Dans la propriété DN, entrez schemaType.Name & item.USERNAME. Dans le champ CreateAnchorAttribute AnchorValue, entrez item.username.

Capture d’écran de CreateCSEntryChangeScope.

  1. Pour obtenir les détails de chaque utilisateur, faites glisser et déposer l’activité WebServiceCall depuis la boîte à outils dans l’activité de séquence, juste avant l’activité CreateAnchorAttribute. Choisissez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS, et l’opération BAPI_USER_GET_DETAIL. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom Sens Type Valeur
RETURN Entrée/Sortie TABLE_OF_BAPIRET2 getDetailRetTable
USERNAME Dans Chaîne item.username
ADDRESS Out BAPIADDR3 address
COMPANY Out BAPIUSCOMP company
DEFAULTS Out BAPIUSDEFAUL defaults
LOGONDATA Out BAPILOGOND logonData
WITH_USERNAME Dans Chaîne
ROWS Out Int32 returnedSize
  1. Cliquez sur OK. Le signe d’avertissement disparaît. Les détails d’un utilisateur sont stockés dans les variables répertoriées ci-dessus. Votre activité IF ressemble à ceci :

Capture d’écran des paramètres.

  1. Pour vérifier les résultats de l’opération BAPI_USER_GET_DETAIL, à partir de la boîte à outils, faites glisser l’activité IF dans l’activité Sequence entre les activités WebServiceCall et CreateAnchorAttribute. Entrez cette condition : IsNothing(getDetailRetTable.item) OrElse getDetailRetTable.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) = 0

Étant donné que des détails d’utilisateur manquants ne doivent pas être traités comme un événement catastrophique, nous voulons indiquer cette erreur et continuer à traiter les autres utilisateurs. Faites glisser l’activité Séquence dans la branche Else de votre activité IF. Ajoutez l’activité Log dans cette nouvelle activité Sequence. Basculez vers l’onglet Properties et modifiez la propriété Level en High, Tag to Trace. Entrez les éléments suivants dans la propriété LogText : string.Join("\n", getDetailRetTable.item.Select (Function(item) item.MESSAGE ))

  1. Faire glisser l’activité Sequence dans la branche Then de l’activité IF. Faites glisser l’activité CreateAnchorAttribute existante sur l’activité Sequence située dans la branche Then de l’activité IF. Votre activité ForEach ressemble maintenant à ceci :

Capture d’écran de ForEach.

  1. Pour chaque propriété d’un utilisateur comme city, company, department, email : ajoutez une activité IF après l’activité CreateAnchorAttribute et vérifiez la présence de valeurs non vides en entrant des conditions telles que Not string.IsNullOrEmpty(address.city) et en ajoutant des activités CreateAttributeChange dans la branche Then cette activité IF.

Capture d’écran de CreateAttributeChange.

Par exemple, ajoutez des activités CreateAttributeChange pour toutes les propriétés utilisateur à l’aide de cette table de mappage :

Propriété d’utilisateur ECMA Propriété SAP
city address.city
department address.department
company company.company
email address.e_mail
firstName address.firstName
lastName address.lastName
middleName address.middleName
Fonction address.function
expirationTime logonData.GLTGB
telephoneNumber address.TEL1_NUMBR
  1. Enfin, ajoutez l’activité SetImportStatusCode après la dernière activité CreateAttributeChange. Définissez ErrorCode sur Success dans la branche Then. Ajoutez une activité de code SetImportStatus supplémentaire à la branche Else et définissez ErrorCode sur ImportErrorCustomContinueRun.

Capture d’écran de SetImportStatusCode.

  1. Réduisez l’activité Sequence à l’intérieur de l’activité ForEach afin que votre cycle DoWhile ressemble à ceci :

Capture d’écran du cycle DoWhile.

  1. Pour récupérer la page suivante des utilisateurs, mettez à jour la propriété selRangeTable.item(0).LOW. Faites glisser et déposez l’activité IF dans l’activité Sequence dans DoWhile, placez-la après l’activité IF existante. Entrez returnedSize>0 en tant que condition. Ajoutez l’activité Assign à la branche Then de l’activité IF et définissez selRangeTable.item(0).LOW sur usersTable.item(returnedSize-1).username.

Capture d’écran de DoWhile final.

Vous avez terminé la définition du workflow Full Import.

Créer un workflow Export Add

Pour créer un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_CREATE1 et de fournir tous les paramètres requis, y compris le nom de compte et le mot de passe initial. Si vous souhaitez qu’un nom de compte soit généré par SAP, contactez votre administrateur SAP et utilisez une fonction BAPI personnalisée qui renvoie le userName d’un compte utilisateur fraîchement créé.

Ce guide ne présente pas l’attribution de licences, de groupes d’activités locaux ou globaux, de systèmes ou de profils. Contactez votre administrateur SAP et modifiez ce workflow en conséquence.

Il n’est pas nécessaire de prévoir une pagination dans les workflows d’exportation. Un seul objet objectToExport est disponible dans le contexte du workflow.

  1. Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Ajouter un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
  2. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
  3. Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_CREATE1.
Nom Type de variable Étendue Par défaut
address SAPECC.BAPIADDR3 Séquence nouvelle BAPIADDR3()
userName Chaîne Séquence
mot de passe SAPECC.BAPIPWD Séquence nouvelle BAPIPWD()
company SAPECC.BAPIUSCOMP Séquence nouvelle BAPIUSCOMP()
defaults SAPECC.BAPIDEFAUL Séquence nouvelle BAPIDEFAUL()
logOnData SAPECC.BAPILOGOND Séquence nouvelle BAPILOGOND()
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Séquence nouvelle TABLE_OF_BAPIRET2()

Capture d’écran du workflow Export Add

  1. Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. Dans le champ Valeur, entrez objectToExport.AnchorAttributes.

Capture d’écran de la séquence Export Add

  1. Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Entrez la valeur d’expression de : nouvelle AnchorAttributeNameWrapper(anchor.Name).
  2. Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectez anchor.Value.ToString() à la variable userName.

Capture d’écran du nouveau cas.

  1. Maintenant que la valeur userName a été extraite de la propriété d’ancrage de l’objet exporté, il est temps de remplir d’autres structures, telles que l’entreprise, les valeurs par défaut, l’adresse, et les données de connexion qui contiennent d’autres détails sur l’utilisateur SAP. Pour ce faire, nous parcourons la collection de modifications d’attributs.
  2. Réduisez votre activité ForEach, puis faites glisser et déposez une autre activité ForEachWithBodyFactory dans votre activité Sequence, après l’activité ForEach existante. Remplacez le nom de la variable d’élément par attributeChange, puis passez aux propriétés et sélectionnez TypeArgument de Microsoft.MetadirectoryServices.AttributeChange. Dans le champ Valeur, entrez objectToExport.AttributeChanges.

Capture d’écran de la nouvelle séquence.

  1. Faites glisser et déposez une activité Switch dans le corps de l’activité ForEach.
  2. Dans le menu contextuel, sélectionnez Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper et cliquez sur Ok.
  3. Entrez l’expression suivante : nouveau AttributeNameWrapper(attributeChange.Name). Une icône d’avertissement s’affiche dans le coin supérieur droit de votre activité Switch pour signaler les attributs non gérés définis dans le schéma et non affectés à une propriété.
  4. Cliquez sur Ajouter une nouvelle zone de cas d’activité Switch et saisissez une valeur de cas de city.
  5. Faites glisser et déposez une activité Assign dans le corps de ce cas. Affectez attributeChange.ValueChanges(0).Value.ToString() à address.city.

Capture d’écran du nouveau workflow Export Add

  1. Ajoutez d’autres cas et affectations manquants. Utilisez ce tableau de mappage pour vous guider :
Case Affectation
city address.city = attributeChange.ValueChanges(0)Value.ToString()
company company.company = attributeChange.ValueChanges(0)Value.ToString()
department address.department = attributeChange.ValueChanges(0)Value.ToString()
email address.e_mail = attributeChange.ValueChanges(0)Value.ToString()
expirationTime logOnData.GLTGB = attributeChange.ValueChanges(0)Value.ToString()
prénom address.firstname = attributeChange.ValueChanges(0)Value.ToString()
lastName address.lastname = attributeChange.ValueChanges(0)Value.ToString()
middleName address.middlename = attributeChange.ValueChanges(0)Value.ToString()
telephoneNumber address.TEL1_Numbr = attributeChange.ValueChanges(0)Value.ToString()
Fonction address.function = attributeChange.ValueChanges(0)Value.ToString()
export_password password.BAPIPWD1 = attributeChange.ValueChanges(0)Value.ToString()

Dans ce contexte, export_password est un attribut virtuel spécial, toujours présent dans le schéma, utilisé pour transmettre un mot de passe initial à l’utilisateur en cours de création.

Capture d’écran des cas.

  1. Réduisez votre activité ForEach, puis faites glisser et déposez l’activité IF dans l’activité Sequence, après la deuxième activité ForEach, pour valider les propriétés de l’utilisateur avant de soumettre la demande de création. Nous avons besoin d’au moins 3 valeurs non vides : nom d’utilisateur, nom de famille, et mot de passe initial. Entrez cette condition : (String.IsNullOrEmpty(address.lastname) = False ) AND (String.IsNullOrEmpty(userName) = False) AND (String.IsNullOrEmpty(password.BAPIPWD1) = False)
  2. Dans la branche Else de l’activité IF, insérez une autre activité IF afin d’envoyer des messages d’erreur distincts en fonction des données manquantes. Entrez la valeur de condition : String.IsNullOrEmpty(userName). Faites glisser et déposez les activités CreateCSEntryChangeResult dans les deux branches de la deuxième activité IF et définissez des ErrorCode de ExportErrorMissingAnchorComponent et ExportErrorMissingProvisioningAttribute.

Capture d’écran de la deuxième activité IF.

  1. Faites glisser et déposez l’activité Sequence dans la branche vide Then de la première activité IF. Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_CREATE1. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom Sens Type Value
ADDRESS Dans BAPIADDR3 address
COMPANY Dans BAPIUSCOMP company
DEFAULTS Dans BAPIDEFAUL defaults
LOGONDATA Dans BAPILOGOND logOnData
PASSWORD Dans BAPIPWD mot de passe
RETURN Entrée-Sortie TABLE_OF_BAPIRET2 bapiret2Table
SELF_REGISTER Dans Chaîne « X »
USERNAME Dans Chaîne userName
  1. Cliquez sur OK. Le signe d’avertissement disparaît.

Capture d’écran du workflow après les paramètres.

  1. Pour traiter les résultats des demandes utilisateur créées, faites glisser et déposez l’activité IF dans l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante : IsNothing (bapiret2Table.item) OrElse bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. En l’absence d’erreurs, nous partons du principe que l’opération d’exportation a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un CSEntryChangeResult avec l’état Réussite. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite.
  3. Facultatif : si le service web retourne un nom de compte généré pour l’utilisateur, nous devons actualiser la valeur d’ancrage de l’objet exporté. Pour ce faire, faites glisser et déposez l’activité CreateAttrubuteChange à l’intérieur de l’activité CreateCSEntryChangeResult et sélectionnez l’option Ajouter un nom d’utilisateur. Faites ensuite glisser et déposez l’activité CreateValueChange à l’intérieur de l’activité CreateAttributeChange et saisissez le nom de la variable renseignée par une activité d’appel de service web. Dans ce guide, vous utilisez la variable userName qui n’est pas mise à jour lors de l’exportation.

Capture d’écran du flux de séquence mis à jour.

  1. La dernière étape du workflow Export Add consiste à gérer et à enregistrer les erreurs d’exportation. Faites glisser et déposez l’activité Sequence dans la branche vide Then de votre activité IF.
  2. Faites glisser et déposez l’activité Log à l’intérieur de l’activité Sequence. Allez dans l’onglet Propriétés et entrez la valeur LogText de : bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).MESSAGE. Conservez un haut niveau de journalisation et activez les balises de suivi. Cela permet d’enregistrer un message d’erreur dans ConnectorsLog ou dans le journal des événements de l’ECMA2Host lorsque le traçage détaillé est activé.
  3. Faites glisser et déposez l’activité Switch à l’intérieur de l’activité Sequence après l’activité Log. Dans la fenêtre contextuelle, sélectionnez le type de chaîne de la valeur de switch. Entrez l’expression suivante : bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Cliquez sur le cas par défaut et faites glisser et déplacez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorInvalidProvisioningAttributeValue.

Capture d’écran de la nouvelle mise à jour du workflow.

  1. Cliquez sur la zone Ajouter un nouveau cas et saisissez une valeur de cas de 224. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorCustomContinueRun.

Capture d’écran de la mise à jour finale du workflow.

Vous avez terminé la définition du workflow Export Add.

Créer un workflow Export Delete

Pour supprimer un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_DELETE et de fournir un nom de compte à supprimer dans le système connecté. Demandez à votre administrateur SAP si ce scénario est indispensable, car il est courant de ne pas supprimer mais de laisser expirer les comptes SAP ECC pour préserver leur historique.

Ce guide n’aborde pas les scénarios relatifs à l’administration des utilisateurs SAP, à la désactivation des utilisateurs dans les systèmes connectés, ou à la révocation des licences, entre autres.

Il n’est pas nécessaire de prévoir une pagination dans les workflows d’exportation. Un seul objet objectToExport est disponible dans le contexte du workflow.

  1. Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Supprimer un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
  2. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
  3. Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_DELETE.
Nom Type de variable Étendue Par défaut
userName Chaîne Séquence
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Séquence nouvelle TABLE_OF_BAPIRET2()
  1. Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. Dans le champ Valeur, entrez objectToExport.AnchorAttributes.

Capture d’écran du workflow d’opération de suppression d’exportation.

  1. Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Saisir la valeur d’expression de : nouveau AnchorAttributeNameWrapper(anchor.Name). Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectez anchor.Value.ToString() à la variable userName.
  2. Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence après l’activité ForEach. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_DELETE. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :
Nom Sens Type Valeur
RETURN Entrée/Sortie TABLE_OF_BAPIRET2 bapiret2Table
USERNAME Dans Chaîne userName
  1. Cliquez sur OK. Le signe d’avertissement disparaît.

Capture d’écran du workflow d’opération de suppression mise à jour.

  1. Pour traiter les résultats des demandes utilisateur supprimées, faites glisser et déposez l’activité IF à l’intérieur de l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante : If(bapiRet2Table.item, Enumerable.Empty(Of BAPIRET2)()).Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. En l’absence d’erreurs, nous partons du principe que l’opération de suppression a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un CSEntryChangeResultt avec l’état Réussite. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite.

Capture d’écran du workflow Supprimer une exportation

  1. La dernière étape du workflow Export Delete consiste à gérer et à enregistrer les erreurs d’exportation. Faites glisser et déposez l’activité Sequence dans la branche vide Then de votre activité IF.
  2. Faites glisser et déposez l’activité Log à l’intérieur de l’activité Sequence. Allez dans l’onglet Propriétés et entrez la valeur LogText de : bapiRetTable.item.First(Function(retItem) retItem.TYPE.Equals("E")= True).MESSAGE. Conservez un haut niveau de journalisation et activez les balises de suivi. Cela permet d’enregistrer un message d’erreur dans le ConnectorsLog ou dans le journal des événements de l’ECMA2Host lorsque le traçage détaillé est activé.
  3. Faites glisser et déposez l’activité Switch à l’intérieur de l’activité Sequence après l’activité Log. Dans la fenêtre contextuelle, sélectionnez le type de chaîne de la valeur de switch. Entrez l’expression suivante : bapiret2Table.item.First(Function(retItem) retItem.TYPE.Equals("E")).NUMBER
  4. Cliquez sur le cas par défaut et faites glisser et déplacez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorSyntaxViolation.

Capture d’écran du workflow d’opération de suppression d’exportation mise à jour.

  1. Cliquez sur la zone Ajouter un nouveau cas et saisissez une valeur de cas de 124. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans le corps de ce cas. Sélectionnez le code d’erreur ExportErrorCustomContinueRun.

Capture d’écran du workflow d’opération de suppression d’exportation finale.

Vous avez terminé la définition du workflow Export Delete.

Créer un workflow Export Replace

Pour mettre à jour un utilisateur dans SAP ECC, il suffit d’exécuter le programme BAPI_USER_CHANGE et de fournir tous les paramètres requis, y compris le nom de compte et tous les détails de l’utilisateur, notamment ceux qui ne changent pas. Le mode d’exportation ECMA2 lorsque toutes les propriétés utilisateur doivent être fournies est appelé Replace. En comparaison, le mode d’exportation AttributeUpdate ne fournit que les attributs modifiés, ce qui peut entraîner le remplacement de certaines propriétés utilisateur par des valeurs vides. Par conséquent, le connecteur de service web utilise toujours le mode d’exportation Object Replace et s’attend à ce que le connecteur soit configuré sur Export Type: Replace.

Le workflow Export Replace est presque identique au workflow Export Add. La seule différence réside dans le fait que vous devez spécifier des paramètres supplémentaires, comme addressX ou companyX, pour le programme BAPI_USER_CHANGE. Le suffixe X dans addressX signifie que la structure de l’adresse a subi une modification.

  1. Accédez au workflow Types d’objets - Utilisateur > - Exporter > - Remplacer un workflow > et, dans la boîte à outils située à droite, faites glisser et déposez l’activité Sequence dans le volet du concepteur de workflow.
  2. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence.
  3. Ajoutez les variables suivantes. Pour choisir un type de variable généré à partir du WSDL SAP, cliquez sur Parcourir les types, puis développez généré et ensuite l’espace de noms SAPECC. Cette opération initialise les structures de données utilisées par le programme BAPI_USER_CHANGE.
Nom Type de variable Étendue Par défaut
userName Chaîne Séquence
bapiret2Table SAPECC.TABLE_OF_BAPIRET2 Séquence nouvelle TABLE_OF_BAPIRET2()
addressX SAPECC.BAPIADDR3X Séquence nouvelle BAPIADDR3X()
address SAPECC.BAPIADDR3 Séquence nouvelle BAPIADDR3()
companyX SAPECC. BAPIUSCOMX Séquence nouvelle BAPIUSCOMX()
company SAPECC.BAPIUSCOMP Séquence nouvelle BAPIUSCOMP()
defaultsX SAPECC.BAPIDEFAX Séquence nouvelle BAPIDEFAX()
defaults SAPECC.BAPIDEFAUL Séquence nouvelle BAPIDEFAUL()
logOnDataX SAPECC.BAPILOGONX Séquence nouvelle BAPILOGONX()
logOnData SAPECC.BAPILOGOND Séquence nouvelle BAPILOGOND()

Votre workflow Export Replace ressemble à ceci :

Capture d’écran du démarrage du workflow d’opération de remplacement.

  1. Comme nous avons défini userName comme une propriété immuable et une ancre, il sera nécessaire d’extraire la valeur userName d’une collection d’ancres de notre objet d’exportation. Faites glisser l’activité ForEachWithBodyFactory depuis la boîte à outils et déposez-la dans votre activité Sequence. Remplacez le nom de la variable élément par ancre, passez aux propriétés et choisissez TypeArgument de Microsoft.MetadirectoryServices.AnchorAttribute. Dans le champ Valeur, entrez objectToExport.AnchorAttributes.

Capture d’écran de la mise à jour du workflow d’opération de remplacement.

  1. Pour extraire une valeur de chaîne d’une ancre userName, faites glisser et déposez l’activité Switch à l’intérieur de l’activité ForEach. Dans la fenêtre contextuelle, sélectionnez le type de commutateur Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AnchorAttributeNameWrapper. Saisir la valeur d’expression de : nouveau AnchorAttributeNameWrapper(anchor.Name). Cliquez sur Ajouter une nouvelle zone de cas dans l’activité Switch. Saisissez userName comme valeur de cas. Faites glisser et déposez l’activité Assign dans le corps du cas userName, puis affectez anchor.Value.ToString() à la variable userName. Votre workflow Export Replace ressemble à ceci :

Capture d’écran d’une autre mise à jour du workflow d’opération de remplacement.

  1. Maintenant que la valeur userName a été extraite de la propriété d’ancrage de l’objet exporté, il est temps de remplir d’autres structures, telles que l’entreprise, les valeurs par défaut, l’adresse, et les données de connexion qui contiennent d’autres détails sur l’utilisateur SAP. Pour ce faire, nous parcourons la collection de tous les attributs définis dans le schéma.
  2. Réduisez votre activité ForEach, puis faites glisser et déposez une autre activité ForEachWithBodyFactory dans votre activité Sequence, après l’activité ForEach existante. Remplacez le nom de la variable d’élément par schemaAttr, puis passez aux propriétés et sélectionnez TypeArgument de Microsoft.MetadirectoryServices.SchemaAttribute. Dans le champ Valeur, entrez schemaType.Attributes.

Capture d’écran de l’activité de la séquence d’opérations de remplacement.

  1. Faites glisser et déposez une activité Sequence dans le corps de l’activité ForEach. En bas à gauche, recherchez le bouton Variables et cliquez dessus pour développer une liste de variables définies dans cette séquence. Ajoutez la variable suivante : xValue de type String. Faites glisser et déposez l’activité Assign à l’intérieur de l’activité Sequence. Affectez à xValue l’expression suivante : If(objectToExport.AttributeChanges.Contains(schemaAttr.Name), objectToExport.AttributeChanges(schemaAttr.Name).ValueChanges(0).Value.ToString(), String.Empty). Cette expression extrait les modifications à exporter pour cet attribut ou l’initialise avec une chaîne vide. Votre workflow Export Replace ressemble à ceci :

Capture d’écran de la mise à jour de la séquence de remplacement.

  1. Faites glisser et déposez l’activité Switch après l’activité Assign. Dans le menu contextuel, sélectionnez Microsoft.IdentityManagement.MA.WebServices.Activities.Extensions.AttributeNameWrapper et cliquez sur Ok. Entrez l’expression suivante : nouveau AttributeNameWrapper(schemaAttr.Name) Une icône d’avertissement s’affiche dans le coin supérieur droit de votre activité Switch pour signaler les attributs non gérés définis dans le schéma et non affectés à une propriété. Cliquez sur Ajouter une nouvelle zone de cas d’activité Switch et saisissez une valeur de cas de city. Faites glisser et déposez une activité Sequence dans le corps de ce cas. Faites glisser et déposez l’activité Assign dans le corps de ce cas. Affectez la valeur « X » à addressX.city. Faites glisser et déposez une autre activité Assign dans le corps de ce cas. Affectez xValue à address.city. Votre workflow Export Replace ressemble à ceci :

Capture d’écran de l’activité de commutation par glisser-déposer.

10.Ajoutez d’autres cas et affectations manquants. Utilisez ce tableau de mappage pour vous guider :

Case Affectation
city addressX.city = « X » address.city = xValue
company companyX.company = « X » company.company = xValue
department address.departmentX = « X » address.department = xValue
email addressX.e_mail = « X » address.e_mail = xValue
expirationTime logOnDataX.GLTGB = « X » logOnData.GLTGB = xValue
prénom addressX.firstname = « X » address.firstname = xValue
lastName addressX.lastname = « X » address.lastname = xValue
middleName addressX.middlename = « X » address.middlename = xValue
telephoneNumber addressX.TEL1_Numbr = adresse « X ». TEL1_Numbr = xValue
Fonction addressX.function = « X » address.function = xValue

Votre workflow Export Replace ressemble à ceci :

Capture d’écran de la deuxième activité de commutation par glisser-déposer.

  1. Avant d’appeler le programme BAPI_USER_CHANGE, vérifiez que le nom d’utilisateur n’est pas vide. Après avoir réduit les deux activités ForEach, ajoutez l’activité IF après la seconde. Saisissez la condition : String.IsNullOrEmpty(userName ) = False.

  2. Si le champ du nom d’utilisateur est vide, nous devons indiquer l’échec de l’opération. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans la branche Else de votre activité IF et sélectionnez le code d’erreur ExportErrorCustomContinueRun. Votre workflow Export Replace ressemble à ceci : Capture d’écran de l’activité CreateCSEntryChangeResult.

  3. Faites glisser et déposez l’activité Sequence dans la branche vide Then de la première activité IF. Faites glisser et déposez l’activité WebSeviceCall à l’intérieur de l’activité Sequence. Sélectionnez le nom du service SAPECC, le point de terminaison ZSAPCONNECTORWS et l’opération BAPI_USER_CHANGE. Cliquez sur le bouton ... Arguments afin de définir les paramètres pour l’appel du service web selon les indications suivantes :

Nom Sens Type Value
ADDRESS Dans BAPIADDR3 address
ADDRESSX Dans BAPIADDR3X addressX
COMPANY Dans BAPIUSCOMP company
COMPANYX Dans BAPIUSCOMX company
DEFAULTS Dans BAPIDEFAUL defaults
DEFAULTSX Dans BAPIDEFAX defaultsX
LOGONDATA Dans BAPILOGOND logOnData
LOGONDATAX Dans BAPILOGONX logOnDataX
RETURN Entrée/Sortie TABLE_OF_BAPIRET2 bapiret2Table
USERNAME Dans Chaîne userName
  1. Cliquez sur OK. Le signe d’avertissement disparaît. Votre workflow Export Replace ressemble à ceci :

Capture d’écran de l’opération de BAPI_USER_CHANGE.

  1. Pour traiter les résultats des demandes utilisateur modifiées, faites glisser et déposez l’activité IF dans l’activité Sequence après l’activité WebServiceCall. Saisissez la condition suivante : Not IsNothing(bapiret2Table.item) AndAlso bapiret2Table.item.Count(Function(errItem) errItem.TYPE.Equals("E") = True) <> 0
  2. En l’absence d’erreurs, nous partons du principe que l’opération d’exportation a réussi, et nous voulons marquer cet objet comme exporté avec succès en créant un CSEntryChangeResult avec l’état Réussite. Faites glisser et déposez l’activité CreateCSEntryChangeResult dans la branche Else de votre activité IF et sélectionnez le code d’erreur Réussite.
  3. Faites glisser et déposez l’activité Sequence dans la branche Then de votre activité IF. Ajoutez l’activité Log avec la valeur LogText de string.Join("\n",bapiret2Table.item.Where(Function(retItem) retItem.TYPE.Equals("E")).Select(Function(r) r.MESSAGE)) et la balise Error. Ajoutez l’activité CreateCSEntryChangeResult après l’activité Log avec le code d’erreur ExportErrorCustomContinueRun. Votre workflow Export Replace ressemble à ceci :

Capture d’écran du workflow de remplacement d’une exportation finale.

Vous avez terminé la définition du workflow Export Replace.

L’étape suivante consiste à configurer le connecteur de service web ECMA2Host à l’aide de ce modèle.

Étapes suivantes