Skip To Content

مثال: دعوة الأعضاء إلى المدخل

يستعمل هذا المثال ملف نصي مُدخل مع معلومات حول المستخدمين وإضافتها للمدخل في مجموعة. قم بتعريف ومنح دور كل مستخدم في البوابة الإلكترونية.

أدخل المعلومات المطلوبة التالية عند تشغيل البرنامج النصي:

  • مسار الملف النصي الذي يحتوي على معلومات المستخدم، مثل /home/admin/documents/users.txt.
  • أنواع المستخدمين المضافين إلى المدخل، على سبيل المثال، مضمن أو مؤسسي. للتعرف على المزيد حول أنواع المستخدمين، راجع إدارة الوصول إلى المدخل.
  • اسم جهاز المجال المؤهل كليةً والذي يستضيف المدخل، على سبيل المثال، myportal.acme.com. يقوم البرنامج النصي بالوصول إلى البوابة الإلكترونية عن طريق HTTPS على المنفذ 7443 وتجاوز ArcGIS Web Adaptor. في هذا السلوك، لا يحتاج البرنامج النصي التعامل مع مصادقة طبقة الويب إذا تم تكوين المدخل للاستخدام.
  • يحتوي اسم المستخدم وكلمة السر بالحساب على امتيازات إدارية للمدخل. عند إضافة حسابات داخلية، قم بتوفير بيانات اعتماد أي مستخدم في البوابة الإلكترونية باستخدام الامتيازات الإدارية. عند إضافة حسابات مؤسسية، استخدم حساب المسئول الأولي الذي تم إنشاؤه بعد التثبيت Portal for ArcGIS.
ملاحظة:‏

توضيح كيفية جعل نصوص Python تدير توثيق طبقة الويب هو أمر خارج نطاق هذا المثال.

تسجيل الحسابات المؤسسية

عند تسجيل الحسابات المؤسسية، يكون تنسيق كل مدخل في الملف النصي كما يلي:

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

  • تسجيل الدخول—تسجيل الدخول على المؤسسة للتسجيل.

    • عند استخدام الدليل النشط، سيصبح شكل تسجيل الدخول على شكل sAMAccountName@DOMAIN. يتعين أن يكون اسم المجال ذات أحرف كبيرة.
    • عند استخدام LDAP، يتعين أن يتطابق تسجيل الدخول مع قيمة userNameAttribute التي تم تحديدها عند تكوين متجر الهوية.
    • عند استخدام عمليات تسجيل الدخول المؤسسية المُستندة إلى SAML، يجب أن تتطابق قيمة تسجيل الدخول المُحددة مع البيانات الجدولية NameID في موفر هوية SAML.
  • عنوان البريد الإلكتروني - ينبغي أن يتطابق عنوان البريد الإلكتروني مع تسجيل الدخول ويتطابق مع القيمة في متجر الهوية. إذا لم يكن لحساب المستخدم عنوان بريد إلكتروني، قم بتوفير قيمة خطأ أو عام.

  • الاسم—الاسم هو الاسم المستعار لتسجيل الدخول المستخدم في مؤسسة ArcGIS. تستخدم معظم مخازن الهوية اسم المستخدم الكامل بصفته اسم مستعار افتراضي. عند اتصال المستخدم بموقع البوابة الإلكتروني، سيظهر الاسم أعلى موقع الويب.

  • اسم المستخدم—اسم نمط المستخدم الذي سيتحدد للمستخدم. حدد نمط المستخدم المتاح من قائمة السهم المنسدل. يمكنك النقر فوق عدد الأدوار المتوافقة والتراخيص الإضافية لاكتشاف المزيد عما هو متوافق مع نمط المستخدم المحدد. لمزيد من المعلومات، راجع موضوع أنواع المستخدمين والأدوار والامتيازات..
  • الدور—هو دور تسجيل الدخول المؤسسي ال>ي سيتم الحصول عليه في مؤسسة ArcGIS. تشمل قيم الدور الصحيحة مستخدمأو ناشرأو مديرأو <custom_role_name>حيث <custom_role_name> هو اسم الدور المخصص (مثل، hostedservicepublisher).

    قديم:

    في Portal for ArcGIS 10.3 والإصدارات السابقة، كانت القيم المقبولة للأدوار غير المخصصة هي org_user، org_publisher، و org_admin. في الإصدار 10.3.1، لقد تم إهمال هذه القيم واستبدالها بالقيم المدرجة أعلاه. يمكنك الاستمرار لاستخدام القيم القديمة في الإصدار 10.3.1، لكن لاحظ أنه لا يمكن قبول القيم في الإصدارات المستقبلية.

  • الوصف - يتضمن النص اللازم لوصف الحساب بشكل اختياري. لا تتطابق هذه القيمة مع أي من البيانات الجدولية في مخزن الهوية. لا يمكن أن تتعدى الأوصاف 250 حرف.

  • Idp UserName - تحديد اسم مستخدم الحساب المؤسسي اختيارًا في مُزود الهوية. إذا لم يتم توفير هذه القيمة، فسيتم استخدام القيمة المحددة لمعلمة تسجيل الدخول بدلاً من ذلك.

يتطلب توفير القيمة لتسجيل الدخول وعنوان البريد الإلكتروني والاسم والدور. يُعد الوصف وIdp UserName اختيارييّن. فيما يتعلق بكل حساب مُدرج في الملف، تأكد من تطابق القيم التي يتم إدخالها لتسجيل الدخول وعنوان البريد الإلكتروني والاسم مع القيم في مخزن الهوية. لن تتصل البوابة الإلكترونية بمخزن الهوية للتحقق من هذه القيم.

فيما يلي مثال للإدخال لتسجيل حساب دليل نَشِط مؤسسي لتسجيل دخول jcho111 باستخدام عنوان البريد الإلكتروني jcho@domain.com والاسم الكامل لـ Jon Cho. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم) ونمط مستخدم العارض، ويوصف باعتباره مستخدمًا في الجزء ب.

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

فيما يلي مثال لإدخال لتسجيل حساب مؤسسي من مُزود هوية SAML. تسجيل دخول المستخدم هو rsmith@domain.com باستخدام عنوان بريد إلكتروني لـ rsmith@domain.com والاسم الكامل لـ Robert Smith. يتم وضع تسجيل الدخول في دور الناشر (الناشر) ونمط المستخدم المنشئ، مع اسم مستخدم لموفر الهوية rsmith@domain.com.

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

فيما يلي مثال لإدخال لتسجيل حساب LDAP مؤسسي لتسجيل دخول sjames4513 باستخدام عنوان البريد الإلكتروني لـ sjames@domain.com والاسم الكامل لـ Sara James. يتم وضع تسجيل الدخول في دور المستخدم (المسؤول) ونمط المستخدم الاحترافي لنظام المعلومات الجغرافي ويتم توفير وصف.

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

فيما يلي مثال لإدخال لتسجيل الحساب المؤسسي لتسجيل دخول srajhandas باستخدام عنوان البريد الإلكتروني لـ srajhandas@domain.com والاسم الكامل لـ Satish Rajhandas. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم) ونمط مستخدم العارض.

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

فيما يلي مثال لإدخال لتسجيل حساب مؤسسي من مُزود هوية SAML. تسجيل دخول المستخدم هو djohnson308 باستخدام عنوان بريد إلكتروني djohnson@domain.com والاسم الكامل لـ Daisha Johnson. يتم وضع تسجيل الدخول في دور المستخدم (المستخدم) ونمط المستخدم المنشئ، مع توفير الوصف، مع اسم مستخدم لموفر الهوية معرَّف بأنه djohnson@domain.com.

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

إضافة حسابات مدخل مضمنة

عند إضافة حسابات البوابة الإلكترونية الداخلية، يكون تنسيق المدخلات في الملف النصي كما يلي:

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

  • اسم المستخدم - اسم المُستخدِم المُستَخدَم للحساب المضمن. يجب أن تكون أسماء المستخدمين فريدة، لا يمكن لمستخدمين الحصول على نفس الاسم.
  • كلمة المرور - كلمة المرور المُعيّنة للحساب. يمكن استخدام المستخدمين لأول مرة يتم تسجيل الدخول في المدخل، بعدها يمكن تغيير كلمة السر بواسطة تحرير الملف التعريفي.
  • البريد الإلكتروني—قم بتوفير بريد إلكتروني للحساب. يتم طلب المعلمة. لذلك، يجب توفير قيمة البريد الإلكتروني حتى لو كان عنوان غير صحيح.
  • الاسم - الاسم المستعار للحساب المستخدم في مؤسسة ArcGIS. عند اتصال المستخدم بموقع البوابة الإلكترونية على الويب، يظهر هذا الاسم أعلى الموقع.
  • اسم المستخدم—اسم نمط المستخدم الذي سيتحدد للمستخدم. حدد نمط المستخدم المتاح من قائمة السهم المنسدل. يمكنك النقر فوق عدد الأدوار المتوافقة والتراخيص الإضافية لاكتشاف المزيد عما هو متوافق مع نمط المستخدم المحدد. لمزيد من المعلومات، راجع موضوع أنواع المستخدمين والأدوار والامتيازات..
  • الدور- الدور الخاص بالحساب في مؤسسة ArcGIS. تشمل قيم الدور الصحيحة المستخدم، الناشر، المسئول، أو <custom_role_name>، حيث أن <custom_role_name> هو اسم الدور المخصص (على سبيل المثال، hostedservicepublisher).
  • الوصف - يتضمن النص اللازم لوصف الحساب بشكل اختياري. لا يمكن أن تتعدى الأوصاف 250 حرف.

فيما يلي مثال لإدخال يعمل على إضافة حساب مُضمن في البوابة الإلكترونية باسم المستخدم pub1 لـ Barbara Williams بحساب بريد إلكتروني bwilliams@domain.com. كما يضيف pub1 إلى دور الناشر:

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

فيما يلي مثال لإدخال يعمل على إضافة حساب مُضمن في البوابة الإلكترونية باسم المستخدم jcho لـ Jon Cho بحساب بريد إلكتروني jcho@domain.com. كما يعمل على إضافة jcho إلى دور المسئول ويصفه على أنه مدير 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:]))