如何从服务获取用户桌面的路径?

时间:2012-12-14 22:16:52

标签: c++ windows winapi windows-services desktop

我需要从服务应用程序枚举本地Windows系统上所有用户的桌面文件夹路径。问题是某些用户当时可能没有登录。那么有没有API或其他方法呢?

EDIT1:对于那些没有阅读第一段的人,让我重复一遍 - 我没有令牌到用户帐户,用户可能不是当时登录。

EDIT2 :我需要这样才能在关闭应用程序支持的功能或卸载应用程序之前从用户桌面删除快捷方式。

2 个答案:

答案 0 :(得分:0)

这是迄今为止我能够提出的最佳方法。所以如果有非Windows安装的人可以为我查看这个,我会很感激吗?

(为了简洁,我只发布了一个伪代码。)

1 - 以下所有步骤均来自本地服务应用程序。

2 - 要获取所有用户配置文件的路径,请在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList项中枚举子文件夹,并从中读取ProfileImagePath值。它将为每个用户帐户提供配置文件路径。

3 - 要获取桌面的文件夹名称,请阅读服务应用程序中Desktop键的HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders值(是的,我知道HKCU听起来很奇怪,但它对我有用。)之后,使用environment variable APIs获取%USERPROFILE%环境变量的路径。所以你会得到两条路,就像这样:

C:\Windows\system32\config\systemprofile\Desktop

C:\Windows\system32\config\systemprofile

然后简单地将第二个字符串与第一个字符串隔离,使用不区分大小写的比较,然后您将获得桌面的文件夹名称(在这种情况下为“\ Desktop”)。

4 - 将桌面文件夹添加到步骤2中获取的路径,以生成该用户桌面文件夹的完整路径。

答案 1 :(得分:0)

来自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'配置文件,而不是每个人,您不需要知道当前用户的当前列表。