无法在UWP应用程序中获取某些用户帐户信息 - 内部部署活动目录(非Azure AD)

sla*_*oah 7 c# active-directory userinfo uwp

在UWP应用程序中,我启用了该User Account Information功能.

我需要获取当前登录用户的用户名和域名(每个用户名单独)(用户使用内部部署的Active Directory帐户登录 - 非Azure AD).

例如,用户将domain1使用用户名登录Active Directory域user1.即domain1\user1.

我使用以下代码来尝试获取所需的详细信息:

IReadOnlyList<User> users = await User.FindAllAsync();

var user = users.FirstOrDefault();

// get domain
var data1 = await user.GetPropertyAsync(KnownUserProperties.DomainName);
string strDomainName = (string)data1;

// get username
var data2 = await user.GetPropertyAsync(KnownUserProperties.AccountName);
string strUserName = (string)data2;
Run Code Online (Sandbox Code Playgroud)

问题:

  • strDomainName回报domain1.com\user1.为什么这包括.com我们所有域名的部分?在c#winforms应用程序上,我们可以轻松获得domain1\user1任何问题.
  • strUserName返回一个空字符串.即"".为什么这不会返回任何价值?

我还检查了以下内容:

  • KnownUserProperties.FirstName返回一个空字符串.即""
  • KnownUserProperties.LastName返回一个空字符串.即""
  • KnownUserProperties.PrincipalName返回一个空字符串.即""
  • KnownUserProperties.ProviderName返回一个空字符串.即""
  • KnownUserProperties.GuestHost返回一个空字符串.即""

还有什么我需要启用类似的User Account Information功能吗?或者是否有任何其他权限需要授予应用程序才能获取此信息?

我知道我可以获得值strDomainName并执行字符串函数来获得我需要的东西.但我想知道是否有任何方法可以直接获取此信息.也好奇为什么KnownUserProperties.AccountName和其它性质上面列出诸如FirstName,LastName等只是返回空字符串.

我正在运行以下版本的Windows:

Windows版本

我有以下设置为Target versionMin Version:

目标版本和最低版本

为了验证,我还使用Microsoft的GitHubUserInfo示例项目进行了测试,得到了以下输出:

UserInfo示例项目输出

以下是以自动启用Settings> Privacy> Account Info.

TestApp是我试过的应用程序,User Info C# Sample是GitHub的示例应用程序:

设置 - 与隐私> AccountInfo

更新:

启用该Enterprise Authentication功能后,KnownUserProperties.PrincipalName确实返回预期值.即user1@domain1.com.然而,其他性能上面,如上市FirstName,LastName等会返回一个空字符串,我仍然无法找到返回任何财产domain1\user1(不包括.com部分)

use*_*834 0

您尝试访问的信息不可靠,因为它们(正如您提到的)不需要设置,而且通常可以通过隐私设置限制对它们的访问。

我遇到了类似的问题,建议您使用UWP OneDrive API

using Microsoft.OneDrive.Sdk;
Run Code Online (Sandbox Code Playgroud)

然后请求wl.basic范围。该范围至少包含一个可靠的用户名。

public static async Task<bool> GetAuthenticatedClient()
{
    string oneDriveConsumerBaseUrl = "https://api.onedrive.com/v1.0";

    var scopes = new List<string>
    {
        "wl.signin",
        "wl.basic",
    };

    Task authTask;

    var onlineIdAuthProvider = new OnlineIdAuthenticationProvider(scopes.ToArray());
    authTask = onlineIdAuthProvider.RestoreMostRecentFromCacheOrAuthenticateUserAsync();
    oneDriveClient = new OneDriveClient(oneDriveConsumerBaseUrl, onlineIdAuthProvider);
    AuthProvider = onlineIdAuthProvider;

    try
    {
        await authTask;

        if (!AuthProvider.IsAuthenticated)
        {
            return false;
        }
    }
    catch (ServiceException exception)
    {
        // Swallow the auth exception but write message for debugging.
        //Debug.WriteLine(exception.Error.Message);

        return false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

至于域名,我不确定,但您可以尝试通过MSDNEnvironment.UserDomainName上描述的方式或此处描述的方式访问它。Windows.Networking.Connectivity.NetworkInformation.GetHostNames()