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

时间:2017-03-22 13:05:40

标签: c# active-directory uwp userinfo

在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;

的问题:

  • 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和上面列出的其他属性(例如FirstNameLastName等)只返回一个空字符串。

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

Windows Version

我将以下设置为Target versionMin Version

Target version and Min Version

为了验证,我还使用UserInfo sample project by Microsoft from GitHub进行了测试,得到了以下输出:

UserInfo Sample project output

以下内容已在Settings&gt;中自动启用Privacy&gt; Account Info

TestApp是我尝试过的应用,User Info C# Sample是来自GitHub的示例应用:

Settings-Privacy->AccountInfo

更新

启用Enterprise Authentication功能后,KnownUserProperties.PrincipalName会返回预期值。即user1@domain1.com。 但是,上面列出的其他属性(如FirstNameLastName等)只返回一个空字符串,但我仍然无法找到任何返回domain1\user1的属性(没有.com部分)

2 个答案:

答案 0 :(得分:0)

您尝试访问的信息不可靠,因为它们(如您所述)不必设置,并且通常也可以通过隐私设置限制访问。

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

using Microsoft.OneDrive.Sdk;

然后请求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;
}

至于域名,我不确定,但您可以尝试通过Environment.UserDomainNameWindows.Networking.Connectivity.NetworkInformation.GetHostNames()上描述的{{1}}访问它,如MSDN所述}。

答案 1 :(得分:0)

我找到了另一种可能的解决方案。如果您仍在本地调试此命令,或者该应用程序已安装在目标计算机上,则可以启用功能User Account Information,但不会传播到实际安装的应用程序:

In VS everything is set up

在开始菜单中搜索应用程序名称,然后右键单击条目并选择App settings时,您将获得以下信息:

Properties of the installed app on German Windows

我启用突出显示的选项(基本上说“帐户信息”)后,它就开始起作用。