Skip To Content

Przykład: dodawanie członków do portalu

W tym przykładzie przedstawiono zbiorcze dodawanie do portalu informacji o użytkownikach z pliku tekstowego. Zdefiniuj poszczególnych użytkowników w portalu i nadaj im role.

Przy uruchamianiu skryptu wprowadź następujące wymagane informacje:

  • Ścieżka do pliku tekstowego zawierającego informacje o użytkowniku, na przykład C:\users.txt.
  • Typ kont użytkowników, którzy mają zostać dodani do portalu, na przykład wbudowane lub korporacyjne. Aby dowiedzieć się więcej na temat typów użytkowników, zapoznaj się z tematem Zarządzanie dostępem do portalu.
  • W pełni kwalifikowana nazwa domeny komputera hostującego portal, na przykład myportal.acme.com. Skrypt ma dostęp do portalu za pośrednictwem protokołu HTTPS, przy użyciu portu 7443 i z pominięciem aplikacji Web Adaptor. W ten sposób, skrypt nie musi dokonywać uwierzytelniania w warstwie sieci, jeżeli portal został skonfigurowany do korzystania z niego.
  • Nazwa użytkownika i hasło powiązane z kontem, które ma uprawnienia administracyjne do portalu Jeżeli dodajesz konta wbudowane, podaj poświadczenia dla każdego członka portalu z uprawnieniami administracyjnymi. Jeżeli dodajesz konta korporacyjne, użyj początkowego konta administratora utworzonego po zakończeniu instalacji oprogramowania Portal for ArcGIS.
Notatka:

Ten przykład nie obejmuje objaśnienia, w jaki sposób skonfigurować skrypty w języku Python do obsługi uwierzytelniania w warstwie sieci.

Rejestracja kont korporacyjnych

Każdy wpis tworzony w pliku tekstowym podczas rejestracji kont korporacyjnych powinien mieć następujący format:

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

  • login — login korporacyjny do zarejestrowania.

    • Jeżeli korzystasz z usługi Active Directory systemu Windows, login jest w formacie sAMAccountName@DOMAIN. Nazwę domeny należy zapisać wielkimi literami.
    • Jeżeli korzystasz z protokołu LDAP, login jest zgodny z wartością parametru userNameAttribute, która została podana podczas konfiguracji magazynu tożsamości.
    • Jeśli korzystasz z loginów korporacyjnych opartych na protokole SAML, podana wartość loginu jest zgodna z atrybutem NameID w dostawcy tożsamości używającym protokołu SAML.
  • adres e-mail — adres e-mail powiązany z loginem i zgodny z wartością podaną w magazynie tożsamości. Jeżeli z kontem użytkownika nie powiązano adresu e-mail, podaj nieprawdziwą lub ogólną wartość.

  • nazwa — alias loginu używany w instytucji ArcGIS. Większość magazynów tożsamości jako domyślnego aliasu używa imienia i nazwiska użytkownika. Gdy użytkownik nawiązuje połączenie z witryną internetową portalu, nazwa ta jest wyświetlana u góry witryny internetowej.

  • typ użytkownika — nazwa typu użytkownika, do którego zostanie przypisany użytkownik. Wybierz dowolny dostępny typ użytkownika z listy rozwijanej. Można kliknąć liczbę zgodnych ról i zgodnych licencji na dodatki, aby dowiedzieć się więcej o tym, co jest zgodne z wybranym typem użytkownika. Więcej informacji na ten temat zawiera sekcja Typy użytkowników, role i uprawnienia.
  • rola — rola, jaką login korporacyjny będzie posiadał w instytucji ArcGIS. Poprawne wartości roli to: użytkownik, publikujący, administrator lub <nazwa_roli_niestandardowej>, gdzie <nazwa_roli_niestandardowej> jest nazwą roli niestandardowej (na przykład hostedservicepublisher).

    Wcześniejsze:

    W oprogramowaniu Portal for ArcGIS 10.3 i wersjach wcześniejszych zaakceptowane wartości ról niestandardowych to: org_user, org_publisher oraz org_admin. W wersji 10.3.1 te wartości stały się nieaktualne i zostały zastąpione wymienionymi wyżej wartościami. W wersji 10.3.1 nadal można używać wcześniejszych wartości, ale należy pamiętać, że mogą one nie być akceptowane w przyszłych wersjach.

  • opis — opcjonalnie dołącz tekst opisujący dane konto. Wartość ta nie odpowiada żadnemu atrybutowi w magazynie tożsamości. Opis nie może przekraczać 250 znaków.

  • nazwa użytkownika dostawcy tożsamości — opcjonalnie podaj nazwę użytkownika konta korporacyjnego w dostawcy tożsamości. Jeśli ta wartość nie zostanie podana, zamiast niej zostanie użyta wartość podana w parametrze login.

Wymagane jest podanie wartości dla loginu, adresu e-mail, nazwy oraz roli. Opis i nazwa użytkownika dostawcy tożsamości są opcjonalne. Sprawdź, czy wprowadzone dla każdego z kont znajdujących się na liście w pliku wartości loginu, adresu e-mail oraz nazwy odpowiadają wartościom w magazynie tożsamości. Portal nie nawiąże połączenia z magazynem tożsamości, aby zweryfikować te wartości.

Poniżej znajduje się przykład wpisu rejestracyjnego konta korporacyjnego Active Directory powiązanego z loginem jcho111 i adresem e-mail: jcho@domain.com oraz o pełnej nazwie (imię i nazwisko użytkownika): Jon Cho. Login jest umieszczony w roli użytkownika (użytkownik) oraz w typie użytkownika Viewer i został opisany jako użytkownik w wydziale b.

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

Poniżej znajduje się przykład wpisu rejestracyjnego konta korporacyjnego z dostawcy tożsamości używającego protokołu SAML. Login użytkownika to rsmith@domain.com, adres e-mail to rsmith@domain.com, a pełna nazwa (imię i nazwisko) użytkownika to Robert Smith. Login jest umieszczony w roli publikującego (publikujący) i typie użytkownik Creator o nazwie użytkownika dostawcy tożsamości: rsmith@domain.com.

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

Poniżej znajduje się przykład wpisu rejestracyjnego konta korporacyjnego LDAP powiązanego z loginem sjames4513 i adresem e-mail: sjames@domain.com oraz o pełnej nazwie (imię i nazwisko użytkownika): Sara James. Login jest umieszczony w roli użytkownika (administrator) i typie użytkownika GIS Professional i został podany opis.

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

Poniżej znajduje się przykład wpisu rejestracyjnego konta korporacyjnego powiązanego z loginem srajhandas i adresem e-mail: srajhandas@domain.com oraz o pełnej nazwie (imię i nazwisko użytkownika): Satish Rajhandas. Login jest umieszczony w roli użytkownika (użytkownik) i typie użytkownika Viewer.

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

Poniżej znajduje się przykład wpisu rejestracyjnego konta korporacyjnego z dostawcy tożsamości używającego protokołu SAML. Login użytkownika to djohnson308, adres e-mail to djohnson@domain.com, a pełna nazwa (imię i nazwisko) użytkownika to Daisha Johnson. Login jest umieszczony w roli użytkownika (użytkownik) i typie użytkownika Creator, podany jest opis i jest zdefiniowana następująca nazwa użytkownika dostawcy tożsamości: djohnson@domain.com.

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

Dodawanie wbudowanych kont portalowych

Każdy wpis w pliku tekstowym tworzony podczas dodawania kont wbudowanych portalu powinien mieć następujący format:

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

  • nazwa użytkownika — jest to nazwa użytkownika używana dla wbudowanego konta. Nazwy użytkownika muszą być unikalne, nie można przypisać tej samej nazwy użytkownika dwóm członkom.
  • hasło — hasło przypisane do konta. Użytkownicy mogą używać tego hasła podczas pierwszego logowania do portalu, a następnie mogą zmienić swoje hasło edytując swój profil.
  • adres e-mail — należy podać adres e-mail dla tego konta. Ten parametr jest wymagany. Należy podać wartość dla adresu e-mail, nawet jeśli nie jest to poprawny adres.
  • nazwa — alias konta używany w instytucji ArcGIS. Gdy użytkownik łączy się z witryną internetową portalu, nazwa ta jest wyświetlana u góry witryny internetowej portalu.
  • typ użytkownika — nazwa typu użytkownika, do którego zostanie przypisany użytkownik. Wybierz dowolny dostępny typ użytkownika z listy rozwijanej. Można kliknąć liczbę zgodnych ról i zgodnych licencji na dodatki, aby dowiedzieć się więcej o tym, co jest zgodne z wybranym typem użytkownika. Więcej informacji na ten temat zawiera sekcja Typy użytkowników, role i uprawnienia.
  • rola — rola, jaką ma konto w instytucji ArcGIS. Poprawne wartości roli to: użytkownik, publikujący, administrator lub <nazwa_roli_niestandardowej>, gdzie <nazwa_roli_niestandardowej> jest nazwą roli niestandardowej (na przykład hostedservicepublisher).
  • opis — opcjonalnie dołącz tekst opisujący dane konto. Opis nie może przekraczać 250 znaków.

Poniżej znajduje się przykład wpisu, który dodaje konto wbudowane portalu o nazwie pub1 dla użytkownika nazywającego się Barbara Williams mającego następujące konto e-mail: bwilliams@domain.com. Konto pub1 ma przyznaną rolę publikującego:

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

Poniżej znajduje się przykład wpisu, który dodaje konto wbudowane portalu o nazwie jcho dla użytkownika nazywającego się Jon Cho mającego następujące konto e-mail: jcho@domain.com. Konto jcho ma przyznaną rolę administratora i zostaje ono opisane jako kierownik ds. 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:]))