Я нуждался в свежем профиле Salesforce «Нет разрешений» в зрелом ORG.
Я не мог получить API метаданных, работаю достаточно быстро, чтобы мой понравился, поэтому я сдался и построил «робот-версию» себя с Python и Selenium, угнал моего собственного браузера, и смотрел подделку – я щелкнул тысячи кнопок на скорости компьютера Отказ
(Это делает мой компьютер сама #awesomeadmin?)
Вот как я это сделал.
Фон
Я собираюсь проверить совершенно новый Орежняя среда Pardot Я был выдан, и я хочу подключить его к Saleforce Sandbox под философией наименее привилегии .
Это означает создание профиля Salesforce с нет Доступ к уровню объекта CRUD и нет Доступ к читаю/запись уровня поля.
Я перевернув вещи назад на Если мне нужен.
К сожалению, у нас нет таких профилей к клону.
- Я клонировал ближайший, который я мог найти – «только прочитать» один – но он накопил много чтения/редактирования (Да, редактировать, несмотря на его имя) Доступ ему не нужен.
- Чтобы получить его к статусу «Нет разрешений», я хотел бы иметь Лот изданий, чтобы сделать.
Читайте дальше, чтобы увидеть, что я пытался.
Возьмите 1: Welkin Suite
Я думал, что Selkin Suite’s Редактор разрешений объектов а также Безопасность уровня поля Инструменты могли помочь мне.
- Действительно, редактор разрешений объектов сделал быструю работу с выключением доступа уровня объекта CRUD.
- Тем не менее, это было слишком много щелчков, и слишком много ожидает, чтобы подтянуть сотни объектов по одному на вкладке «Уровень безопасности на уровне поле Welkin» и отключите вещи от объекта-объекта.
- Редактор отлично подходит для удаления молотка и обнуления разрешений для профиля или нескольких на 5 объектов. Однако он все еще был слишком большой работой на 150 объектов.
Взять 2: API метаданных
Я думал:
” Уэлкин, а также авторы Salesforce Setup Page, имеют как созданные инструменты, которые запрашивают Salesforce Security Security Share для объекта, чтобы представить их пользователям.
«Я просто запрашиваю все, что они запрашивают и циклируют над ним, наращивание гумозных данные Pardot Sync.profile
в XML , Молни это, и Разверните его в свою песочницу в Workbench “
Содержание Pardot Data Sync.profile
будет выглядеть так:
... false false SomeObjectAPIName.SomeFieldAPIName true false false false SomeObjectAPIName.SomeFieldAPIName true false
Этот файл будет внутри папки в .zip под названием «Профили».
На верхнем уровне .zip будет называться файлом Package.xml
со следующим содержанием:
MiscLazyStuff Pardot Data Sync Profile 46.0
Я не знал, как получить список Какой-тоobjectapiname. Некоторыефилдапинама
Значения, чтобы построить мой
Обелки вокруг, поэтому я начал с написания сценария Python в цикл через каждый * .Object
XML-файл Я скачал на мой компьютер с Welfink.
К сожалению, я бежал в нет конца Развертывание метаданных Ошибки – каждый из которых я мог видеть только один из одновременно.
- Сначала мне пришлось редактировать свой скрипт, чтобы игнорировать поля формулы
- Тогда мне пришлось редактировать его, чтобы игнорировать мастер-деталь поля
- Тогда мне пришлось редактировать его, чтобы игнорировать обязательные поля поиска. А
Требуется
Свойство не существует на стандартных полях стандартных объектов в.Object
Файлы, чтобы быть в безопасности, я просто проигнорировал все поля поиска, у которых не былоТребуется
флаг в любом случае. \ - И, конечно, мне пришлось игнорировать поля с
Требуется
Собственностьправда
Отказ - Но все же, были более стандартные поля стандартных объектов, которые были необходимы, не сказав мне так в их
* .Object
Определения XML. Я выбежал из терпения, когда сообщения об ошибках сказали мне, чтоРазрешение разрешения. СогласиеПоптиртовоедатетиме
был обязан, но его код вАвторизацияFormConsent.Object
Похоже:
ConsentCapturedDateTime false
Подожди … Как я должен был знать, что о СогласиеПоптиртовоедатетиме
Удар
Где это задокументировано/извлекается ?? !! **
Я провел еще 3 часа, ударяя голову против стены, играющую на инструментальную API и вершину, пытаясь найти надежный способ получить тот же тип «Не беспокойтесь с этим полем» BlackList (или «беспокоиться с этими полями» Белом) То, что Selkin Suite и авторы веб-страниц настроек Salesforce для веб-сайтов, очевидно, удалось придумать, прежде чем я бросил.
Я имею в виду, я должен был написать Scrape Документация Для слова «требуется» в начале «описания» абзаца или что-то?
В определенный момент я был сделано Отказ
Примечание : Приму вклад!
Уэлкинские люди, сотрудники Salesforce или другие разработчики – я хотел бы услышать, какие алгоритмы вы Выяснить Что именно Поля, чтобы представить пользователям как разрешение – редактируемый.
До тех пор … вместо того, чтобы построить свою собственную машину, я решил «там я исправил это» колесо предкистительной машины. Ведущий мне …
Взять 3: MENUE SETUP + SELENIUM (и немного погрузчика данных)
Селен Это программируемый набор программного обеспечения, который действует как промежуточное программное обеспечение между вашим веб-браузером и языком программирования по вашему выбору.
Как правило, разработчики используют его, чтобы имитировать пользовательские кнопки на нажатии на веб-страницу, чтобы они могли работать, чтобы их веб-страница работает как предназначена.
- Компьютеризация сохраняет хлопот – кто действительно хочет нажать на все кнопки, которые необходимо нажать, когда это то же самое время каждый раз?
- Компьютеризация весы хорошо – это надежный способ моделирования миллионов людей, нажав на вашу веб-страницу одновременно (вроде бы, если вы гигантский э-розничный продавец во время крупных торговых праздников Seasons) Отказ
Я установил его, потому что я знал, что мне нужно «Определить» где-то между Несколько и Сотни Флажок на нами экран на десятки до сотен страниц настроек Salesforce, которые были полностью, как друг друга.
Похоже, как идеальное использование для автоматизации моей работы!
Я мог бы исследовать, какой мой веб-браузер делал от моего имени, поскольку я нажал на первые несколько кнопок, а затем учить компьютеру сделать это для меня, и научить компьютеру, какие тонкие вариации должны были объяснить при переключении с одного Salesforce «Объект» к другому.
Шаг 1: Бревно В
Во-первых, я провел следующий код Python
from selenium.webdriver import Chrome browser = Chrome(executable_path='C:\\exampleprograms\\ChromeDriver\\chromedriver.exe') browser.get('https://test.salesforce.com')
Это вызвало особый экземпляр Chrome для появления на моем компьютере.
Я вошел в Salesforce с моим именем пользователя и паролем как обычно.
Шаг 2: Получить мои объектные ссылки
Тогда я прокомментировал код выше и, не позволяя Мой Python IDe очистить значение браузер
Переменная (что это нормальное поведение моего IDE из одной кнопки «RUN», нажмите к следующему) Я провел следующий код:
editableLinksToVisit = [] browser.get('https://cs99.salesforce.com/00eX00000000XXX?s=ObjectsAndTabs') objtable = browser.find_element_by_css_selector("[id$='table_objects_and_tabs:tb']") rows = objtable.find_elements_by_xpath('.//*') for row in rows: tds = row.find_elements_by_tag_name("td") if len(tds) > 2: td1 = tds[0] td2 = tds[1] td2span = td2.find_element_by_tag_name("span") if td2span is not None and td2span.text != '--': td1span = td1.find_element_by_tag_name("span") if td1span is not None: td1a = td1span.find_element_by_tag_name("a") if td1a is not None: td1aText = td1a.text td1aLink = td1a.get_attribute('href') td1aEditableLink = td1aLink.replace('?s=ObjectsAndTabs','/e?s=ObjectsAndTabs') editableLinksToVisit.append({'text':td1aText, 'editLink':td1aEditableLink})
Вот что делает код выше:
Browser.get ()
Команда заставила меня посетить новый веб-сайт в Chrome – как будто я сам набрал этот URL в мою панель браузера и нажмите «Enter».- Это довольно триппи – Вы буквально следили за своим компьютером, делаете вещи без вас, подобно кому-то еще, управлял контролем.
- URL я сказал
Browser.get ()
О том, что URL-адрес экрана «Объектов и вкладок» настроек для профиля, который я пытался редактировать (который я написал здесь как имеющий идентификатор объекта00ex00000000xxx
) Отказ - Когда я бегу
Browser.get ()
Содержимое хранится в моей программебраузер
Переменные изменения. Тогда я использую различные Методы встроен в тип данных Я хранил в
браузер
(Я точно забыл, что это такое) такие как.find_element_by_css_selector ()
и.find_element_by_tag_name. ()
к Scrape содержимое этой конкретной веб-страницы.- Технически, я соскорью DOM, или то, что вы видите, когда вы используете Console Developer Console Firefox или Chrome или Chrome, не соскабливая источник HTML. Их содержимое всегда – немного по-другому. Раньше было то, что вы могли бы сказать, какой HTML составлял страницу, просто посмотрев на его источник. В наши дни JavaScript может «ввести» HTML в «DOM» в последнюю минуту, и ваш браузер на самом деле Делает веб-страницу на основе DOM, поэтому вы должны знать, как проверить, что на самом деле в DOM, если вы хотите разобрать код за веб-страницей.
Мой большой
для
петля и гнездоЕсли
Заявления ищет ссылки в конкретной таблице на странице, которые являются не рядом с текстом “-“.- «-» будет указывать, что ссылка идет на настройки для вкладки, а не объекта, поэтому я хочу пропустить тех.
- Тогда я возьму имя объекта (на текст ссылки) и его URL.
- Наконец, я редактирую ссылку, придерживаясь
/E.
прямо до? s=
Таким образом, я могу пойти прямо в редактируемую версию страницы конфигурации профиля этого объекта, когда я посещаю мою ссылку.
Мой большой список имен объектов и их ссылки – это то, что я храним как EditableLinkstovisit
Отказ
Шаг 3: Нажмите на все кнопки
Я снова прокомментировал код выше и, не позволяя моим Python IDE выяснить значение любых переменных (что это нормальное поведение моего IDE из одной кнопки «RUN», нажмите к следующему) схватил чашку воды и провел следующий код (Это заняло около 15-25 минут ) :
for linkDict in editableLinksToVisit: print(linkDict.get('text')) browser.get(linkDict.get('editLink')) submitbutton = browser.find_element_by_css_selector("input[type='submit'][value='Save'][id$='button_pc_save']") editinputs = browser.find_elements_by_css_selector("input:enabled:checked[id$=':fls_edit_ck']") readinputs = browser.find_elements_by_css_selector("input:enabled:checked[id$=':fls_read_ck']") if submitbutton is not None and (len(editinputs) + len(readinputs) > 0): print('submit ' + str(submitbutton is not None)) print('edits ' + str(len(editinputs))) print('reads ' + str(len(readinputs))) for ipt in editinputs: ipt.send_keys(" ") for ipt in readinputs: ipt.send_keys(" ") submitbutton.send_keys("\n") print('done') else: print('oops') print('submit ' + str(submitbutton is not None)) print('edits ' + str(len(editinputs))) print('reads ' + str(len(readinputs)))
Этот код – большой цикл по всему пару ссылки URL-адреса URL ( кортежи ) Я бы спасил в EditableLinkstovisit
Отказ
Вот что он делает для каждой ссылки в списке:
- Это пишет вниз по примечанию, которую я могу прочитать, рассказывая мне, какой объект должен быть вообще, чтобы угонировать, мой браузер, чтобы посетить URL
- Он угнатит мой браузер и посещает этот URL.
Это читает код домо Page, чтобы найти все Полевой уровень безопасности Ящики, которые в настоящее время проверяются, и это не изменяемым.
- Это делает это в отдельных «редактировать» и «прочитать» списки флажков.
- Он считывает код DOM страницы, чтобы найти кнопку Сохранить.
- Если он нашел что-то, что «может использовать ООН-проверку», – оно цикла по спискам и не проверяет поля.
- Я петлю в первую очередь «редактирование», затем «читает», так как флажки «чтение« чтение »может иметь побочный эффект от проверки« редактирование »боковых ящиков. И я хотел держать вещи простыми и не беспокоиться о побочных эффектах.
- Я использую имитацию удара пробела после «табуляции» на флажок с клавиатурой, а не
выделять ()
команда, потому что
выделять ()
- не работал надежно, а кто-то на стековерфле говорил, что это может И они были правы. 🤷 Он нажимает кнопку Сохранить (Опять же, я имитирую это, практически ударяя «ввод» на клавиатуре, а не, нажав, потому что по какой-то причине это работало более надежно)
Это немного завораживает, чтобы посмотреть (Примечание – анимация ниже) :
Во всяком случае, на несколько минут.
Pro Tip: Не запускайте его, когда вы уже остаетесь поздно в офисе, и действительно просто хотите выключить компьютер и наслаждаться прекрасным вечером. 🌅
Шаг 4: Очистить с помощью Data Loader
Кампания И несколько других объектов имеют редактируемые разрешения, но не отображались как редактируемые через веб-панель, поэтому я нашел их, извлекая этот запрос с помощью Salesforce Data Loader :
SELECT Id, Field, SObjectType, PermissionsRead, PermissionsEdit FROM FieldPermissions WHERE parentId IN ( SELECT id FROM permissionset WHERE PermissionSet.Profile.Name = 'Pardot Data Sync') AND (PermissionsRead = true or PermissionsEdit = true)
Я использовал Excel, чтобы перевернуть «PermissionsRead» и «PermissionsEdit», чтобы ложь весь путь вниз по обею колонны.
Тогда, в двух проходах – опять же, делая «редактировать» сначала и «прочитать» второй (То есть я сопоставил «идентификатор» оба раза, но только сопоставил один столбец, который я хотел редактировать одновременно) с моими настройками загружать всего 1 запись за раз (Итак, одна ошибка не выключит пакет) Я передал эту электронную таблицу в операции обновления в погрузчике данных.
Это также заняло несколько минут (Опять же, помните, 1 запись одновременно) , но в конце концов он прошел.
Не производственное решение
Это не устойчивое в качестве долгосрочного решения для создания профиля «Zero».
Загрузка через API метаданных намного больше кошер И, вероятно, может быть сделано все за один шаг, вместо того, чтобы придираться к загрузчику данных для «очистки».
Кроме того, я даже не очень уверен I сделал Получите все условия безопасности на уровне полевых уровней, которые я мог бы выключить.
Я хотел бы быть более тщательным в будущем и по-настоящему набором разрешений, как я Предполагается Отказ
- Q: У кого-нибудь есть подсказки для строительства Идеально Список объектов и полей для записания разрешений для A
.Profile
файл?
Оригинал: “https://dev.to/katiekodes/no-permissions-salesforce-profile-w-python-and-selenium-2fc7”