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

Posted

技术标签:

【中文标题】无法在 UWP 应用中获取某些用户帐户信息 - 内部活动目录(不是 Azure AD)【英文标题】:Unable to get some user account information in UWP app - In-premise active directory (Not Azure AD) 【发布时间】:2017-08-14 14:49:33 【问题描述】:

在 UWP 应用中,我启用了User Account Information 功能。

我需要获取当前登录用户的用户名和域名(分别)(用户使用本地 Active Directory 帐户登录 - 不是 Azure AD )。

例如,用户将使用用户名 user1 登录到 Active Directory 域 domain1。即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 返回一个空字符串。 IE。 ””。为什么这不返回任何值?

我还检查了以下内容:

KnownUserProperties.FirstName 返回一个空字符串。即“” KnownUserProperties.LastName 返回一个空字符串。即“” KnownUserProperties.PrincipalName 返回一个空字符串。即“” KnownUserProperties.ProviderName 返回一个空字符串。即“” KnownUserProperties.GuestHost 返回一个空字符串。即“”

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

我知道我可以得到strDomainName 的值并执行字符串函数来得到我需要的东西。但我想知道是否有任何方法可以直接获取这些信息。也很好奇为什么KnownUserProperties.AccountName 和上面列出的其他属性如FirstNameLastName 等只返回一个空字符串。

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

我有以下设置为Target versionMin Version

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

Settings > Privacy > Account Info 中自动启用了以下功能。

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

更新:

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

【问题讨论】:

【参考方案1】:

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

我遇到了类似的问题,建议您使用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.UserDomainName 访问它,如MSDN 所述,或使用Windows.Networking.Connectivity.NetworkInformation.GetHostNames() 访问它,如here 所述。

【讨论】:

【参考方案2】:

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

当您在开始菜单中搜索您的应用名称,然后右键单击该条目并选择App settings 时,您会看到如下内容:

一旦我启用了突出显示的选项(基本上是“帐户信息”),它就起作用了。

【讨论】:

以上是关于无法在 UWP 应用中获取某些用户帐户信息 - 内部活动目录(不是 Azure AD)的主要内容,如果未能解决你的问题,请参考以下文章

在Windows 10 C#UWP通用Windows应用程序中获取UserName

在UWP中存储用户可访问文件的位置?

应用内购买 - 可以获取产品信息但无法连接到 iTunes 进行购买

UWP 应用获取各类系统用户信息 - 设备和系统的基本信息应用包信息用户数据账户信息和用户账户信息

UWP 应用获取各类系统用户信息 - 商店授权信息零售演示模式信息广告 IDEAS 设备信息硬件识别信息移动网络信息

无法通过 DataTemplates 设置控制的可见性