【问题标题】:Get CSIDL_LOCAL_APPDATA path for any user on Windows获取 Windows 上任何用户的 CSIDL_LOCAL_APPDATA 路径
【发布时间】:2008-09-25 06:28:11
【问题描述】:

是否有任何 Win32/MFC API 可以为我想要的 any 用户(不仅是当前登录的用户)获取CSIDL_LOCAL_APPDATA?假设我有一个“域\用户”形式的用户列表,我想获取他们的路径列表 - 这可能吗?

【问题讨论】:

    标签: winapi visual-c++ mfc shell32


    【解决方案1】:

    您可以获取用户的 SID,然后在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList 下查找并获取 ProfileImagePath 值。

    获得此路径后,您可以为您的用户获取 CLSID_LOCAL_APPDATA,将绝对路径转换为您的配置文件的相对路径,然后将该相对路径附加到其他用户配置文件路径。

    但是,请记住,这依赖于未记录的注册表项,并且可能会在操作系统的未来版本中中断。 (或者,正如 Raymond Chan 所说:“既然你知道该怎么做,让我告诉你为什么不应该这样做……”:-))

    如果您有代表用户的令牌,您可以使用 SHGetFolderPath 或 SHGetKnownFolderPath(在 Vista 及更高版本上)。但是,存在一定的安全限制,您应该在 MSDN 上阅读以了解详细信息。

    SHGetFolderPath - http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx SHGetKnownFolderPath - http://msdn.microsoft.com/en-us/library/bb762188(VS.85).aspx

    【讨论】:

    • 如果有其他方法,我很乐意使用它:)
    • SHGetFolderPath() 应该可以解决问题 - 这个应用程序将以管理员身份运行,所以应该没问题。谢谢。
    • 不,出于安全原因,您不应该访问其他用户的文件夹(包括他们的路径),除非您具有模拟权限和有效的用户令牌(即您已被用户授予以某种方式执行的权限代表他们的东西)
    • 我想这在当前用户移动其 LOCAL_APPDATA 文件夹或您感兴趣的用户移动其 LOCAL_APPDATA 文件夹之前有效。一个有趣的测试案例是从 XP 升级到 Vista 的 PC,包括升级前和升级后的用户。
    • 是的,如果用户移动她的本地应用数据,它将失败。它会在 99% 的情况下工作,并且会为你老板的老板悲惨地失败 :-))。这就是为什么我提到这不是正确的做法。带有模拟的 SHGetFolderPath 是正确的方法,但您需要一个有效的用户令牌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2010-11-22
    • 2020-12-14
    相关资源
    最近更新 更多