Skip To Content

Ejemplo: agregar miembros al portal

En este ejemplo se toma un archivo de texto de entrada con información sobre usuarios y se les añade al portal en bloque. Defina y asigne el rol de cada usuario del portal.

Introduzca la siguiente información obligatoria cuando ejecute la secuencia de comandos:

  • Ruta al archivo de texto que contiene la información de usuario, por ejemplo, /home/admin/documents/users.txt.
  • Tipo de usuarios que desee agregar al portal, por ejemplo, integrados o corporativos. Para obtener más información sobre tipos de usuario, consulte Administrar el acceso al portal.
  • El nombre de dominio completo de la máquina que aloja su portal, por ejemplo, myportal.acme.com. La secuencia de comandos accede a su portal a través de HTTPS en el puerto 7443 omitiendo ArcGIS Web Adaptor. De este modo, la secuencia de comandos no necesita manejar autenticación a nivel web si su portal está configurado para usarla.
  • El nombre de usuario y la contraseña de una cuenta que tenga privilegios administrativos en el portal. Si desea agregar cuentas integradas, proporcione las credenciales de cualquier miembro del portal con privilegios administrativos. Si desea agregar cuentas corporativas, debe usar la cuenta inicial de administrador creada después de instalar Portal for ArcGIS.
Nota:

Demostrar cómo hacer que las secuencias de comandos Python manejen la autenticación a nivel web trasciende el ámbito de este ejemplo.

Registro de cuentas corporativas

Para registrar cuentas corporativas, el formato de cada entrada en el archivo de texto es como sigue:

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

  • Inicio de sesión: inicio de sesión corporativo que se debe registrar.

    • Si está utilizando Active Directory, este inicio de sesión debe tener el formato sAMAccountName@DOMAIN. El nombre de dominio debe estar todo en mayúsculas.
    • Si utiliza LDAP, el inicio de sesión coincide con el valor del userNameAttribute especificado al configurar el almacén de identidades.
    • Si utiliza inicios de sesión corporativos basados en SAML, el valor del inicio de sesión especificado coincide con el atributo NameID del proveedor de identidad SAML.
  • Dirección de correo electrónico: dirección de correo electrónico asociada con el inicio de sesión, que coincide con el valor del almacén de identidad. Si la cuenta de usuario no dispone de una dirección de correo electrónico, proporcione un valor falso o genérico.

  • Nombre: alias del inicio de sesión que se utilizará en su organización de ArcGIS. La mayoría de almacenes de identidades utilizan el nombre completo del usuario como alias predeterminado. Cuando el usuario se conecta al sitio web del portal, este nombre aparece en la parte superior del sitio web.

  • Rol: Nombre del rol que el nombre del usuario corporativo tendrá en la organización de ArcGIS. Los valores de roles válidos son usuario, publicador, administrador o <custom_role_name>, donde <custom_role_name> es el nombre del rol personalizado (por ejemplo, hostedservicepublisher).

    Legado:

    En Portal for ArcGIS 10.3 y versiones anteriores, los valores aceptados de roles no personalizados eran org_user, org_publisher y org_admin. En 10.3.1, estos valores se han desaprobado y reemplazado por los valores indicados arriba. Puede continuar usando los valores heredados en 10.3.1, pero tenga en cuenta que es posible que los valores no se acepten en una versión futura.

  • Descripción: opcionalmente, se puede incluir texto para describir la cuenta. Este valor no corresponde a ningún atributo del almacén de identidades. La descripción no puede superar los 250 caracteres.

  • Idp UserName: si lo desea, especifique el nombre de usuario de la cuenta corporativa en el proveedor de identidad. Si no se proporciona este valor, se usa el especificado para el parámetro de inicio de sesión.

Debe proporcionar un valor para el inicio de sesión, la dirección de correo electrónico, nombre y rol. La descripción e Idp UserName son opcionales. Para cada cuenta mostrada en el archivo, compruebe que los valores introducidos para el inicio de sesión, dirección de correo electrónico y nombre coincidan exactamente con los valores del almacén de identidades. El portal no se conectará al almacén de identidades para validar dichos valores.

A continuación se muestra un ejemplo de una entrada para registrar una cuenta corporativa de Active Directory para el nombre de usuario jcho111, con la dirección de correo electrónico jcho@domain.com y John Cho como nombre completo. El inicio de sesión se coloca en el rol de usuario (usuario) y se describe como usuario del departamento b.

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

A continuación se muestra un ejemplo de una entrada para registrar una cuenta corporativa de un proveedor de identidad SAML. El inicio de sesión del usuario es rsmith@domain.com, con la dirección de correo electrónico rsmith@domain.com y el nombre completo Robert Smith. El inicio de sesión se coloca en el rol de publicador (publicador) con un ajuste de Idp UserName igual a rsmith@domain.com.

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

A continuación se muestra un ejemplo de una entrada para registrar una cuenta corporativa LDAP para el inicio de sesión sjames4513, con la dirección de correo electrónico sjames@domain.com y el nombre completo Sara James. El inicio de sesión se coloca en el rol de usuario (administrador) y se proporciona una descripción.

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

A continuación se muestra un ejemplo de una entrada para registrar una cuenta corporativa para el inicio de sesión srajhandas, con la dirección de correo electrónico srajhandas@domain.com y Satish Rajhandas como nombre completo. El inicio de sesión se coloca en el rol de usuario (usuario).

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

A continuación se muestra un ejemplo de una entrada para registrar una cuenta corporativa de un proveedor de identidad SAML. El inicio de sesión del usuario es djohnson308, con la dirección de correo electrónico djohnson@domain.com y el nombre completo Daisha Johnson. El inicio de sesión se coloca en el rol de usuario (usuario), se proporciona una descripción y se define Idp UserName como djohnson@domain.com.

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

Adición de cuentas del portal integradas

Al agregar cuentas integradas del portal, el formato de cada entrada del archivo de texto es el siguiente:

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

  • Nombre de usuario: el nombre de usuario que se utiliza para la cuenta integrada. Los nombres de usuario deben ser exclusivos; no puede haber dos miembros que tengan el mismo.
  • Contraseña: la contraseña asignada a la cuenta. Los usuarios pueden usar esta contraseña la primera vez que inician la sesión en el portal y, a continuación, pueden cambiarla modificando su perfil.
  • Dirección de correo electrónico: Dirección de correo electrónico para la cuenta. Este parámetro es obligatorio. Por consiguiente, deberá proporcionar un valor de la dirección de correo electrónico aunque no sea una dirección válida.
  • Nombre: alias de la cuenta que se utilizará en su organización de ArcGIS. Cuando el usuario se conecta al sitio web portal, este nombre aparece en la parte superior del sitio web del portal.
  • Rol: rol que tiene la cuenta en la organización de ArcGIS. Los valores de roles válidos son usuario, publicador, administrador o <custom_role_name>, donde <custom_role_name> es el nombre del rol personalizado (por ejemplo, hostedservicepublisher).
  • Descripción: opcionalmente, se puede incluir texto para describir la cuenta. La descripción no puede superar los 250 caracteres.

El siguiente ejemplo muestra una entrada que agrega una cuenta integrada del portal con el nombre de usuario pub1 para Barbara Williams y la dirección de correo electrónico bwilliams@domain.com. También agrega pub1 al rol de publicador:

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

El siguiente ejemplo muestra una entrada que agrega una cuenta integrada del portal con el nombre de usuario jcho para Jon Cho y la dirección de correo electrónico jcho@domain.com. También agrega jcho al rol de administrador y lo describe como administrador de 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:]))