使用 Java 检索所有托管设备使用 Microsoft Graph API SDK

问题描述

我想使用 Microsoft Graph Java SDK 检索由 Intune 管理的所有设备(托管设备)。我已在 Microsoft Azure 中创建了该应用程序并授予了相应的 API 权限:

API Permissions

以下代码创建了一个 graphClient 对象和一个检索所有托管设备的方法。

    @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 结果为空,这是错误消息:

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/managedDevices

感谢您的帮助

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)