如何在PC上获取SHGetKnownFolderPath的每个用户令牌?

时间:2018-12-04 18:24:51

标签: winapi

我正在使用具有SYSTEM特权(清理实用程序)的System Service项目...它不与任何用户界面交互。

我的目标是检查PC上存在的任何用户在“桌面”和“ AppData”文件夹中的文件。

我正在使用NetUserEnum()在PC上获取用户列表。然后,我想使用SHGetKnownFolderPath()获取每个用户的Desktop和AppData的路径,但是我找不到一种方法来获取SHGetKnownFolderPath()的每个用户的访问令牌。没有在SHGetKnownFolderPath()中定义的令牌,它将返回SYSTEM而不是特定用户的路径。

Q1。如何获得SHGetKnownFolderPath()的每个用户的令牌?

Q2。如果第一季度没有答案,是否有任何书面记录方式来获取PC中每个用户的桌面和应用程序数据路径?

我知道这可以用肮脏的方式实现--->注册表项需要一些字符串替换。但是,注册表项方法未公开,很容易在以后的Windows更新中中断。


编辑更新: @RaymondChen感谢您指出某些用户个人资料可能不存在。另外,

关于Q1 :@Remy Lebeau提供了LogonUser/Ex()的解决方案,使用其凭据登录每个用户,可能是唯一适合Q1需求的答案。

关于第二季度:可能没有 文档化方式 来实现。正如@Remy Lebeau和@Olaf Hess所说,唯一的方法可能必须坚持Windows注册表(Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)。我试图在Microsoft社区论坛上挖掘更多信息,但由于安全原因,Microsoft禁止使用其本机API访问其他用户的个人资料。他们没有提供可能违反安全规则的API。每个用户个人资料只能通过其凭据进行访问。

顺便说一句,我完全理解“清理实用程序”或“ Windows破坏性工具”,尤其是当该工具的编写不当时(例如兼容性问题)。为了避免使其成为一个完全Windows销毁的应用程序,我尝试使用更多文档化的API。

1 个答案:

答案 0 :(得分:1)

对于带有SP1 / Server 2008和更高版本的Windows Vista,您可以使用WMI类Win32_UserProfile查询现有的用户配置文件。这使您可以检索配置文件路径,并检查它是本地配置文件还是漫游配置文件,并获取状态信息。其余的(检索APPDATA,DESKTOP等的路径)可能会涉及直接从注册表中读取值(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell FoldersHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)。