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

问题描述:

在UWP应用程序中,我启用了User Account Information功能。无法在UWP应用程序中获取某些用户帐户信息 - 内部部署活动目录(不是Azure AD)

我需要得到的当前登录用户的用户名和域名(他们每个人分开)(在用户登录用在内部部署的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返回一个空字符串。即“”。为什么这不会返回任何价值?

我还检查以下内容:

  • 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>Privacy>Account Info被自动启用。

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

Settings-Privacy->AccountInfo

更新:

也使Enterprise Authentication能力后,KnownUserProperties.PrincipalName不会返回预期值。即[email protected]。 然而,如FirstName上面列出的其他属性,LastName等方法会返回一个空字符串,我仍然无法找到返回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; 
} 

至于域名,我不知道,但你可以尝试像MSDN描述或Windows.Networking.Connectivity.NetworkInformation.GetHostNames()等记述here通过Environment.UserDomainName访问它。