编辑1:对于那些没有阅读第一段的人,请允许我重申——我没有用户账户的令牌,用户可能在此时未登录。
编辑2:我需要在支持我的应用程序的功能被关闭或卸载应用程序之前,从用户桌面中删除快捷方式。
这是我目前能想到的最佳方法。所以我希望有人能用非英语安装的Windows检查一下这个方法是否可行?
(为了简洁起见,我只发布伪代码。)
1 - 所有以下步骤都是从本地服务应用程序中完成的。
2 - 要获取所有用户配置文件的路径,请枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
键中的子文件夹,并从中读取ProfileImagePath
值。它将为每个用户帐户提供配置文件路径。
3 - 要获取桌面文件夹的名称,请从服务应用程序中读取HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
键中的Desktop
值(是的,我知道HKCU听起来很奇怪,但对我有效)。之后,使用环境变量API获取%USERPROFILE%
环境变量的路径。因此,您将获得两个路径,类似于:
C:\Windows\system32\config\systemprofile\Desktop
并且
C:\Windows\system32\config\systemprofile
然后,只需使用不区分大小写的比较方法从第一个字符串中隔离出第二个字符串,您将获得桌面文件夹的名称(在本例中为"\Desktop")。
4- 将步骤2中获取的路径添加到桌面文件夹中,以生成该用户桌面文件夹的完整路径。
User Shell Folders
键的Desktop
,所以如果我们按照陈先生的逻辑来看,它应该至少在Windows安装后被打开过一次,对吧? - ahmd0HKEY_USERS\S-1-5-18\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
键中 Desktop
值是否包含除 "%USERPROFILE%\Desktop"
以外的内容或者不存在? - ahmd0从 userenv.h 中:GetProfilesDirectory(win2k+,如果我没记错)
msdn.microsoft.com/en-us/library/windows/desktop/bb762278(v=vs.85).aspx
使用此方法查找包含所有本地用户帐户配置文件目录的目录。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的方式来枚举本地用户。
其次,这取决于您服务的目的,但也许通过使用“allusers”配置文件而不是每个配置文件,您就不需要知道当前本地用户的列表。