如何使用Microsoft Graph获得等效的“用户名”

时间:2018-08-17 21:30:56

标签: azure-active-directory microsoft-graph

我想从Microsoft Graph获得与Azure门户显示为用户名的值相同的值(如下所示):

enter image description here

userPrincipalName已关闭,但对于来宾用户,它具有#EXT和下划线编码(例如,jim.oneil_outlook.com#EXT#@ redacted.onmicrosoft.com)。

mail未填充成员用户,所以我不能依靠它,尽管这似乎是我想要的来宾。

更糟糕的是,我们确实有一个 member 用户,该用户也有一个EXT地址(其中mail未填充 userPrincipalName编码),因此仅根据成员类型使用一个或另一个属性也不正确。对我来说,对userPrincipalName进行解码和解析似乎很困难而且很笨拙。

3 个答案:

答案 0 :(得分:1)

  

我想从Microsoft Graph获取与Azure门户显示为用户名的值相同的值。

根据user对象,使用Microsoft Graph Microsoft Graph 没有等同于“用户名”。

  

对我来说,解码和解析userPrincipalName似乎很脆弱且笨拙。

我不理解为什么解码和解析userPrincipalName对您来说似乎很脆弱且笨拙。实际上,这是获取“用户名”的一种方法。我们可以轻松做到这一点。

如果可以使用C#代码,则可以参考以下代码。

string graphResourceId = "https://graph.microsoft.com/";
string authority = "https://login.microsoftonline.com/{0}";
string tenantId = "tenant Id";
string clientId = "clientId";
string secret = "scret key";
authority = String.Format(authority, tenantId);
var graphserviceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(
                requestMessage =>
                {
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);

                    return Task.FromResult(0);
                }));

 var displayName = "xxxx";
 var users = graphserviceClient.Users.Request().Select(x =>new 
 {
     x.UserPrincipalName,
     x.DisplayName

 } ).Filter("DisplayName eq '" + displayName + "'").GetAsync().Result;
 var user = users.FirstOrDefault();
 string userName = string.Empty;
 string userPrincipalName = user.UserPrincipalName;
 if (userPrincipalName.Contains("#EXT#"))
 {
      userName = user.UserPrincipalName.Substring(0, userPrincipalName.IndexOf("#")).Replace('_', '@');
 }
 else
 {
    userName = user.UserPrincipalName;
 }

以下是整个演示代码

$Header = @"
<style>
TABLE {border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}
TH {border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color: #6495ED;}
TD {border-width: 1px;padding: 3px;border-style: solid;border-color: black;}
.odd  { background-color:#ffffff; }
.even { background-color:#dddddd; }
</style>
<title>
Title of my Report
</title>
"@
$Pre = "Heading before the report"
$Post = "Footer after the report"

$MyObject | Select 'Folder Name',Owner,'Created On','Last Updated',Size | ConvertTo-HTML -Head $Header -PreContent $Pre -PostContent $Post | Set-AlternatingRows -CSSEvenClass even -CSSOddClass odd

答案 1 :(得分:0)

根据您的描述,您要检索用户名。但是,Microsoft Graph仅提供MailNickNameUserPrincipalNamemail

根据我的测试,在这种情况下,我们只能通过UserPrincipalName获取用户名。

尽管某些用户的电子邮件地址中有EXT,但他们不包含#。因此,我们可以通过解析userPrincipalName是否包含#来排除那些存在的用户。

答案 2 :(得分:0)

在示例中,您指的是Azure AD中的B2B用户。正如您在问题中所指出的,Azure AD中的B2B用户有所不同。在Azure AD中,B2B用户的userType属性值设置为“ 来宾”-而租户的本地帐户设置为“ 托管”。因此,您可以有一些逻辑来检查userType(例如在图中),以查看所有这些B2B用户,可以对下一个端点GET执行https://graph.microsoft.com/v1.0/users?$filter=userType eq 'Guest'。然后,您也可以进行

之类的if statement
var logonName = "";  # holder for the logon name of the user
if(user.userType === 'Guest'){
  logonName = user.mail
} 
else {
  logonName = user.userPrincipalName
}

简而言之,对于B2B用户,您需要该信息的user.mail属性。