2014-11-20 11 views
6

Używam interfejsu Graph API do wysyłania zapytań do usługi Azure Active Directory przy użyciu projektu Microsoft.WindowsAzure.ActiveDirectory.GraphHelper jako bazy dla moich żądań.Pobieranie grup członków w Pomocniku wykresów Azure AD

W konkretnym przypadku użycia mam grupę zawierającą kilkuset użytkowników, a także kilka grup. Szukam załadować członków grupy tej nadrzędnej grupy. Starałem się zwrócić obciążenia nieruchomości members:

DirectoryService.LoadProperty(school, "members"); 

mam tylko 100 wyników, z których wszystkie są użytkownikami (ponownie, istnieje ponad 100 użytkowników w grupie).
Próbowałem wykonać DataServiceQuery ale nie obsługuje takiej operacji:

var groups = DirectoryService.groups; 
Group parentGroup = DirectoryService.groups.Where(it => (it.objectId == parentGroupId)).SingleOrDefault(); 
groups = (DataServiceQuery<Group>)groups.Where(group => group.memberOf.Contains(parentGroup)); 

To nie na trzecim wierszu mówi, że wyrażenie nie jest obsługiwany.

Obecnie jedynym rozwiązaniem mogę myśleć się ładuje ALL z grup, bieganie LoadPropert(entity, 'memberOf', null) na każdym jeden, a następnie sprawdzenie każdego z nich, czy jest członkiem parentGroup (faktycznie, jeden z kilka takich grup ParentGroups). Uwaga - Umieszczam null w przestrzeni continuationToken, ponieważ te grupy powinny być członkami tylko jednej grupy nadrzędnej.

To jest strasznie nieefektywne, ale nie mogę znaleźć innego sposobu!
Czy istnieje inny sposób robienia tego, co próbuję zrobić?

Odpowiedz

11

Interfejs API wykresów AAD zwraca obecnie 100 elementów na stronę. Jeśli zgłoszenie dotyczy więcej niż jednej strony danych, odpowiedź zawiera link do następnej strony danych. Od Supported Queries, Filters, and Paging Options in Azure AD Graph API:

odpowiedź, która zawiera stronicowanych wyników będzie zawierać token SKIP (odata.nextLink), który pozwala dostać następną stronę wyników.

Najprostszym sposobem, aby to zobaczyć, jest zalogowanie się jako użytkownik katalogu do https://graphexplorer.cloudpp.net. Następnie należy wykonać proste GET:

https://graph.windows.net/<your.domain.name>/users 

Skoro masz więcej niż 100 użytkowników, jeśli przewinąć w dół wyników zobaczysz właściwość odata.nextLink. Jeśli skopiujesz zawartość tej właściwości i użyjesz jej w następnym zapytaniu, otrzymasz następną stronę. Kontynuując ten przykład, kolejna prośba będzie wyglądać mniej więcej tak:

https://graph.windows.net/<your.domain.name>/directoryObjects/$/Microsoft.WindowsAzure.ActiveDirectory.User?$skiptoken=X'4453... 

zauważam używasz biblioteki deprecated pomocnika Microsoft.WindowsAzure.ActiveDirectory.GraphHelper. Zamiast tego należy użyć nowszej (i obsługiwanej) biblioteki klienta Graph API: Microsoft.Azure.ActiveDirectory.GraphClient (NuGet). Poniższy fragment kodu pobiera wszystkie elementy grupy i drukuje tylko wyświetlaną nazwę obiektów grupy:

// Fetch group member objects 
IGroupFetcher groupFetcher = (IGroupFetcher)parentGroup; 
IPagedCollection<IDirectoryObject> members = 
    groupFetcher.Members.ExecuteAsync().Result; 

// Iterate over each page keep only the Groups 
do 
{ 
    List<IDirectoryObject> directoryObjects = members.CurrentPage.ToList(); 
    foreach (IDirectoryObject member in directoryObjects) 
    { 
     if (member is Group) 
     { 
      Group group = member as Group; 
      Console.WriteLine("Group: {0}", group.DisplayName); 
     } 
    } 
    members = members.MorePagesAvailable ? 
     members = members.GetNextPageAsync().Result : null; 
} while (members != null); 
+0

Ta obsada to paskudna robota, która zajęła mi wiele dni.Wykres zwraca kolekcje MemberOf i Members, które są puste, dopóki nie wykonasz wzorca pobierania w kodzie AzureADSamples. –

Powiązane problemy