Skip To Content

Beispiel: Hinzufügen von Mitgliedern zum Portal

In diesem Thema

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 Enterprise-Konten hinzufügen, verwenden Sie das initiale Administratorkonto, das nach der Installation von Portal for ArcGIS erstellt wurde.
Hinweis:

Die Verarbeitung der Authentifizierung auf Webebene durch Python-Skripte wird in diesem Beispiel nicht veranschaulicht.

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.

  • role – Die Rolle, die dem Enterprise-Anmeldenamen in der ArcGIS-Organisation zugeordnet ist. Zulässige Werte für die Rolle sind Benutzer, Publisher, Admin oder <custom_role_name>, wobei <custom_role_name> der Name der benutzerdefinierten Rolle ist (zum Beispiel hostedservicepublisher).

    Ältere Versionen:

    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) platziert und als Benutzer in Abteilung b beschrieben.

jcho111@DOMAIN|jcho@domain.com|Jon Cho|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) mit dem "Idp UserName" von rsmith@domain.com platziert.

rsmith@domain.com|rsmith@domain.com|Robert Smith|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) platziert und eine Beschreibung wird angegeben.

sjames4513@DOMAIN|sjames@domain.com|Sara James|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) platziert.

srajhandas@DOMAIN|srajhandas@domain.com|Satish Rajhandas|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) platziert, eine Beschreibung wird angegeben und der "Idp UserName" ist als "djohnson@domain.com" definiert.

djohnson308@DOMAIN|djohnson@domain.com|Daisha Johnson|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>|<role>|<description>

  • Benutzername – 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.
  • role – Die Rolle, die dem Konto in der ArcGIS-Organisation zugeordnet ist. Zulässige Werte für die Rolle sind Benutzer, Publisher, Admin oder org_<custom_role_name>, wobei <custom_role_name> der Name der benutzerdefinierten Rolle ist (zum Beispiel: org_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|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|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:]))