Exemple : ajouter des membres au portail
Cet exemple utilise en entrée un fichier texte contenant des informations sur les utilisateurs, puis les ajoute globalement à votre portail. Vous pouvez définir le rôle qui sera affecté à chacun des utilisateurs de votre portail.
Vous devez saisir les informations suivantes lorsque vous exécutez le script :
- Chemin d'accès au fichier texte contenant des informations sur l'utilisateur, par exemple /home/admin/documents/users.txt.
- Type d'utilisateur à ajouter au portail, par exemple intégré ou entreprise. Pour en savoir plus sur les types d'utilisateurs, reportez-vous à la rubrique Gestion de l'accès à votre portail.
- Nom de domaine complet de la machine hébergeant votre portail, par exemple myportal.acme.com. Le script accèdera au portail via HTTPS sur le port 7443 en évitant ArcGIS Web Adaptor. De cette manière, le script ne doit pas gérer l'authentification au niveau du Web si votre portail est configuré pour l'utiliser.
- Nom d'utilisateur et mot de passe d'un compte détenteur de privilèges administratifs sur le portail. Si vous ajoutez des comptes intégrés, vous pouvez indiquer les informations d'identification de tous les membres du portail détenteurs de privilèges administratifs. Si vous ajoutez des comptes d'entreprise, vous devez utiliser le compte d'administrateur initial créé après l'installation de Portal for ArcGIS.
nous n'expliquerons pas dans cet exemple la prise en charge de l'authentification au niveau du Web par des scripts Python.
Ajout de comptes de portail intégrés
Lorsque vous ajoutez des comptes de portail intégrés, le format de chaque entrée dans le fichier texte est le suivant :
<username>|<password>|<email address>|<name>|<role>|<description>
- nom d'utilisateur : nom d'utilisateur à utiliser pour le compte intégré. Les noms d'utilisateurs doivent être uniques. Deux membres ne peuvent pas avoir le même nom d'utilisateur.
- password : mot de passe à attribuer au compte. Les utilisateurs peuvent utiliser ce mot de passe la première fois qu'ils se connectent au portail et peuvent ensuite changer leur mot de passe en modifiant leur profil.
- email address : fournissez une adresse électronique pour ce compte. Ce paramètre est obligatoire. Par conséquent, vous devez fournir une valeur pour l'adresse électronique, même si ce n'est pas une adresse valide.
- name : le nom correspond à l'alias pour le compte qui sera utilisé dans votre organisation ArcGIS. Lorsque l'utilisateur est connecté au site Web du portail, ce nom figure dans la partie supérieure du site Web du portail.
- role : rôle qu'aura le compte dans l'organisation ArcGIS. Les valeurs de rôle valides sont org_user, org_publisher et org_admin.
- description : vous pouvez éventuellement inclure du texte pour décrire le compte. Une description ne doit pas comporter plus de 250 caractères.
L'exemple suivant ajoute un compte de portail intégré avec le nom d'utilisateur pub1 pour Barbara Williams et le compte de messagerie bwilliams@domain.com. Il ajoute également pub1 au rôle d'éditeur et le décrit en tant que membre du service de planification :
pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|org_publisher|planning department
Enregistrement de comptes d'entreprise
Lorsque vous enregistrez des comptes d'entreprise, le format de chaque entrée du fichier texte est le suivant :
<username>|<email address>|<name>|<role>|<description>
- username : le nom d'utilisateur est le compte d'entreprise à enregistrer. Si vous utilisez Active Directory, le nom d'utilisateur doit présenter le format sAMAccountName@DOMAIN. Le nom de domaine doit être entièrement en lettres majuscules. Si vous utilisez le protocole LDAP, l'identifiant de connexion doit correspondre à la valeur userNameAttribute que vous avez spécifiée lors de la configuration du magasin d'identifiants.
- email address : l'adresse électronique doit être associée au compte et correspondre à la valeur indiquée dans le magasin d'identifiants. Si le compte utilisateur ne possède pas d'adresse électronique, indiquez la valeur false ou une valeur générique.
- name : le nom correspond à l'alias pour le nom de connexion qui sera utilisé dans votre organisation ArcGIS. La plupart des magasins d'identifiants utilisent le nom complet de l'utilisateur comme alias par défaut. Lorsque l'utilisateur est connecté au site Web du portail, ce nom figure dans la partie supérieure du site Web.
- role : rôle qu'aura le compte dans l'organisation ArcGIS. Les valeurs de rôle valides sont org_user, org_publisher et org_admin.
- description : vous pouvez éventuellement inclure du texte pour décrire le compte. Cette valeur ne correspond à aucun attribut du magasin d'identifiants. Une description ne doit pas comporter plus de 250 caractères.
Vous devez saisir une valeur pour le nom d'utilisateur, l'adresse électronique, le nom et le rôle. La description est facultative. Pour chaque compte répertorié dans le fichier, vérifiez que les valeurs entrées pour l'identifiant de connexion, l'adresse électronique et le nom correspondent exactement à celles figurant dans votre magasin d'identifiants. Le portail ne se connectera pas à votre magasin d'identifiants pour valider ces valeurs.
Vous trouverez ci-après un exemple d'entrée permettant d'enregistrer un compte d'entreprise pour le nom de connexion jcho111, avec l'adresse électronique jcho@domain.com et le nom complet Jon Cho. Le nom de connexion est placé dans le rôle utilisateur (org_user) et il est décrit comme un utilisateur travaillant dans le service 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:]))