繁体   English   中英

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

[英]Unable to get some user account information in UWP app - In-premise active directory (Not Azure AD)

在 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返回一个空字符串。 IE ””
  • KnownUserProperties.LastName返回一个空字符串。 IE ””
  • KnownUserProperties.PrincipalName返回一个空字符串。 IE ””
  • KnownUserProperties.ProviderName返回一个空字符串。 IE ””
  • KnownUserProperties.GuestHost返回一个空字符串。 IE ””

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

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

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

视窗版本

我将以下设置为Target versionMin Version

目标版本和最小版本

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

UserInfo 示例项目输出

以下是在Settings > Privacy > Account Info自动启用的。

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

设置-隐私->账户信息

更新:

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

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

我遇到了类似的问题,建议您使用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像描述的MSDNWindows.Networking.Connectivity.NetworkInformation.GetHostNames()等中描述的在这里

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

在 VS 中一切都设置好了

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

在德语 Windows 上安装的应用程序的属性

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM