我需要从服务应用程序枚举本地 Windows 系统上所有用户的桌面文件夹路径。问题是某些用户当时可能没有登录。那么是否有任何 API 或其他方法可以做到这一点?
EDIT1:对于那些没有阅读第一段的人,让我重复一遍——我没有用户帐户的令牌,用户当时可能没有登录。
EDIT2:在我的应用程序支持的功能被关闭或应用程序被卸载之前,我需要从用户桌面删除快捷方式。
我需要从服务应用程序枚举本地 Windows 系统上所有用户的桌面文件夹路径。问题是某些用户当时可能没有登录。那么是否有任何 API 或其他方法可以做到这一点?
EDIT1:对于那些没有阅读第一段的人,让我重复一遍——我没有用户帐户的令牌,用户当时可能没有登录。
EDIT2:在我的应用程序支持的功能被关闭或应用程序被卸载之前,我需要从用户桌面删除快捷方式。
这是迄今为止我能想到的最好的方法。所以如果有人安装了非英语的 Windows 可以帮我检查一下,我会很感激?
(为简洁起见,我只发布了一个伪代码。)
1 - 以下所有步骤均通过本地服务应用程序完成。
2 - 要获取所有用户配置文件的路径,请枚举键中的子文件夹并从中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
读取值。ProfileImagePath
它将为每个用户帐户提供配置文件路径。
3 - 要获取桌面的文件夹名称,请从服务应用程序Desktop
的键中读取值(是的,我知道 HKCU 听起来很奇怪,但它对我有用。)然后使用环境变量获取环境变量的路径API。所以你会得到两条路径,如下所示:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
%USERPROFILE%
C:\Windows\system32\config\systemprofile\Desktop
和
C:\Windows\system32\config\systemprofile
然后简单地将第二个字符串与第一个字符串隔离开,使用不区分大小写的比较,您将获得桌面的文件夹名称(即在这种情况下为“\Desktop”。)
4 - 将桌面文件夹添加到步骤 2 中获得的路径,以生成该用户桌面文件夹的完整路径。
来自 userenv.h:GetProfilesDirectory (win2k+, iirc)
msdn.microsoft.com/en-us/library/windows/desktop/bb762278(v=vs.85).aspx
使用它来查找包含所有本地用户帐户配置文件目录的目录。
要查找桌面文件夹:
Shlobj.h : SHGetKnownFolderPath (vista+)
msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx
您需要 FOLDERID_Desktop 作为已知文件夹 ID。此符号在 Knownfolders.h 中声明
msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
使用这些,您可能会更接近您想要的,而无需直接读取注册表。当然,除了从 GetProfilesDirectory 中的文件夹列表推断之外,这掩盖了枚举用户的任何优雅方式。也许有一种更适合 api 的方式来枚举本地用户。
其次,这取决于您的服务目的,但也许通过使用“所有用户”配置文件,而不是单独使用每个用户,您不需要知道当前的本地用户列表。