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 specifici dell'organizzazione, utilizzare l'account amministratore iniziale dopo l'installazione di Portal for ArcGIS.
Nota:
Dimostrare come fare in modo che gli script di Python gestiscano l'autenticazione a livello web, esula dallo scopo di questo esempio.
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 NameIDnel 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:]))