在Windows 10 C# UWP通用Windows应用程序中获取用户名

14

我在 Windows 10 UWP 的世界中又遇到了一个简单的任务难题。

我只需要当前 Windows 用户的用户名。在 UWP 中,Environment.UserName 并不存在。无论我在网上搜索多少次,都没有得到帮助。因此,我在此发帖求助。

有人知道吗?现在这个问题有解决办法吗?


你能使用PInvoke吗?请参考这里:http://www.pinvoke.net/default.aspx/advapi32.getusername - GreatAndPowerfulOz
1
你的谷歌功夫还需要加强,年轻的蚂蚁:https://social.msdn.microsoft.com/Forums/en-US/03fce2c7-225e-40fe-ae7a-8dcef6c8f340/uwpcget-current-username?forum=wpdevelop - Jeremy Thompson
是的,PInvoke 可以工作。现在也看了其他答案。谢谢。 - Ian GM
嗨,Jeremy。是的,我先找到了那个页面。但是很遗憾它并没有帮助到我。不过 PInvoke 方法第一次就起作用了。 - Ian GM
4个回答

21
  1. 在Package.appxmanifest中添加"用户帐户信息"功能

Package.appxmanifest, User Account Information

  1. 使用以下代码获取用户显示名称:

    private async void Page_Loaded(object sender, RoutedEventArgs e)
    {
        IReadOnlyList<User> users = await User.FindAllAsync();
    
        var current = users.Where(p => p.AuthenticationStatus == UserAuthenticationStatus.LocallyAuthenticated && 
                                    p.Type == UserType.LocalUser).FirstOrDefault();
    
        // user may have username
        var data = await current.GetPropertyAsync(KnownUserProperties.AccountName);
        string displayName = (string)data;
    
        //or may be authinticated using hotmail 
        if(String.IsNullOrEmpty(displayName))
        {
    
            string a = (string)await current.GetPropertyAsync(KnownUserProperties.FirstName);
            string b = (string)await current.GetPropertyAsync(KnownUserProperties.LastName);
            displayName = string.Format("{0} {1}", a, b);
        }
    
        text1.Text = displayName;
    }
    

3
天啊,为了获取用户名需要做这么多工作。 - Mike Eason
我对这个答案不太清楚。代码中没有限制当前用户,相反,它加载系统中可能已登录的所有本地用户,然后仅显示第一个用户。Windows允许同时存在多个用户(例如:快速用户切换、终端服务和其他情况)。我没有看到任何可以保证在这些情况下正确识别用户的内容。 - Joel Coehoorn
1
你好,我也需要在我的UWP应用程序中获取当前用户,但我想要得到与命令行"whoami"(domain\name)相同的结果。 这可能吗?我基于@Sergiu Cojocaru提供的代码和UserInfo官方示例,但似乎不可能... 如果需要更多细节,我已经在另一个主题中提出了问题: http://stackoverflow.com/questions/40179695/uwp-get-the-current-username-to-provide-rights-to-the-user - Gold.strike
“Add "User Account Information" capability to your app” 是什么意思,你该如何实现? - slayernoah
2
在 @slayernoah 的评论中补充一点。在你的 Package.appxmanifest 文件中,确保在 <Capabilities> </Capabilities> 之间添加 <uap:Capability Name="userAccountInformation" />。这是针对 Windows 10 应用程序的,你必须添加这个。但是一旦添加了上述代码(Sergui 的代码),它就可以正常工作了。 - akasoggybunz
显示剩余2条评论

7
// get username
public string UserNameStr { get; set; } = WindowsIdentity.GetCurrent().Name;

这将得到完整的域\用户名。

5

谢谢,但不好。变量名=...会立即退出并结束后续处理的行。 - Ian GM
我没有测试过,但在这里有来自Microsoft官方的示例。希望能有所帮助。 - marcinax
也许Marcinax的答案可能有效。User.FindAllAsync(UserType.LocalUser)返回null,因此下一行代码会崩溃(异步,所以只是退出)。在Package.appxmanifest的Capabilities中是否需要勾选某些内容? - Ian GM
3
用户必须同意以获取这些信息,清单必须包含uap:userAccountInformation功能。 - Hans Passant
1
当我尝试使用GetPropertyAsyc时,代码一直卡在那里。var users = User.FindAllAsync(UserType.LocalUser).AsTask().Result; var name = users.FirstOrDefault().GetPropertyAsync(KnownUserProperties.AccountName).AsTask().Result.ToString(); return name;这段代码对我很有效。 - Timo Treichel
User.FindAllAsync(UserType)已经过时:'FindAllAsyncByType已被弃用,可能无法在所有平台上保持一致的功能。请改用FindAllAsync或GetDefault。' - Luca Ziegler

2
您还可以从Application.OnLaunched方法中获取启动应用程序的用户,请参见此处

但是,您仍需要在清单中声明用户信息功能。

快速示例(省略号表示不适用的生成代码):

sealed partial class App : Application
{
    ... 
    protected override void OnLaunched(LaunchActivatedEventArgs e)
    {
        User currentUser = e.User;
        ... 
    }
    ...
}          

1
啊,传入的用户为空。 - Jarryd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接