#python-3.x #azure
#python-3.x #azure
Вопрос:
Экспериментирую с python3 для составления списка групп объявлений, но я заблокирован из-за ошибки при попытке перебора класса ADPagedGroup… используемые пакеты azure = 4.0.0 и azure-graphrbac = 0.61.0
Я пробовал использовать 2 версии azure-graphrbac 0.40.0, поскольку это то, что требуется Azure 4.0.0, и с 0.61.0 ошибки в любом случае.
these_groups
это тип ADGroupPaged, но на сайте Microsoft нет примеров или документов, которые имели бы смысл для меня.
В приведенном ниже коде я пробовал различные варианты итерации по объекту these_groups
# ./adal_test1.py ## piece of shoe
from azure.common.credentials import get_azure_cli_credentials
from azure.graphrbac import GraphRbacManagementClient
from azure.common.credentials import ServicePrincipalCredentials
from azure.graphrbac.models import GroupCreateParameters, GroupAddMemberParameters
# client_id, secret and tenant_id defined in list, but redacted here
credentials = ServicePrincipalCredentials(
client_id=client_id,
secret=secret,
tenant=tenant_id
)
try:
these_groups = graphrbac_client.groups.list()
except expression as identifier:
print('Huh, why?')
finally:
for a in vars(these_groups):
print("DEBUG: VAR::",a)
for b in these_groups:
#also these_groups.list:
# " " .list():
# " " .list():
# " " ._get_next:
# " " .current_page: # NOTHING RETURNED
print('DEBUG: B is::',b) # <-- we NEVER make it here
for c in vars(b):
print('DEBUG: LOOP LIST::',c)
Результат pip3 adal_test1.py
VAR: _async_get_next
VAR: next_link
VAR: _current_page_iter_index
VAR: current_page
VAR: _derserializer
VAR: _get_next
VAR: _response
VAR: _raw_headers
Traceback (most recent call last):
File "adal_test1.py", line 50, in <module>
for b in these_groups:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 143, in __next__
self.advance_page()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 129, in advance_page
self._response = self._get_next(self.next_link)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/azure/graphrbac/operations/groups_operations.py", line 306, in internal_paging
Просто хочу ссылаться на каждую возвращенную группу объявлений, но не могу понять, как использовать выгружаемый объект.
выборка сбоев
for b in these_groups._get_next:
TypeError: 'function' object is not iterable
for b in these_groups:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 143, in __next__
self.advance_page()
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/paging.py", line 129, in advance_page
self._response = self._get_next(self.next_link)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/azure/graphrbac/operations/groups_operations.py", line 306, in internal_paging
url = self._client.format_url(url, **path_format_arguments)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/msrest/service_client.py", line 155, in format_url
base = self.config.base_url.format(**kwargs).rstrip('/')
AttributeError: 'tuple' object has no attribute 'format'
for b in these_groups.list:
AttributeError: 'ADGroupPaged' object has no attribute 'list'
Интересная разница, однако, с методами current_page
и next_link
ничего не возвращается,
Комментарии:
1. Пожалуйста, попробуйте это
for g in graphrbac_client.groups.list(): print('DEBUG: LOOP LIST::',g.object_id)
2. почему бы вам просто не выполнить dir(b) и посмотреть, что он предлагает? или установить точку останова и тщательно изучить объект?
3. Спасибо за ответы, но выглядит более сложным, чем пара циклов над вызовом метода. Заглянул в нутро
azure-cli
( а-ля: azure-sdk_for-python ), чтобы обнаружить, что они используют рекурсивную функцию, вызываемуюinternal_paging
с некоторой десериализацией, для обходаADGroupPaged
объекта, См. Строки: 298-344 Я новичок @ python, так что все это хороший опыт обучения.
Ответ №1:
Оказывается, решение моего вопроса было довольно простым, просто неочевидным в какой-либо документации MS или иным образом (которую я смог найти)
Два изменения:
1) Обязательно. Для вызовов ActiveDirectory конструкции ServicePrincipalCredentials требуется, чтобы параметр resource был специально установлен на graph.windows.net
например
resource_adgraph = "https://graph.windows.net"
credentials = ServicePrincipalCredentials(
client_id=client_id,
secret=secret,
tenant=tenant_id,
resource=resource_adgraph
)
graphrbac_client = GraphRbacManagementClient(
credentials,
tenant_id
)
2) Необязательно. Импортируйте ADGroup
класс
from azure.graphrbac.models import GroupCreateParameters, GroupAddMemberParameters, GetObjectsParameters, ADGroup
Новый вывод: с отредактированными соответствующими именами
. . .
DEBUG: VAR:: _async_get_next
DEBUG: VAR:: next_link
DEBUG: VAR:: _current_page_iter_index
DEBUG: VAR:: current_page
DEBUG: VAR:: _derserializer
DEBUG: VAR:: _get_next
DEBUG: VAR:: _response
DEBUG: VAR:: _raw_headers
DEBUG: B is:: {'additional_properties': {'dirSyncEnabled': None, 'onPremisesDomainName': None, 'odata.type': 'Microsoft.DirectoryServices.Group', 'onPremisesSamAccountName': None, 'provisioningErrors': [], 'proxyAddresses': [], 'description': None, 'onPremisesSecurityIdentifier': None, 'lastDirSyncTime': None, 'onPremisesNetBiosName': None}, 'object_id': '04b__VALUE_REDACTED__43e', 'deletion_timestamp': None, 'object_type': 'Group', 'display_name': '__VALUE_REDACTED__', 'mail_enabled': False, 'mail_nickname': '__VALUE_REDACTED__', 'security_enabled': True, 'mail': None}
RAW ADGraph object: __GROUP__NAME__REDACTED__
DEBUG: LOOP LIST:: additional_properties
DEBUG: LOOP LIST:: object_id
DEBUG: LOOP LIST:: deletion_timestamp
DEBUG: LOOP LIST:: object_type
DEBUG: LOOP LIST:: display_name
DEBUG: LOOP LIST:: mail_enabled
DEBUG: LOOP LIST:: mail_nickname
DEBUG: LOOP LIST:: security_enabled
DEBUG: LOOP LIST:: mail
. . . [snip] . . .