quickest way to findout if the ObjectID is Group Or User Or ServicePrincipal in Azure using C#

Viewed 408

I am writing a method to get DisplayName of off ObjectID. Is there a quick way to figure out if the ObjectID is a Group Or an User Or a ServicePrincipal

Below is my weird\Rough method which is working for me. But I wanted to check if anyone has any simpler Or cooler solution.

I tried searching online for some solutions but no luck yet.

public static async Task<string> GetDisplayName(string TenantID, string ObjectID, string MSGraphToken, string ObjectType)
    {
        string DisplayNameURI = null;
        string DisplayName = null;

        var DisplayNamehttpClient = new HttpClient
        {
            BaseAddress = new Uri("https://graph.windows.net/")
        };

        if (ObjectType.Equals("Decide", StringComparison.OrdinalIgnoreCase))
        {
            // trying servicePrincipals
            ObjectType = "servicePrincipals";
            DisplayNameURI = $"{TenantID}/{ObjectType}/{ObjectID}?api-version=1.6";
            var SPNhttpClient = new HttpClient
            {
                BaseAddress = new Uri("https://graph.windows.net/")
            };
            SPNhttpClient.DefaultRequestHeaders.Remove("Authorization");
            SPNhttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + MSGraphToken);
            HttpResponseMessage SPNResponse = await SPNhttpClient.GetAsync(DisplayNameURI).ConfigureAwait(false);
            var SPNHttpsResponse = await SPNResponse.Content.ReadAsStringAsync();
            dynamic SPNResult = JsonConvert.DeserializeObject<object>(SPNHttpsResponse);
            DisplayName = SPNResult.displayName;

            if (string.IsNullOrEmpty(DisplayName) == true)
            {
                // Trying for Users
                ObjectType = "users";
                DisplayNameURI = $"{TenantID}/{ObjectType}/{ObjectID}?api-version=1.6";
                var usershttpClient = new HttpClient
                {
                    BaseAddress = new Uri("https://graph.windows.net/")
                };
                usershttpClient.DefaultRequestHeaders.Remove("Authorization");
                usershttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + MSGraphToken);
                HttpResponseMessage usersResponse = await usershttpClient.GetAsync(DisplayNameURI).ConfigureAwait(false);
                var usersHttpsResponse = await usersResponse.Content.ReadAsStringAsync();
                dynamic usersResult = JsonConvert.DeserializeObject<object>(usersHttpsResponse);
                DisplayName = usersResult.displayName;

                if (string.IsNullOrEmpty(DisplayName) == true)
                {
                    //Trying for Groups
                    ObjectType = "groups";
                    DisplayNameURI = $"{TenantID}/{ObjectType}/{ObjectID}?api-version=1.6";
                    var groupshttpClient = new HttpClient
                    {
                        BaseAddress = new Uri("https://graph.windows.net/")
                    };
                    groupshttpClient.DefaultRequestHeaders.Remove("Authorization");
                    groupshttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + MSGraphToken);
                    HttpResponseMessage groupsResponse = await groupshttpClient.GetAsync(DisplayNameURI).ConfigureAwait(false);
                    var groupsHttpsResponse = await groupsResponse.Content.ReadAsStringAsync();
                    dynamic groupsResult = JsonConvert.DeserializeObject<object>(groupsHttpsResponse);
                    DisplayName = groupsResult.displayName;                        
                }
            }
        }
        else
        {
            DisplayNameURI = $"{TenantID}/{ObjectType}/{ObjectID}?api-version=1.6";

            DisplayNamehttpClient.DefaultRequestHeaders.Remove("Authorization");
            DisplayNamehttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + MSGraphToken);
            HttpResponseMessage DisplayNameResponse = await DisplayNamehttpClient.GetAsync(DisplayNameURI).ConfigureAwait(false);

            var DisplayNameHttpsResponse = await DisplayNameResponse.Content.ReadAsStringAsync();
            dynamic DisplayNameResult = JsonConvert.DeserializeObject<object>(DisplayNameHttpsResponse);
            DisplayName = DisplayNameResult.displayName;
        }
        //Console.WriteLine($"{DisplayName}");
        if (string.IsNullOrEmpty(DisplayName) == true)
        {
            DisplayName = "Unknown";
        }
        return DisplayName;
    }

1 Answers

You can directly find the AD object based on objectID using PowerShell.

Command: Get-AzureADObjectByObjectId -ObjectIds objectID1,objected2

Reference: Get-AzureADObjectByObjectId (AzureAD) | Microsoft Docs

Otherwise you can using C# for calling graph api to get the details.

Code:

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var ids = new List<String>()
{
    "objectID1",
    "objectID2"
};

var types = new List<String>()
{
    "user"
};

await graphClient.DirectoryObjects
    .GetByIds(ids,types)
    .Request()
    .PostAsync();

Reference: directoryObject: getByIds - Microsoft Graph v1.0 | Microsoft Docs

Related