かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

UWPでユーザー名を取得する

Win8系の頃はUserInformationっていうクラスで取れてたんですがWin10では非推奨になったんですね。知りませんでした。

ということでWindows.System.Userクラスを使ってユーザー名を取ります。

手順としては、User.FindAllAsyncでユーザーを取得して、GetPropertyAsyncにKnownUserPropertiesを指定して各種情報を取るという手順です。

あと、重要なことですがPackage.appxmanifestの機能で「ユーザーアカウント情報」にチェックを入れないと動きません。重要なことですがPackage.appxmanifestの機能で「ユーザーアカウント情報」にチェックを入れないと動きません。大事なことなので2回。エラーも出ずにするっと動きます。

例えばユーザー名を取りたかったら以下のような感じです。

// ローカルユーザーでローカルで認証されてる人だけ
var user = (await User.FindAllAsync(UserType.LocalUser, UserAuthenticationStatus.LocallyAuthenticated)).FirstOrDefault();
if (user == null) { return; }

var displayName = await user.GetPropertyAsync(KnownUserProperties.AccountName) as string;
if (string.IsNullOrWhiteSpace(displayName))
{
    displayName = await user.GetPropertyAsync(KnownUserProperties.DisplayName) as string;
}
if (string.IsNullOrWhiteSpace(displayName))
{
    displayName = $"{await user.GetPropertyAsync(KnownUserProperties.FirstName)} {await user.GetPropertyAsync(KnownUserProperties.LastName)}";
}

// 表示してみる
var dialog = new MessageDialog(displayName);
await dialog.ShowAsync();

実行すると、ユーザー情報にアクセスしていいかというのを求められるので、それで許可した場合ユーザー情報を取ることが出来ます。

因みに、私のマシンではFindAllAsyncが複数返ってくる条件がわかりませんでした。どういうときに複数返ってくるんだろう…。Server OSで複数ユーザーが同時にログインしてるときなのだろうか。

Win10で同時にサインインしてるだけだと、複数ユーザーは返ってきませんでした。