Skip To Content

Exemplo: Adicionar membros no portal

Este exemplo apresenta um arquivo de texto de entrada com informações sobre usuários e os adiciona no seu portal em massa. Defina e conceda o papel para cada usuário no seu portal.

Insira as seguintes informações exigidas ao executa o script:

  • O caminho para o arquivo de texto contendo as informações de usuário, por exemplo, C:\users.txt.
  • Os tipos de usuários que você deseja adicionar no portal, por exemplo, embutido ou enterprise. Para mais informações sobre tipos de usuários, consulte Gerenciando acesso ao seu portal.
  • Nome de domínio qualificado completo da máquina hospedando seu portal, por exemplo, myportal.acme.com. O script acessará seu portal por HTTPS na porta 7443, ignorando o ArcGIS Web Adaptor. Desta maneira, o script não precisa manter a autenticação em série da web se o seu portal estiver configurado para utilizá-lo.
  • O nome de usuário e senha de uma conta que tem privilégios administrativos no portal. Se você estiver adicionando contas embutidas, forneça as credenciais de qualquer membro do portal com privilégios administrativos. Se você estiver adicionando contas enterprise, utilize a conta inicial de administrador criada após instalar o Portal for ArcGIS.
Anotação:

A demonstração de como fazer com que os scripts do Python mantenham a autenticação em série da web está além do escopo deste exemplo.

Registrando contas enterprise

Ao registrar contas enterpise, o formato para cada entrada no arquivo de texto será como o seguinte:

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

  • login—O login enterprise para registrar.

    • Se estiver utilizando o Active Directory, este login estará no formato de sAMAccountName@DOMAIN. O nome de domínio deve ser todo em letras maiúsculas.
    • Se você estiver utilizando LDAP, o login corresponderá ao valor do userNameAttribute que você especificou ao configurar o armazenamento de identidade.
    • Se você estiver utilizando logins enterprise baseado em SAML, o valor de login especificado corresponderá ao atributo NameID no provedor de identidade do SAML.
  • endereço de e-mail—O e-mail associado ao login e correspondente ao valor no armazenamento de identidade. Se a conta de usuário não tiver um endereço de e-mail, forneça um valor falso ou genérico.

  • nome—O nome alternativo para o login utilizado na sua organização do ArcGIS. A maioria dos armazenamentos de identidade utiliza o nome completo do usuário como o nome alternativo padrão. Quando o usuário conecta ao site da web do portal, este nome aparece no topo do site da web.

  • papel—Este é o papel que o login enterprise terá na organização do ArcGIS. Os valores de papel válidos são usuário, publicador, admin ou <custom_role_name>, onde <custom_role_name> é o nome do papel personalizado (por exemplo, hostedservicepublisher).

    Validado:

    No Portal for ArcGIS 10.3 e versões anteriores, os valores aceitos para papéis não personalizados eram org_user, org_publisher e org_admin. No 10.3.1, estes valores foram rejeitados e substituídos pelos valores listados acima. Você pode continuar a utilizar os valores validados no 10.3.1, mas note que os valores podem não ser aceitos em versões futuras.

  • descrição—Opcionalmente, inclua texto para descrever a conta. Este valor não corresponde a qualquer atributo no armazenamento de identidade. As descrições não podem exceder 250 caracteres.

  • Idp UserName—Opcionalmente, especifique o nome de usuário da conta enterprise no provedor de identidade. Se este valor não for fornecido, o valor especificado para o parâmetro de login será utilizado.

Você é exigido para fornecer um valor de login, endereço de e-mail, nome e papel. A descrição e Idp UserName são opcionais. Para cada conta listada no arquivo, verifique se os valores que você inseriu para o login, endereço de e-mail e nome correspondem exatamente aos valores no seu armazenamento de identidade. O portal não conectará o seu armazenamento de identidade para validar estes valores.

A seguir está um exemplo de uma entrada para registrar uma conta enterprise no Diretório Ativo para o login jcho111, com um endereço de e-mail: jcho@domain.com e um nome completo: Jon Cho. O login é posicionado no papel de usuário (user) e é descrito como um usuário no departamento b.

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

A seguir está um exemplo de uma entrada para registrar uma conta enterprise a partir de um provedor de identidade do SAML. O login de usuário é rsmith@domain.com, com um endereço de e-mail de rsmith@domain.com e um nome completo de Robert Smith. O login é posicionado no papel de publicador (publisher) com um Idp UserName de rsmith@domain.com.

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

A seguir está um exemplo de uma entrada para registrar uma conta enterprise de LDAP para o login sjames4513, com um endereço de e-mail: sjames@domain.com e um nome completo: Sara James. O login é posicionado no papel de usuário (admin) e uma descrição é fornecida.

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

A seguir está um exemplo de uma entrada para registrar uma conta enterprise para o login srajhandas, com um endereço de e-mail: srajhandas@domain.com e um nome completo: Satish Rajhandas. O login é posicionado no papel de usuário (user).

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

A seguir está um exemplo de uma entrada para registrar uma conta enterprise a partir de um provedor de identidade do SAML. O login de usuário é djohnson308, com um endereço de e-mail: djohnson@domain.com e um nome completo: Daisha Johnson. O login é posicionado no papel de usuário (user), uma descrição é fornecida, e o Idp UserName é definido como djohnson@domain.com.

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

Adicionando contas do portal embutidas

Ao adicionar contas do portal embutidas, o formato para cada entrada no arquivo de texto será:

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

  • nome de usuário—O nome de usuário utilizado na conta embutida. Os nomes de usuários devem ser únicos; dois membros não podem ter o mesmo nome de usuário.
  • senha—A senha atribuída para a conta. Os usuários podem utilizar esta senha na primeira vez que se registrarem no portal, e assim alterar sua senha ao editar seu perfil.
  • endereço de e-mail—Fornece um endereço de e-mail para esta conta. Este parâmetro é exigido; então, você deve fornecer um valor para o endereço de e-mail mesmo que não seja um endereço válido.
  • nome—O nome alternativo da conta utilizada na sua organização do ArcGIS. Quando o usuário conecta ao site da web do portal, este nome aparece no topo do site da web do portal.
  • papel—O papel que a conta tem na organização do ArcGIS. Os valores de papel válidos são usuário, publicador, admin ou <custom_role_name>, onde <custom_role_name> é o nome do papel personalizado (por exemplo, hostedservicepublisher).
  • descrição—Opcionalmente, inclua texto para descrever a conta. As descrições não podem exceder 250 caracteres.

O seguinte é um exemplo de uma entrada que adiciona uma conta do portal embutida com o nome de usuário pub1 para Barbara Williams e uma conta de e-mail de bwilliams@domain.com. Também adiciona pub1 para o papel de publicador:

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

O seguinte é um exemplo de uma entrada que adiciona uma conta do portal embutida com o nome de usuário jcho para Jon Cho e uma conta de e-mail de jcho@domain.com. Também adiciona jcho para o papel de administrador e o descreve como o gerente GIS:

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:]))