2017-03-22 6 views
7

Dans une application UWP, j'ai activé la fonctionnalité User Account Information.Impossible d'obtenir des informations de compte utilisateur dans l'application UWP - Répertoire actif en local (non Azure AD)

Je dois obtenir le nom d'utilisateur et le nom de domaine (chacun séparément) de l'utilisateur actuellement connecté (Les utilisateurs sont connectés avec un compte Active Directory sur site - Non Azure AD). Par exemple, l'utilisateur se connecterait au domaine Active Directory domain1 à l'aide du nom d'utilisateur user1. c'est-à-dire domain1\user1.

J'utilise le code suivant pour essayer d'obtenir les détails nécessaires:

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; 

Questions:

  • strDomainName retours domain1.com\user1. Pourquoi cela inclut-il la partie .com pour tous nos domaines? Sur les applications winforms C#, nous pouvons facilement obtenir domain1\user1 sans aucun problème.
  • strUserName renvoie une chaîne vide. c'est à dire. "". Pourquoi cela ne renvoie-t-il aucune valeur?

J'ai aussi vérifié les éléments suivants:

  • KnownUserProperties.FirstName retourne une chaîne vide. c'est-à-dire ""
  • KnownUserProperties.LastName renvoie une chaîne vide. c'est-à-dire ""
  • KnownUserProperties.PrincipalName renvoie une chaîne vide. c'est-à-dire ""
  • KnownUserProperties.ProviderName renvoie une chaîne vide. c'est-à-dire ""
  • KnownUserProperties.GuestHost renvoie une chaîne vide. c'est-à-dire ""

Y at-il autre chose dont j'ai besoin pour activer la capacité User Account Information? Ou existe-t-il d'autres autorisations qui doivent être accordées à l'application pour obtenir cette information? Je comprends que je peux obtenir la valeur strDomainName et effectuer des fonctions de chaîne pour obtenir ce dont j'ai besoin. Mais je veux savoir s'il existe un moyen d'obtenir cette information directement. Aussi curieux pourquoi KnownUserProperties.AccountName et d'autres propriétés énumérées ci-dessus tels que FirstName, LastName etc juste renvoie une chaîne vide.

J'exécute la version suivante de Windows:

Windows Version

Je le suivant défini comme Target version et Min Version:

Target version and Min Version

Pour vérifier, j'ai aussi testé avec le UserInfo sample project by Microsoft from GitHub et j'ai eu la sortie suivante:

UserInfo Sample project output

Ce qui suit a été activée automatiquement dans Settings>Privacy>Account Info.

TestApp est l'application que j'ai essayé avec et User Info C# Sample est l'exemple d'application de GitHub:

Settings-Privacy->AccountInfo

Mise à jour:

Après avoir activé également la capacité Enterprise Authentication, KnownUserProperties.PrincipalName ne retourne l'attend valeur. c'est-à-dire [email protected]. Cependant, d'autres propriétés énumérées ci-dessus comme FirstName, etc. LastName juste retourne une chaîne vide et je suis toujours incapable de trouver une propriété qui retourne domain1\user1 (sans la partie .com)

Répondre

0

Les informations que vous essayez d'accéder sont pas fiable, car ils (comme vous l'avez mentionné) ne doivent pas être définis et aussi ils peuvent être restreints l'accès à via les paramètres de confidentialité en général.

J'ai eu un problème similaire et vous conseille d'utiliser le UWP OneDrive API

using Microsoft.OneDrive.Sdk; 

puis demander wl.basic portée. Cette portée contient au moins un nom d'utilisateur fiable.

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

En ce qui concerne le domaine, je ne suis pas sûr, mais vous pouvez essayer d'y accéder via Environment.UserDomainName comme décrit sur MSDN ou avec Windows.Networking.Connectivity.NetworkInformation.GetHostNames() comme décrit here.