c# - 无法在 UWP 应用程序中获取某些用户帐户信息 - 内部事件目录(不是 Azure AD)

标签 c# active-directory uwp userinfo

在 UWP 应用中,我启用了用户帐户信息功能。

我需要获取当前登录用户的用户名和域名(每个单独)(用户使用内部部署的 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 返回空字符串。即“”

还有什么我需要启用类似于用户帐户信息功能吗?或者是否需要授予该应用任何其他权限才能获取此信息?

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

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

Windows Version

我将以下设置为目标版本最低版本:

Target version and Min Version

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

UserInfo Sample project output

以下已在设置 > 隐私 > 帐户信息中自动启用。

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

Settings-Privacy->AccountInfo

更新:

同时启用 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 访问它,如 MSDN 中所述或使用 Windows.Networking.Connectivity.NetworkInformation.GetHostNames() 描述 here .

关于c# - 无法在 UWP 应用程序中获取某些用户帐户信息 - 内部事件目录(不是 Azure AD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42952503/

相关文章:

c# - UWP Entity Framework Core SQLITE 在 Release模式下崩溃

powershell - 使用 PowerShell 有效访问 Active Directory 对象

c# - 使用 LDAP 启用/禁用 AD 用户

c# - UWP:语言的资源文件未正确部署

c# - 通过在 c# 中使用 console.writeline 获取 byte [][] 的输出,servicestack

windows-7 - Windows 7 上的 Active Directory 服务器

c# - UWP 相当于 Timer.Elapsed 事件

c# - 如何拦截和取消方法执行

c# - 检查 Razor 页面中的登录用户角色

c# - 将值从表单传递到文本框