我想从Microsoft Graph获得与Azure门户显示为用户名的值相同的值(如下所示):
userPrincipalName
已关闭,但对于来宾用户,它具有#EXT和下划线编码(例如,jim.oneil_outlook.com#EXT#@ redacted.onmicrosoft.com)。
mail
未填充成员用户,所以我不能依靠它,尽管这似乎是我想要的来宾。
更糟糕的是,我们确实有一个 member 用户,该用户也有一个EXT地址(其中mail
未填充 且userPrincipalName
编码),因此仅根据成员类型使用一个或另一个属性也不正确。对我来说,对userPrincipalName
进行解码和解析似乎很困难而且很笨拙。
答案 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仅提供MailNickName
,UserPrincipalName
和mail
。
根据我的测试,在这种情况下,我们只能通过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
属性。