Skip To Content

Exemple : ajouter des membres au portail

Dans cette rubrique

Cet exemple utilise en entrée un fichier texte contenant des informations sur les utilisateurs, puis les ajoute globalement à votre portail. Définissez et accordez le rôle à chaque utilisateur de votre portail.

Indiquez les informations obligatoires suivantes lorsque vous exécutez le script :

  • Chemin d'accès au fichier texte contenant des informations sur l'utilisateur, par exemple /home/admin/documents/users.txt.
  • Type d'utilisateur à ajouter au portail, par exemple intégré ou entreprise. Pour en savoir plus sur les types d'utilisateurs, reportez-vous à la rubrique Gestion de l'accès à votre portail.
  • Nom de domaine complet de la machine hébergeant votre portail, par exemple myportal.acme.com. Le script accède au portail via HTTPS sur le port 7443 en évitant ArcGIS Web Adaptor. De cette manière, le script ne doit pas gérer l'authentification au niveau du Web si votre portail est configuré pour l'utiliser.
  • Nom d'utilisateur et mot de passe d'un compte détenteur de privilèges administratifs sur le portail. Si vous ajoutez des comptes intégrés, vous pouvez indiquer les informations d'identification de tous les membres du portail détenteurs de privilèges administratifs. Si vous ajoutez des comptes d'entreprise, utilisez le compte d'administrateur initial créé après l'installation de Portal for ArcGIS.
Remarque :

nous n'expliquerons pas dans cet exemple la prise en charge de l'authentification au niveau du Web par des scripts Python.

Enregistrement de comptes d'entreprise

Lorsque vous enregistrez des comptes d'entreprise, le format de chaque entrée du fichier texte est le suivant :

<login>|<email address>|<name>|<role>|<description>|<Idp UserName>

  • identifiant de connexion : identifiant de connexion d'entreprise à inscrire.

    • Si vous utilisez Active Directory, cet identifiant de connexion a le format suivant : sAMAccountName@DOMAIN. Le nom de domaine doit être entièrement en lettres majuscules.
    • Si vous utilisez le protocole LDAP, l'identifiant de connexion correspond à la valeur userNameAttribute que vous avez spécifiée lors de la configuration du magasin d'identifiants.
    • Si vous utilisez des identifiants d'entreprise basés sur SAML, la valeur de connexion spécifiée correspond à l'attribut NameID du fournisseur d'identités SAML.
  • adresse électronique : adresse électronique associée à l'identifiant de connexion correspondant à la valeur figurant dans le magasin d'identifiants. Si le compte utilisateur ne possède pas d'adresse électronique, indiquez la valeur false ou une valeur générique.

  • nom : alias de l'identifiant de connexion utilisé dans votre organisation ArcGIS. La plupart des magasins d'identifiants utilisent le nom complet de l'utilisateur comme alias par défaut. Lorsque l'utilisateur se connecte au site Web du portail, ce nom figure dans la partie supérieure du site Web.

  • role : rôle qu'aura le nom de connexion d'entreprise dans l'organisation ArcGIS. Les valeurs de rôles valides sont utilisateur, éditeur, admin ou <nom_rôle_personnalisé>, où <nom_rôle_personnalisé> est le nom du rôle personnalisé (par exemple, hostedservicepublisher).

    Héritage :

    Dans Portal for ArcGIS 10.3 et les versions antérieures, les valeurs acceptées des rôles non personnalisés étaient org_user, org_publisher et org_admin. Dans la version 10.3.1, ces valeurs n'existent plus et ont été remplacées par les valeurs indiquées ci-dessus. Vous pouvez continuer d'utiliser les anciennes valeurs dans la version 10.3.1, mais notez que les valeurs pourront ne pas être acceptées dans une version future.

  • description : vous pouvez éventuellement inclure du texte pour décrire le compte. Cette valeur ne correspond à aucun attribut du magasin d'identifiants. Une description ne doit pas comporter plus de 250 caractères.

  • Idp UserName : vous pouvez également indiquer le nom d'utilisateur du compte d'entreprise au fournisseur d'identités. Si cette valeur n'est pas communiquée, la valeur spécifiée dans le paramètre de connexion est utilisée à la place.

Vous devez saisir une valeur pour l'identifiant de connexion, l'adresse électronique, le nom et le rôle. La description et la valeur Idp UserName sont facultatives. Pour chaque compte répertorié dans le fichier, vérifiez que les valeurs entrées pour l'identifiant de connexion, l'adresse électronique et le nom correspondent exactement à celles figurant dans votre magasin d'identifiants. Le portail ne se connectera pas à votre magasin d'identifiants pour valider ces valeurs.

Vous trouverez ci-après un exemple d'entrée permettant d'inscrire un compte d'entreprise Active Directory pour l'identifiant de connexion jcho111, avec l'adresse électronique jcho@domain.com et le nom complet Jon Cho. L'identifiant de connexion est placé dans le rôle d'utilisateur (utilisateur) et il est décrit comme un utilisateur du service b.

jcho111@DOMAIN|jcho@domain.com|Jon Cho|user|department b

Vous trouverez ci-après un exemple d'entrée permettant d'inscrire un compte d'entreprise d'un fournisseur d'identités SAML. L'identifiant de connexion de l'utilisateur est rsmith@domain.com, son adresse électronique est rsmith@domain.com et le nom complet est Robert Smith. L'identifiant de connexion est associé au rôle d'éditeur (éditeur) avec une valeur Idp UserName équivalente à rsmith@domain.com.

rsmith@domain.com|rsmith@domain.com|Robert Smith|publisher||rsmith@domain.com

Vous trouverez ci-après un exemple d'entrée permettant d'inscrire un compte d'entreprise LDAP pour l'identifiant de connexion sjames4513, avec l'adresse électronique sjames@domain.com et le nom complet Sara James. L'identifiant de connexion est placé dans le rôle d'utilisateur (administrateur) et une description est fournie.

sjames4513@DOMAIN|sjames@domain.com|Sara James|admin|Department Lead and GIS Manager

Vous trouverez ci-après un exemple d'entrée permettant d'inscrire un compte d'entreprise pour l'identifiant de connexion srajhandas, avec l'adresse électronique srajhandas@domain.com et le nom complet Satish Rajhandas. L'identifiant de connexion est placé dans le rôle d'utilisateur (utilisateur).

srajhandas@DOMAIN|srajhandas@domain.com|Satish Rajhandas|user

Vous trouverez ci-après un exemple d'entrée permettant d'inscrire un compte d'entreprise d'un fournisseur d'identités SAML. L'identifiant de connexion de l'utilisateur est djohnson308, son adresse électronique est djohnson@domain.com et le nom complet est Daisha Johnson. L'identifiant de connexion est placé dans le rôle d'utilisateur (utilisateur), une description est fournie et la valeur d'Idp UserName est djohnson@domain.com.

djohnson308@DOMAIN|djohnson@domain.com|Daisha Johnson|user|Account Specialist|djohnson@domain.com

Ajout de comptes de portail intégrés

Lorsque vous ajoutez des comptes de portail intégrés, le format de chaque entrée dans le fichier texte est le suivant :

<username>|<password>|<email address>|<name>|<role>|<description>

  • nom d'utilisateur : nom d'utilisateur utilisé pour le compte intégré. Les noms d'utilisateurs doivent être uniques. Deux membres ne peuvent pas avoir le même nom d'utilisateur.
  • mot de passe : mot de passe attribué au compte. Les utilisateurs peuvent utiliser ce mot de passe la première fois qu'ils se connectent au portail et peuvent ensuite changer leur mot de passe en modifiant leur profil.
  • email address : fournissez une adresse électronique pour ce compte. Ce paramètre est obligatoire. Par conséquent, vous devez fournir une valeur pour l'adresse électronique, même si ce n'est pas une adresse valide.
  • nom : alias du compte utilisé dans votre organisation ArcGIS. Lorsque l'utilisateur se connecte au site Web du portail, ce nom figure dans la partie supérieure du site Web du portail.
  • rôle : rôle du compte dans l'organisation ArcGIS. Les valeurs de rôles valides sont utilisateur, éditeur, admin ou org_<nom_rôle_personnalisé>, où <nom_rôle_personnalisé> est le nom du rôle personnalisé (par exemple, org_hostedservicepublisher).
  • description : vous pouvez éventuellement inclure du texte pour décrire le compte. Une description ne doit pas comporter plus de 250 caractères.

Voici un exemple d'entrée qui permet d'ajouter un compte de portail intégré avec le nom d'utilisateur pub1 pour Barbara Williams et le compte de messagerie bwilliams@domain.com. Il permet également d'ajouter pub1 au rôle d'éditeur :

pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|publisher

Voici un exemple d'entrée qui permet d'ajouter un compte de portail intégré avec le nom d'utilisateur jcho pour Jon Cho et le compte de messagerie jcho@domain.com. Il ajoute également jcho au rôle d'administrateur et le décrit en tant que responsable SIG :

jcho|changepasswordlater|jcho@domain.com|Jon Cho|admin|GIS Manager

#!/usr/bin/env python
# Requires Python 2.7+

# Demonstrates how to add users to Portal for ArcGIS in bulk

# For Http calls
import httplib, urllib2, urllib, json
# For system tools
import sys, os
# For reading passwords without echoing
import getpass
# Other utilities
import Queue

# Defines the entry point into the script
def main(argv):

    print "This script adds users in bulk into a portal. \n"

    #Get parameters
    parameters = getParametersFromUser ()

    portalURL = parameters['portalURL']
    provider = parameters['provider']
    userName = parameters['userName']
    password = parameters['password']
    inUserFile = parameters['inUserFile']


    #Get user data from file
    usersData = getUserDataFromFile(inUserFile,provider)

    #Create users
    createUsers (userName,password, portalURL,provider, usersData)

    raw_input('Press ENTER to close the script.')

    return


# This function loads all the user data in the input text file into a Python Queue.
# This usersQueue can be later passed to the createUsers function
def getUserDataFromFile(inUserFile,provider):


    usersQ = Queue.Queue()
    keyParams = ['username', 'password', 'email', 'fullname','role','description']

    inFileHandle = open(inUserFile, 'r')
    userCount = 0
    print '...Processing input users file at: ' + inUserFile
    entryCount = 1;
    for line in inFileHandle.readlines():
        userParams = line.split('|')
        userParamDict = {}
        if provider=="webadaptor":
            if len(userParams) == 5:
                for i in range (0,5):
                    userParamDict[keyParams[0]] = userParams[0]  # login
                    userParamDict[keyParams[1]] = ""
                    userParamDict[keyParams[2]] = userParams[1]  # email address
                    userParamDict[keyParams[3]] = userParams[2]  # name
                    userParamDict[keyParams[4]] = userParams[3]  # role
                    userParamDict[keyParams[5]] = userParams[4].replace('\n','')  # description
                usersQ.put (userParamDict)
                userCount = userCount + 1
            else:
                print ' The format for entry %s is invalid.  The format for enterprise accounts should be <login>|<email address>|<name>|<role>|<description>. \n '% (entryCount)

                raise SystemExit( 'When registering enterprise accounts, the format for each entry is as follows: <login>|<email address>|<name>|<role>|<description>')
        elif provider=="arcgis":
            if len(userParams) == 6:
                for i in range (0,6):
                    userParamDict[keyParams[0]] = userParams[0]  # account
                    userParamDict[keyParams[1]] = userParams[1]  # password
                    userParamDict[keyParams[2]] = userParams[2]  # email address
                    userParamDict[keyParams[3]] = userParams[3]  # name
                    userParamDict[keyParams[4]] = userParams[4]  # role
                    userParamDict[keyParams[5]] = userParams[5].replace('\n','')  # description
                usersQ.put (userParamDict)
                userCount = userCount + 1
            else:
                print ' The format for entry %s is invalid.  The format for built-in portal accounts should be <account>|<password>|<email address>|<name>|<role>|<description>.  \n '% (entryCount)
                raise SystemExit( 'When registering built-in portal accounts, the format for each entry is as follows: <account>|<password>|<email address>|<name>|<role>|<description>')
        else:
            print '   The provider is incorrect. Script ended. \n'
            raise SystemExit( 'The value for the user type is invalid. ')
        entryCount = entryCount +1
        if not ((userParamDict[keyParams[4]].lower()== "user") or (userParamDict[keyParams[4]].lower()=="publisher") or (userParamDict[keyParams[4]].lower()== "admin")):
            raise SystemExit( 'The value for the user role %s in users text file is invalid.  Accepted values are user or publisher or admin. ' % (userParamDict[keyParams[4]]))
    inFileHandle.close()
    # Create users and report results
    print '...Total members to be added: ' + str(userCount)

    return usersQ


# This function connects to the portal and adds members to it from a collection
def createUsers(username,password, portalUrl, provider,userParamsQ):

    print '...Connecting to ' + portalUrl
    token = generateToken(username,password, portalUrl)
    print '...Adding users '
    usersLeftInQueue = True
    while usersLeftInQueue:
        try:
            userDict = userParamsQ.get(False)
            userDict['f'] = 'json'
            userDict['token'] = token
            userDict['provider'] = provider
            params = urllib.urlencode(userDict)

            request = urllib2.Request(portalUrl + '/portaladmin/security/users/createUser?',params, { 'Referer' : portalUrl })

            # POST the create request
            response = urllib2.urlopen(request).read()
            responseJSON = json.loads(response)

            # Log results
            if responseJSON.has_key('error'):
                errDict = responseJSON['error']
                if int(errDict['code'])==498:
                    message = 'Token Expired. Getting new token... Username: ' + userDict['username'] + ' will be added later'
                    token = generateToken(username,password, portalUrl)
                    userParamsQ.put(userDict)
                else:
                    message =  'Error Code: %s \n Message: %s' % (errDict['code'],
                    errDict['message'])
                print '\n' + message
            else:
                # Success
                if responseJSON.has_key('status'):
                    resultStatus = responseJSON['status']
                    print '\n' + 'User: %s account created' % (userDict['username'])

                    print 'User: %s account created' % (userDict['username'])
        except Queue.Empty:
              usersLeftInQueue = False

# This function gets a token from the portal
def generateToken(username, password, portalUrl):
    '''Retrieves a token to be used with API requests.'''
    parameters = urllib.urlencode({'username' : username,
                                   'password' : password,
                                   'client' : 'referer',
                                   'referer': portalUrl,
                                   'expiration': 60,
                                   'f' : 'json'})
    try:
        response = urllib.urlopen(portalUrl + '/sharing/rest/generateToken?',
                              parameters).read()
    except Exception as e:
        raise SystemExit( 'Unable to open the url %s/sharing/rest/generateToken' % (portalUrl))
    responseJSON =  json.loads(response.strip(' \t\n\r'))
    # Log results
    if responseJSON.has_key('error'):
        errDict = responseJSON['error']
        if int(errDict['code'])==498:
            message = 'Token Expired. Getting new token... '
            token = generateToken(username,password, portalUrl)
        else:
            message =  'Error Code: %s \n Message: %s' % (errDict['code'],
            errDict['message'])
            raise SystemExit(message)
    token = responseJSON.get('token')
    return token

# This function gets gets parameters from the user in interactive mode
def getParametersFromUser():

    parameters = {}
    # Get Location of users file
    inUserFile = raw_input ("Enter path to users text file: ")
    if not os.path.exists(inUserFile):
        print '   File does not exist. Script ended. \n'
        raise SystemExit( 'Input file: %s does not exist' % (inUserFile))
    parameters['inUserFile'] = inUserFile

    # Enteprise logins or built-in accounts?
    userInput = raw_input ("What type of users do you want to add to the portal?  Accepted values are built-in or enterprise: ")
    if userInput.lower()=="built-in":
        parameters['provider'] = 'arcgis'
        print '   Built-in accounts will be added to the portal. \n'
    elif userInput.lower()=="enterprise":
        parameters['provider'] = 'webadaptor'
        print '   Enterprise accounts will be added to the portal. \n'
    else:
        print '   The type of users is incorrect. Script ended. \n'
        raise SystemExit( 'The value entered for the user type %s is invalid.  Accepted values are built-in or enterprise. ' % (userInput))

    # Get Portal URL
    hostname = raw_input("Enter the fully qualified portal hostname (for example myportal.acme.com): ")
    parameters['portalURL'] = 'https://' + hostname + ':7443/arcgis'
    print '   Users will be added to portal at: ' + parameters['portalURL'] + '\n'

    # Get a username and password with portal administrative privileges
    parameters['userName'] = raw_input("Enter a built-in user name with portal administrative privileges:")

    parameters['password'] = raw_input("Enter password: ")
    print '\n'

    return  parameters

# Script start
if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))