読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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で同時にサインインしてるだけだと、複数ユーザーは返ってきませんでした。