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. Puede definir qué rol se concederá a cada usuario en el portal.
Debe indicar la siguiente información cuando ejecute la secuencia de comandos:
- Ruta al archivo de texto que contiene la información de usuario, por ejemplo, C:\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 accederá 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 está agregando cuentas integradas, puede proporcionar las credenciales de cualquier miembro del portal con privilegios administrativos. Si está agregando cuentas corporativas, debe usar la cuenta de administrador inicial creada después de instalar Portal for ArcGIS.

Demostrar cómo hacer que las secuencias de comandos Python manejen la autenticación a nivel web trasciende el ámbito de este ejemplo.
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 utilizar para la cuenta integrada. Los nombres de usuario deben ser exclusivos; no puede haber dos miembros que tengan el mismo.
- Contraseña: Contraseña que se debe asignar 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: El nombre es el alias de la cuenta que se utilizará en la 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: Nombre del rol que la cuenta tendrá en la organización de ArcGIS. Los valores de rol válidos son org_user, org_publisher y org_admin.
- Descripción: Opcionalmente, se puede incluir texto para describir la cuenta. La descripción no puede superar los 250 caracteres.
Este ejemplo agrega una cuenta integrada del portal con el nombre de usuario pub1 para Barbara Williams, con la dirección de correo electrónico bwilliams@domain.com. También agrega pub1 al rol de publicador y lo describe como miembro del departamento de planificación:
pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|org_publisher|planning department
Registro de cuentas corporativas
Para registrar cuentas corporativas, el formato de cada entrada en el archivo de texto es como sigue:
<username>|<email address>|<name>|<role>|<description>
- Nombre de usuario: El nombre de usuario es la cuenta corporativa que registrar. Si está utilizando Active Directory, el nombre de usuario debe tener la forma sAMAccountName@DOMAIN. El nombre de dominio debe estar todo en mayúsculas. Si está utilizando LDAP, el inicio de sesión debe coincidir con el valor del userNameAttribute especificado al configurar el almacén de identidades.
- Dirección de correo electrónico: La dirección de correo electrónico debe ser la asociada a la cuenta y debe coincidir con el valor del almacén de identidades. Si la cuenta de usuario no dispone de una dirección de correo electrónico, proporcione un valor falso o genérico.
- Nombre: El nombre es el alias del nombre de usuario que se utilizará en la 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 portal, este nombre aparece en la parte superior del sitio web.
- Rol: Nombre del rol que la cuenta tendrá en la organización de ArcGIS. Los valores de rol válidos son org_user, org_publisher y org_admin.
- 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.
Debe proporcionar un valor para el nombre de usuario, la dirección de correo electrónico, nombre y rol. La descripción es opcional. 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 para el nombre de usuario jcho111, con la dirección de correo electrónico jcho@domain.com y John Cho como nombre completo. El nombre de usuario se coloca en el rol de usuario (org_user) y se describe como usuario del departamento b:
jcho111@DOMAIN|jcho@domain.com|Jon Cho|org_user|department b
#!/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)
print '\n ...Script ended. '
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()== "org_user") or (userParamDict[keyParams[4]].lower()=="org_publisher") or (userParamDict[keyParams[4]].lower()== "org_admin")):
raise SystemExit( 'The value for the user role %s in users text file is invalid. Accepted values are org_user or org_publisher or org_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)
# 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:]))