Uwp C++/WinRT:如何获取当前用户的属性

Uwp C++/WinRT:如何获取当前用户的属性,uwp,c++-winrt,Uwp,C++ Winrt,在线文档和C++/WinRT的“基本事实”之间似乎存在着巨大的脱节。以下是我认为我到目前为止已经了解的情况: #包括 使用名称空间winrt; 使用名称空间winrt::Windows; // ... auto userBuf=System::Profile::SystemIdentification::GetSystemIdForPublisher().Id(); hstring userStr;//=?如何从userBuf获取此信息? 自动用户=系统::用户::GetFromId(userS

在线文档和C++/WinRT的“基本事实”之间似乎存在着巨大的脱节。以下是我认为我到目前为止已经了解的情况:

#包括
使用名称空间winrt;
使用名称空间winrt::Windows;
// ...
auto userBuf=System::Profile::SystemIdentification::GetSystemIdForPublisher().Id();
hstring userStr;//=?如何从userBuf获取此信息?
自动用户=系统::用户::GetFromId(userStr);
hstring firstName=user.GetPropertyAsync(系统::KnownUserProperties::firstName());
hstring lastName=user.GetPropertyAsync(系统::KnownUserProperties::lastName());
是否有更容易/更好的方法获取当前用户的属性? 如何从GetSystemIdForPublisher().Id()返回的缓冲区中获取User::GetFromId(\ux)所需的hs字符串

我发现我可以从userBuf.data()获取uint8_t*,但userBuf.Length()是链接器中未解析的外部符号

还有,我的理解正确吗

System::Profile::SystemIdentification::GetSystemIdForUser(nullptr).Id();
是否将获取当前用户的ID?(假设已授予userSystemId功能)

您可以使用该类并调用FindAllAsync方法来查找当前用户。例如:

Windows::Foundation::IAsyncAction MainPage::ClickHandler(IInspectable const&, RoutedEventArgs const&)
{
    Windows::Foundation::Collections::IVectorView<Windows::System::User> users = co_await Windows::System::User::FindAllAsync(Windows::System::UserType::LocalUser, Windows::System::UserAuthenticationStatus::LocallyAuthenticated);
    Windows::System::User currentUser = users.GetAt(0);
    IInspectable nameObj = co_await currentUser.GetPropertyAsync(Windows::System::KnownUserProperties::FirstName());
    hstring myname = unbox_value<hstring>(nameObj);
}
Windows::Foundation::iSyncAction主页::ClickHandler(IInspectable常量&,RoutedEventArgs常量&)
{
Windows::Foundation::Collections::IVectorView users=co_Wait Windows::System::User::FindalAsync(Windows::System::UserType::LocalUser,Windows::System::UserAuthenticationStatus::LocallyAuthenticated);
Windows::System::User currentUser=users.GetAt(0);
IInspectable nameObj=co_wait currentUser.GetPropertyAsync(Windows::System::KnownUserProperties::FirstName());
hstring myname=unbox_值(nameObj);
}
当您尝试访问当前用户的属性时,需要在清单文件中添加userAccountInformation功能

<uap:Capability Name="userAccountInformation"/>


此外,我们可以通过
hstring myID=currentUser.NonRoamableId()获得不可漫游的id
然后通过此id获取当前用户。NonRoamableId用于检索设置为当前用户的用户对象。有关它的更多详细信息,您可以参考。

使用FindAllUsersAsync时,IVectorView中返回的第一个Windows.System.User实例(即GetAt(0))始终是桌面和商店应用程序上的当前用户。正如您所指出的,它返回散列的“系统ID”(例如:“/baoL6wJRmZp9cT8+jVByhBekwXOv3ONbzQ/6eMqov0=”)。也许有人可以插话,但由于安全性和沙箱要求,我一直无法获得您在登录时键入的可读用户ID字符串,类似于Win32中的GetUserName()。我假设这就是您所寻求的。

如果您无法访问
IBuffer
Length()
属性,您可能无法
#包含
头文件。谢谢。这确实解决了问题。我被间接包含#include“winrt/impl/Windows.Storage.Streams.0.h”这一事实吓坏了,它用Length()和data()函数声明了模板结构consume_Windows_Storage_Streams_IBuffer{}。我的搜寻只把我带到了那里。data()是内联的;长度()不是。这些东西的文档确实不充分。这一切似乎都很神秘,它比这更复杂
Length()
是接口的真实属性,而
data()
是包装类型上特定于C++/WinRT的实用程序实现。我试图在IBuffer
文档中记录这一点,但经过长时间的反复之后,它被掩埋了。如果您想试试运气,WinRT文档页面的右上角和底部都有反馈链接。GetSystemIdForUser不返回用户id。它返回系统id。是的,我理解。我只是有点惊讶,不知怎的,没有办法从中获取用户ID。函数文档暗示存在“当前用户”的概念,但无法获取该用户的用户ID。但这一切现在都是基于这个话题底部的回复而没有意义的。我已经放弃了UWP上下文中“当前用户”的概念。不幸的是,这并不能回答大多数问题:
1
如何从
findalsync()
返回的
IVectorView
中识别“当前用户”
2
非roamableid
代表什么
3
NonRoamableId与从
GetSystemIdForUser
返回的
Id
有什么关系?最后一条评论——旁注:从GetSystemIdForUser(nullptr)返回的Id值与User::GetFromId(Id)所需的Id值没有明显的关系,这对我来说还是很奇怪的。这对我来说是一个真正的干扰,我试图找到一个解决方案来找到当前用户。FindAllAsync()正在工作,但对我来说一点也不明显;最后,我不得不在这里发布一个问题来发现解决方案。这是一个不太可能的情况,但这意味着如果我的应用程序在后台运行,它将得到错误的答案。//我仍然感到惊讶的是,WinRT中没有一个简单可靠的函数来获取拥有进程的用户的身份——至少是他们的登录ID和显示名称。与UWP应用程序模型下的
GetUserNameW(,)
getUsernameXw(,,,)
@相同,每个进程都在自己的用户帐户下运行。该用户帐户与登录用户的用户帐户不同。出于隔离的目的,进程不属于登录用户。@TheodoreHall user.FindalAsync查找正在使用您的应用程序的所有用户。这适用于玩多人游戏的Xbox。在这种情况下,没有一个用户比其他用户更“最新”。在桌面上,当您“切换用户”时