无法在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
和上面列出的其他属性,如FirstName
,LastName
等只是返回一个空字符串。
我运行Windows的以下版本:
我有以下设置为Target version
和Min Version
:
为了验证,我还与测试UserInfo sample project by Microsoft from GitHub和我得到了以下输出:
下面在Settings
>Privacy
>Account Info
被自动启用。
TestApp
是我试过的应用程序和User Info C# Sample
是从GitHub上的示例应用程序:
更新:
也使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
访问它。