In diesem Beispiel wird eine Eingabetextdatei mit Informationen zu Benutzern verwendet, die dem Portal in einem Massenvorgang hinzugefügt werden. Definieren Sie die Rolle und weisen Sie sie jedem Benutzer in Ihrem Portal zu.
Geben Sie die folgenden, notwendigen Informationen ein, wenn Sie das Skript ausführen:
- Pfad zu der Textdatei, die die Benutzerinformationen enthält, z. B. /home/admin/documents/users.txt.
- Benutzertyp, der dem Portal hinzugefügt werden soll, z. B. integriert oder Enterprise. Weitere Informationen zu Benutzertypen finden Sie unter Verwaltung des Zugriffs auf das Portal.
- Vollständig qualifizierter Domänenname des Computers, der das Portal hostet, z. B. myportal.acme.com. Das Skript greift über HTTPS an Port 7443 auf das Portal zu und umgeht ArcGIS Web Adaptor. Auf diese Weise muss das Skript keine Authentifizierung auf Webebene verarbeiten, wenn das Portal für deren Verwendung konfiguriert ist.
- Benutzername und Kennwort eines Kontos, dem Administratorberechtigungen für das Portal zugewiesen sind. Wenn Sie integrierte Konten hinzufügen, stellen Sie die Anmeldeinformationen eines Mitglieds des Portals mit Administratorberechtigungen bereit. Wenn Sie organisationsspezifische Konten hinzufügen, verwenden Sie das initiale Administratorkonto, das nach der Installation von Portal for ArcGIS erstellt wurde.
Hinweis:
Die Handhabung der Authentifizierung auf Webebene durch Python-Skripte kann in diesem Beispiel nicht veranschaulicht werden.
Registrieren von Enterprise-Konten
Beim Registrieren von Enterprise-Konten weisen die Einträge in der Textdatei das folgende Format auf:
<login>|<email address>|<name>|<role>|<description>|<Idp UserName>
login: Der Enterprise-Anmeldename, der registriert werden soll.
- Bei Verwendung von Active Directory erfolgt die Anmeldung in der Form sAMKontoname@DOMAENE. Der Domänenname darf nur Großbuchstaben enthalten.
- Bei Verwendung von LDAP stimmt die Anmeldung mit dem Wert von userNameAttribute, den Sie beim Konfigurieren des Identitätsspeichers angegeben haben, überein.
- Bei Verwendung von SAML-basierten Enterprise-Anmeldungen stimmt der angegebene Anmeldewert mit dem Attribut NameID im Identity-Provider für SAML überein.
email address: E-Mail-Adresse, die mit den Anmeldeinformationen verknüpft ist und mit dem Wert im Identitätsspeicher übereinstimmt. Wenn das Benutzerkonto keine E-Mail-Adresse umfasst, geben Sie einen falschen oder generischen Wert ein.
name: Der Aliasname für die Anmeldung in Ihrer ArcGIS-Organisation. In den meisten Identitätsspeichern wird der vollständige Benutzername als Standardaliasname verwendet. Wenn der Benutzer eine Verbindung mit der Portal-Website herstellt, wird dieser Name oben auf der Website angezeigt.
- user type: Der Name des Benutzertyps, dem der Benutzer zugewiesen wird. Wählen Sie einen verfügbaren Benutzertyp aus der Dropdown-Liste aus. Sie können auf die kompatiblen Rollen und die Anzahl der kompatiblen Add-on-Lizenzen klicken, um weitere Informationen zu den mit dem ausgewählten Benutzertyp kompatiblen Optionen zu erhalten. Weitere Informationen finden Sie unter Benutzertypen, Rollen und Berechtigungen.
role: Die Rolle, die dem Enterprise-Anmeldenamen in der ArcGIS-Organisation zugeordnet ist. Zulässige Werte für die Rolle sind user, publisher, admin oder <benutzerdefinierte_Rolle>, wobei <benutzerdefinierte_Rolle> der Name der benutzerdefinierten Rolle ist (zum Beispiel hostedservicepublisher).
Vorversion:
In Portal for ArcGIS 10.3 und früheren Versionen lauteten die zulässigen Werte für nicht benutzerdefinierte Rollen org_user, org_publisher und org_admin. In 10.3.1 sind diese Werte veraltet und wurden durch die oben aufgeführten Werte ersetzt. Sie können die älteren Werte in 10.3.1 weiterhin verwenden, müssen jedoch beachten, dass die Werte in zukünftigen Versionen möglicherweise ungültig sind.
description: Fügen Sie optional Text hinzu, um das Konto zu beschreiben. Dieser Wert entspricht keinem Attribut im Identitätsspeicher. Beschreibungen dürfen maximal 250 Zeichen lang sein.
Idp UserName: Geben Sie optional den Benutzernamen des Enterprise-Kontos im Identity-Provider an. Wenn der Wert nicht angegeben wird, wird der für den Anmeldeparameter angegebene Wert verwendet.
Sie müssen einen Wert für die Anmeldung, eine E-Mail-Adresse, einen Namen und eine Rolle angeben. Die Beschreibung und "Idp UserName" sind optional. Überprüfen Sie für jedes in der Datei aufgeführte Konto, ob die eingegebenen Werte für die Anmeldung, die E-Mail-Adresse und den Namen mit den Werten im Identitätsspeicher übereinstimmen. Das Portal stellt keine Verbindung mit dem Identitätsspeicher her, um diese Werte zu überprüfen.
Das folgende Beispiel zeigt einen Eintrag zum Registrieren eines Active Directory-Enterprise-Kontos für den Anmeldenamen "jcho111" mit der E-Mail-Adresse "jcho@domain.com" und dem vollständigen Namen "Jon Cho". Der Anmeldename wird in der Benutzerrolle (Benutzer) und dem Benutzertyp "Viewer" platziert und als Benutzer in Abteilung b beschrieben.
jcho111@DOMAIN|jcho@domain.com|Jon Cho|Viewer|user|department b
Das folgende Beispiel zeigt einen Eintrag zum Registrieren eines Enterprise-Kontos von einem SAML-Identity-Provider. Der Anmeldename des Benutzers lautet "rsmith@domain.com" mit der E-Mail-Adresse "rsmith@domain.com" und dem vollständigen Namen "Robert Smith". Der Anmeldename wird in der Publisher-Rolle (Publisher) und dem Benutzertyp "Creator" platziert, und "Idp UserName" wird als "rsmith@domain.com" definiert.
rsmith@domain.com|rsmith@domain.com|Robert Smith|Creator|publisher||rsmith@domain.com
Das folgende Beispiel zeigt einen Eintrag zum Registrieren eines LDAP-Enterprise-Kontos für den Anmeldenamen "sjames4513" mit der E-Mail-Adresse "sjames@domain.com" und dem vollständigen Namen "Sara James". Der Anmeldename wird in der Benutzerrolle (Admin) und dem Benutzertyp "GIS Professional" platziert, und es wird eine Beschreibung angegeben.
sjames4513@DOMAIN|sjames@domain.com|Sara James|GISProfessional|admin|Department Lead and GIS Manager
Das folgende Beispiel zeigt einen Eintrag zum Registrieren eines Enterprise-Kontos für den Anmeldenamen "srajhandas" mit der E-Mail-Adresse "srajhandas@domain.com" und dem vollständigen Namen "Satish Rajhandas". Der Anmeldename wird in der Benutzerrolle (Benutzer) und dem Benutzertyp "Viewer" platziert.
srajhandas@DOMAIN|srajhandas@domain.com|Satish Rajhandas|Viewer|user
Das folgende Beispiel zeigt einen Eintrag zum Registrieren eines Enterprise-Kontos von einem SAML-Identity-Provider. Der Anmeldename des Benutzers lautet "djohnson308" mit der E-Mail-Adresse "djohnson308@domain.com" und dem vollständigen Namen "Daisha Johnson". Der Anmeldename wird in der Benutzerrolle (Benutzer) und dem Benutzertyp "Creator" platziert, es wird eine Beschreibung angegeben, und "Idp UserName" wird als "djohnson@domain.com" definiert.
djohnson308@DOMAIN|djohnson@domain.com|Daisha Johnson|Creator|user|Account Specialist|djohnson@domain.com
Hinzufügen integrierter Portal-Konten
Beim Hinzufügen integrierter Portal-Konten haben Einträge in der Textdatei das folgende Format:
<username>|<password>|<email address>|<name>|<user type>|<role>|<description>
- username: Der Benutzername, der für das integrierte Konto verwendet wird. Benutzernamen müssen eindeutig sein; es dürfen keine zwei Mitglieder mit demselben Benutzernamen vorhanden sein.
- password: Das Kennwort, das dem Konto zugewiesen wird. Benutzer können dieses Kennwort bei der ersten Anmeldung beim Portal verwenden und es dann ändern, indem sie ihr Profil bearbeiten.
- email address: Geben Sie eine E-Mail-Adresse für dieses Konto an. Dieser Parameter ist erforderlich. Deshalb müssen Sie einen Wert für die E-Mail-Adresse angeben, selbst wenn es sich nicht um eine gültige Adresse handelt.
- name: Der Aliasname für das Konto in Ihrer ArcGIS-Organisation. Wenn der Benutzer eine Verbindung zur Portal-Website herstellt, wird dieser Name oben auf der Portal-Website angezeigt.
- user type: Der Name des Benutzertyps, dem der Benutzer zugewiesen wird. Wählen Sie einen verfügbaren Benutzertyp aus der Dropdown-Liste aus. Sie können auf die kompatiblen Rollen und die Anzahl der kompatiblen Add-on-Lizenzen klicken, um weitere Informationen zu den mit dem ausgewählten Benutzertyp kompatiblen Optionen zu erhalten. Weitere Informationen finden Sie unter Benutzertypen, Rollen und Berechtigungen.
- role: Die Rolle, die dem Konto in der ArcGIS-Organisation zugeordnet ist. Zulässige Werte für die Rolle sind user, publisher, admin oder <benutzerdefinierte_Rolle>, wobei <benutzerdefinierte_Rolle> der Name der benutzerdefinierten Rolle ist (zum Beispiel hostedservicepublisher).
- description: Fügen Sie optional Text hinzu, um das Konto zu beschreiben. Beschreibungen dürfen maximal 250 Zeichen lang sein.
Im folgenden Beispiel wird ein integriertes Portal-Konto mit dem Benutzernamen "pub1" für Barbara Williams und dem E-Mail-Konto "bwilliams@domain.com" hinzugefügt. Zusätzlich wird "pub1" zur Publisher-Rolle hinzugefügt.
pub1|changepasswordlater|bwilliams@domain.com|Barbara Williams|Creator|publisher
Im folgenden Beispiel wird ein integriertes Portal-Konto mit dem Benutzernamen "jcho" für Jon Cho und dem E-Mail-Konto "jcho@domain.com" hinzugefügt. Außerdem wird "jcho" zur Administrator-Rolle hinzugefügt und als GIS-Manager beschrieben:
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:]))