Imansible ottenere alcune informazioni sull’account utente nell’app UWP: directory triggers in locale (non Azure AD)

In un’app UWP, ho abilitato la funzionalità User Account Information .

Devo ottenere il nome utente e il nome di dominio (ciascuno separatamente) dell’utente attualmente connesso (gli utenti sono connessi con un account Active Directory locale – Non Azure AD ).

Ad esempio, l’utente eseguirà l’accesso al dominio di dominio Active Directory1 utilizzando il nome utente user1 . cioè domain1\user1 .

Sto usando il seguente codice per cercare di ottenere i dettagli richiesti:

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

Problemi:

  • strDomainName restituisce domain1.com\user1 . Perché questo include la parte .com per tutti i nostri domini? Sulle applicazioni c # winforms possiamo facilmente ottenere domain1\user1 senza alcun problema.
  • strUserName restituisce una stringa vuota. cioè “”. Perché questo non restituisce alcun valore?

Ho anche controllato quanto segue:

  • KnownUserProperties.FirstName restituisce una stringa vuota. cioè “”
  • KnownUserProperties.LastName restituisce una stringa vuota. cioè “”
  • KnownUserProperties.PrincipalName restituisce una stringa vuota. cioè “”
  • KnownUserProperties.ProviderName restituisce una stringa vuota. cioè “”
  • KnownUserProperties.GuestHost restituisce una stringa vuota. cioè “”

C’è qualcos’altro che devo abilitare in modo simile alla funzionalità User Account Information ? O ci sono altre autorizzazioni che devono essere concesse all’app per ottenere queste informazioni?

Capisco che posso ottenere il valore di strDomainName ed eseguire le funzioni di stringa per ottenere ciò di cui ho bisogno. Ma voglio sapere se c’è un modo per ottenere direttamente queste informazioni. Inoltre, è curioso KnownUserProperties.AccountName perché KnownUserProperties.AccountName e altre proprietà elencate sopra come FirstName , LastName ecc. Restituiscono semplicemente una stringa vuota.

Sto eseguendo la seguente versione di Windows:

Versione di Windows

Ho il seguente set come Target version e Min Version :

Versione di destinazione e versione minima

Per verificare, ho anche testato con il progetto di esempio UserInfo di Microsoft di GitHub e ho ottenuto il seguente risultato:

UserInfo Esempio di output del progetto

Quanto segue è stato abilitato automaticamente in Settings > Privacy > Account Info .

TestApp è l’app con cui ho provato e User Info C# Sample è l’app di esempio di GitHub:

AccountInfo”>

Aggiornare:

Dopo aver abilitato anche la funzionalità di Enterprise Authentication , KnownUserProperties.PrincipalName restituisce il valore previsto. cioè [email protected] . Tuttavia, altre proprietà elencate sopra come FirstName , LastName ecc. Restituiscono semplicemente una stringa vuota e non riesco ancora a trovare alcuna proprietà che restituisca domain1\user1 (senza la parte .com )

Le informazioni a cui si sta tentando di accedere non sono affidabili, in quanto non è necessario impostare (come si è detto) e possono essere limitate l’accesso alle impostazioni di privacy in generale.

Ho avuto un problema simile e ti consiglierei di utilizzare l’ UWP OneDrive API

 using Microsoft.OneDrive.Sdk; 

e quindi richiedere wl.basic ambito wl.basic . Questo ambito contiene almeno un nome utente affidabile.

 public static async Task GetAuthenticatedClient() { string oneDriveConsumerBaseUrl = "https://api.onedrive.com/v1.0"; var scopes = new List { "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; } 

Per quanto riguarda il dominio, non ne sono sicuro, ma potresti provare ad accedervi tramite Environment.UserDomainName come descritto su MSDN o con Windows.Networking.Connectivity.NetworkInformation.GetHostNames() come descritto qui .