簡體   English   中英

使用 Java 檢索所有托管設備(使用 Microsoft Graph API SDK)

[英]Retrieve all Managed Devices using Java (with Microsoft Graph API SDK)

我想使用 Microsoft Graph Java SDK 檢索 Intune 管理的所有設備(托管設備)。 我已經在 Microsoft Azure 中創建了該應用程序,並授予了相應的 API 權限:

API 權限

以下代碼創建一個 graphClient object 和一個檢索所有托管設備的方法。

    @Service
public class AzureServiceDefault implements AzureService
    {
        private static final String CLIENT_ID = "XXXXXXXXXXXXXXXXXXXXXXXX";
        private static final List<String> SCOPES = Arrays.asList(new String[]{"https://graph.microsoft.com/.default"});
        private static final String TENANT = "XXXXXXXXXXXXXXXXXXXXXXXX";
        private static final String CLIENT_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXX";
        ClientCredentialProvider authProvider = new ClientCredentialProvider(CLIENT_ID, SCOPES, CLIENT_SECRET, TENANT, NationalCloud.Global);
        IGraphServiceClient graphClient;
    
        public AzureServiceDefault()
        {
            graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();
    
        } 

    @Override
        public List<IntuneDevice> getManagedDevices()
        {
            IManagedDeviceCollectionRequestBuilder managedDeviceRequestBuilder;
            IDeviceManagementRequestBuilder builder = graphClient.deviceManagement();
            IDeviceManagementRequest managedDevicesRequest = builder.buildRequest();
            List<ManagedDevice> managedDevices = new ArrayList<>();
            List<IntuneDevice> allManagedDevices = new ArrayList<>();
            
            do {
                try {
                    DeviceManagement deviceManagement = managedDevicesRequest.get();
                    ManagedDeviceCollectionPage managedDevicesCollectionPage = deviceManagement.managedDevices;
                    
                    //Process items in the response
                    managedDevices.addAll(managedDevicesCollectionPage.getCurrentPage());
                    managedDevices.stream().forEach((device) -> allManagedDevices.add(new IntuneDevice(device.id, 
                                                                                               device.userId,
                                                                                               device.deviceName,
                                                                                               device.managedDeviceOwnerType.toString(),
                                                                                               device.operatingSystem,
                                                                                               device.osVersion,
                                                                                               device.complianceState.toString(),
                                                                                               device.azureADRegistered,
                                                                                               device.azureADDeviceId,
                                                                                               device.userPrincipalName,
                                                                                               device.model,
                                                                                               device.manufacturer,
                                                                                               device.serialNumber)));
                
                
                
                    //Build the request for the next page, if there is one
                    managedDeviceRequestBuilder = managedDevicesCollectionPage.getNextPage();
                    if (managedDeviceRequestBuilder == null)
                    {
                        managedDevicesRequest = null;
                    }
                    else
                    {
                        managedDevicesRequest = (IDeviceManagementRequest) managedDeviceRequestBuilder.buildRequest();
                    }
                }
                catch(ClientException ex)
                {
                    ex.printStackTrace();
                    managedDevicesRequest = null;
                }
    
            } while (managedDevicesRequest != null);
            
            return allManagedDevices;
 

           }
    }

問題是變量 managedDevices 原來是 null ,這是錯誤消息:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/] threw exception [Request processing failed; nested exception is java.lang.NullPointerException: Cannot invoke "com.microsoft.graph.requests.extensions.ManagedDeviceCollectionPage.getCurrentPage()" because "managedDevicesCollectionPage" is null] with root cause
java.lang.NullPointerException: Cannot invoke "com.microsoft.graph.requests.extensions.ManagedDeviceCollectionPage.getCurrentPage()" because "managedDevicesCollectionPage" is null

我需要更改什么才能使此代碼正常工作? 我成功地檢索到 Azure AD 中的所有用戶,但我在從 Intune/Endpoint Manager 獲取數據時遇到了困難。 我需要對 SCOPE 進行更改嗎?

應該可以將所有托管設備檢索為 REST API 因為它是https://graph.microsoft.com/v1.0/deviceManagement/managedDevice

謝謝你的幫助

MS Graph API不支持應用程序權限,因此您無法使用 ClientCredentialProvider 列出ClientCredentialProvider ClientCredentialProvider 基於需要應用程序權限的客戶端憑據流。

在此處輸入圖像描述

您可以使用AuthorizationCodeProvider來獲取列表。 並按照首先獲取 AUTHORIZATION_CODE。

    String CLIENT_ID = "xxxxxx";
    List<String> SCOPES = Arrays.asList(new String[] { "https://graph.microsoft.com/.default" });
    String CLIENT_SECRET = "xxxxxx";
    String TENANT = "xxxxxx";
    String AUTHORIZATION_CODE = "";
    String REDIRECT_URL = "xxxxxx";

    AuthorizationCodeProvider authProvider = new AuthorizationCodeProvider(CLIENT_ID, SCOPES, AUTHORIZATION_CODE,
            REDIRECT_URL, NationalCloud.Global, TENANT, CLIENT_SECRET);

    IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();

    IManagedDeviceCollectionPage managedDeviceCollectionPage = graphClient.deviceManagement().managedDevices().buildRequest().get();
    List<ManagedDevice> managedDeviceList = managedDeviceCollectionPage.getCurrentPage();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM