Skip To Content

Esempio: aggiungere membri al portale

In questo esempio viene utilizzato come input un file di testo contenente informazioni sugli utenti che verranno aggiunte in blocco al portale. Definire e concedere il ruolo per ogni utente del portale.

Immettere le seguenti informazioni obbligatorie durante l'esecuzione dello script:

  • Percorso del file di testo che contiene le informazioni dell'utente; ad esempio, C:\users.txt.
  • Tipo di utenti che si desidera aggiungere al portale, ad esempio incorporato o aziendale. Per ulteriori informazioni sui tipi di utente, consultare Gestire l'accesso al portale.
  • Nome di dominio completo del computer che ospita il portale, ad esempio mioportale.acme.com. Lo script accederà al portale tramite la porta 7443 HTTPS, ignorando quindi ArcGIS Web Adaptor. In tal modo non dovrà gestire l'autenticazione a livello Web nel caso in cui il portale sia configurato per l'uso di tale autenticazione.
  • Nome utente e password di un account con privilegi amministrativi per il portale. Se si intende aggiungere account incorporati, fornire le credenziali di qualsiasi membro con privilegi amministrativi. Se si intende aggiungere account aziendali, utilizzare l'account amministratore iniziale creato dopo l'installazione di Portal for ArcGIS.
Nota:

In questo esempio non verrà illustrato come gestire l'autenticazione a livello web tramite script di Python.

Registrare account aziendali

Quando si registrano account aziendali, il formato per ciascuna voce immessa nel file di testo è il seguente:

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

  • login: account di accesso aziendale da registrare.

    • Se si utilizza Active Directory, il formato dell'account di accesso deve essere sAMNomeAccount@DOMINIO. Il nome di dominio deve essere specificato in maiuscolo.
    • Se si utilizza LDAP, l'account di accesso deve corrispondere al valore di userNameAttribute specificato durante la configurazione dell'archivio identità.
    • Se si intende utilizzare account aziendali basati su SAML, il valore di login specificato corrisponde all'attributo NameID nel provider di identità SAML.
  • email address: indirizzo e-mail associato all'account di accesso che corrisponde al valore dell'archivio identità. Se l'account utente non dispone di un indirizzo di posta elettronica, specificarne uno falso o generico.

  • name: alias dell'account di accesso utilizzato nell'organizzazione ArcGIS. Per la maggior parte degli archivi identità viene utilizzato il nome completo dell'utente come alias predefinito. Quando l'utente è connesso al Portale Web, questo nome verrà visualizzato nella parte superiore della finestra.

  • tipo di utente: nome del tipo di utente cui l'utente sarà assegnato. Selezionare un tipo di utente disponibile dall'elenco a discesa. È possibile cliccare sul conteggio dei ruoli compatibili e delle licenze aggiuntive compatibili per scoprire cosa è compatibile con il tipo di utente selezionato. Per ulteriori informazioni, vedere Tipi di utente, ruoli e privilegi.
  • role: corrisponde al ruolo dell'account di accesso aziendale nell'organizzazione ArcGIS. I valori di ruolo validi sono utente, editore, amministratore o <nome_ruolo_personalizzato>, dove <nome_ruolo_personalizzato> è il nome del ruolo personalizzato (ad esempio hostedservicepublisher).

    Legacy:

    In Portal for ArcGIS 10.3 e versioni precedenti, i valori consentiti per i ruoli non personalizzati sono org_user, org_publisher e org_admin. Nella versione 10.3.1, questi valori sono stati sostituiti dai valori indicati sopra. È possibile continuare a utilizzare i valori legacy nella versione 10.3.1, ma tali valori potrebbero non essere accettati nelle versioni future.

  • description: se si desidera, includere una descrizione dell'account. Questo valore non corrisponde a nessun attributo nell'archivio identità. Le descrizioni non possono superare i 250 caratteri

  • Idp UserName: facoltativamente, specificare il nome utente dell'account aziendale nel provider di identità. Se questo valore non viene specificato, verrà usato quello specificato per il parametro login.

È necessario fornire un valore per login, email address, name e role. I valori description e Idp UserName sono facoltativi. Per ogni account elencato nel file, verificare i valori immessi per login, email address e name e assicurarsi che siano uguali a quelli dell'archivio identità. Il portale non si connetterà all'archivio identità per convalidare tali valori.

Nell'esempio seguente viene illustrato il comando per registrare un account aziendale Active Directory per l'account di accesso jcho111, il cui indirizzo di posta elettronica è jcho@domain.com e il cui nome completo è Jon Cho. All'account di accesso viene assegnato il ruolo utente (utente) e il tipo di utente Viewer e nella descrizione viene specificato che si tratta di un utente del reparto b.

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

Nell'esempio seguente viene illustrato il comando per registrare un account aziendale da un provider di identità SAML. L'account di accesso dell'utente è rsmith@domain.com, il cui indirizzo e-mail è rsmith@domain.com e il cui nome completo è Robert Smith. All'account di accesso viene assegnato il ruolo editore (editore) e il tipo di utente Creator con Idp UserName rsmith@domain.com.

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

Nell'esempio seguente viene illustrato il comando per registrare un account aziendale per l'account di accesso sjames4513, il cui indirizzo di posta elettronica è sjames@domain.com e il cui nome completo è Sara James. All'account di accesso viene assegnato il ruolo utente (amministratore) e il tipo di utente GIS Professional e viene aggiunta una descrizione.

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

Nell'esempio seguente viene illustrato il comando per registrare un account aziendale per l'account di accesso srajhandas, il cui indirizzo di posta elettronica è srajhandas@domain.com e il cui nome completo è Satish Rajhandas. All'account di accesso viene assegnato il ruolo utente (utente) e il tipo di utente Viewer.

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

Nell'esempio seguente viene illustrato il comando per registrare un account aziendale da un provider di identità SAML. L'account di accesso dell'utente è djohnson308, il cui indirizzo e-mail è djohnson@domain.com e il cui nome completo è Daisha Johnson. All'account di accesso viene assegnato il ruolo utente (utente) e il tipo di utente Creator, viene fornita una descrizione e come valore di Idp UserName viene specificato djohnson@domain.com.

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

Aggiungere account incorporati del portale

Quando si aggiungono account incorporati del portale, il formato per ciascuna voce immessa nel file di testo è il seguente:

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

  • username: nome utente utilizzato per l'account incorporato. I nomi utente devono essere univoci; due membri non possono avere lo stesso nome.
  • password: password assegnata all'account. Gli utenti possono utilizzarla la prima volta che accedono al portale e quindi cambiarla modificando il proprio profilo.
  • email address: specificare un indirizzo di posta elettronica per l'account. Questo parametro è obbligatorio, pertanto è necessario specificare un valore per l'indirizzo di posta elettronica, anche se non è valido.
  • name: alias dell'account utilizzato nell'organizzazione ArcGIS. Quando l'utente è connesso al Portale Web, questo nome verrà visualizzato nella parte superiore della finestra del portale.
  • tipo di utente: nome del tipo di utente cui l'utente sarà assegnato. Selezionare un tipo di utente disponibile dall'elenco a discesa. È possibile cliccare sul conteggio dei ruoli compatibili e delle licenze aggiuntive compatibili per scoprire cosa è compatibile con il tipo di utente selezionato. Per ulteriori informazioni, vedere Tipi di utente, ruoli e privilegi.
  • role: ruolo dell'account nell'organizzazione ArcGIS. I valori di ruolo validi sono utente, editore, amministratore o <nome_ruolo_personalizzato>, dove <nome_ruolo_personalizzato> è il nome del ruolo personalizzato (ad esempio hostedservicepublisher).
  • description: se si desidera, includere una descrizione dell'account. Le descrizioni non possono superare i 250 caratteri

Il seguente è un esempio di voce che aggiunge un account del portale predefinito il cui nome utente è pub1 per Barbara Williams e il cui indirizzo e-mail è bwilliams@domain.com. Il nome utente pub1 viene inoltre aggiunto al ruolo di editore:

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

Quello seguente è un esempio di voce che aggiunge un account del portale predefinito il cui nome utente è jcho per Jon Cho e il cui indirizzo e-mail è jcho@domain.com. Il nome utente jcho viene inoltre aggiunto al ruolo di amministratore e nella descrizione viene specificato che si tratta di un responsabile GIS:

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

#!/usr/bin/env python
# Requires Python 2.7+
# Demonstrates how to add users to the ArcGIS Enterprise portal in bulk
# For Http calls
import 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()
    inFileHandle = open(inUserFile, 'r')
    userCount = 0
    print '...Processing input users file at: ' + inUserFile
    entryCount = 1
    roleID = {'admin':'org_admin', 'publisher':'org_publisher', 'user':'org_user', 'viewer':'iAAAAAAAAAAAAAAA'}
    for line in inFileHandle.readlines():
        userParams = line.strip('\n').split('|')
        userParamDict = {}
        if provider=="enterprise":
            keyParams = ['username', 'email', 'fullname', 'role', 'userLicenseTypeId', 'description', 'idpUsername', 'firstname', 'lastname']
            if len(userParams) == len(keyParams):
                for i, param in enumerate(keyParams):
                    userParamDict[param] = userParams[i]
                if userParamDict['role'] in roleID.keys():
                    userParamDict['role'] = roleID[userParamDict['role']]
                else:
                    print('The value for the user role "{}" in users text file is invalid.'.format(userParamDict['role']))
                    print('Accepted values are viewer, user, publisher, or admin.')
                    raise SystemExit('Invalid user role')
                usersQ.put(userParamDict)
                userCount = userCount + 1
            else:
                print('The format for entry "{}" is invalid.\nThe format for enterprise accounts is:'.format(line.strip('\n')))
                print(' <login>|<email address>|<full name>|<role>|<user type id>|<description>|<idp username>|<first name>|<last name>')
                raise SystemExit('Invalid format')
        elif provider=="arcgis":
            keyParams = ['username', 'password', 'email', 'fullname', 'role', 'userLicenseTypeId', 'description', 'firstname', 'lastname']
            if len(userParams) == len(keyParams):
                for i, param in enumerate(keyParams):
                    userParamDict[param] = userParams[i]
                if userParamDict['role'] in roleID.keys():
                    userParamDict['role'] = roleID[userParamDict['role']]
                else:
                    print('The value for the user role "{}" in users text file is invalid.'.format(userParamDict['role']))
                    print('Accepted values are viewer, user, publisher, or admin.')
                    raise SystemExit('Invalid user role')
                usersQ.put (userParamDict)
                userCount = userCount + 1
            else:
                print('The format for entry "{}" is invalid.\nThe format for built-in accounts is:'.format(line.strip('\n')))
                print(' <account>|<password>|<email address>|<full name>|<role>|<description>|<first name>|<last name>|<level>')
                raise SystemExit('Invalid format')
        else:
            raise SystemExit( 'The value for the user type is invalid. ')
        entryCount = entryCount +1
    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 'User: %s account created' % (userDict['username'])
        except Queue.Empty:
              usersLeftInQueue = False
# This function gets a token from the portal
def generateToken(username, password, portalUrl):
    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):
        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'] = 'enterprise'
        print '   Enterprise accounts will be added to the portal. \n'
    else:
        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'] = getpass.getpass("Enter password: ")
    print '\n'
    return  parameters
# Script start
if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))