我需要从服务应用程序枚举本地Windows系统上所有用户的桌面文件夹path。 问题是有些用户可能当时没有login。 那么是否有任何API或其他方法来做到这一点?
编辑1:对于那些没有阅读第一段让我重复 – 我没有一个令牌的用户帐户,用户可能不会login。
编辑2:我需要这个从用户桌面上删除一个快捷方式之前,我的应用程序支持的function被closures,或者应用程序被卸载。
这是迄今为止我能够提出的最好的方法。 所以,如果有人用Windows的非英语安装可以检查这个我会感激?
(为了简洁,我只是发布一个伪代码。)
1 – 以下所有步骤都是从本地服务应用程序完成的。
2 – 要获取所有用户配置文件的路径,请枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
项中的子文件夹,并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中获取的路径以生成该用户的桌面文件夹的完整路径。
从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适当的方式来枚举本地用户。
其次,这取决于你的服务的目的,但也许通过使用“allusers”配置文件,而不是每个单独的你不需要知道当前的用户列表。