【问题标题】:Get NSIS Variable for %ALLUSERSPROFILE%获取 %ALLUSERSPROFILE% 的 NSIS 变量
【发布时间】:2023-03-08 03:53:01
【问题描述】:

%ALLUSERSPROFILE% 是否有 NSIS 变量?

如果不知道如何使用 NSIS 代码获取此环境变量?

注意:如果我使用ReadEnvStr $R7 "ALLUSERSPROFILE"$R7 包含C:/ProgramData,因为安装程序已请求提升权限 (RequestExecutionLevel admin)。这太令人沮丧了!

【问题讨论】:

  • 你希望得到什么文件夹?
  • 这与 UAC/elevations 无关,因为您询问的是所有用户共享的文件夹...

标签: windows installation nsis


【解决方案1】:

从 Vista %ALLUSERSPROFILE% 开始是 %SystemDrive%\ProgramData。以前在 All Users 下的一些内容已移至 %Public%,其余的则在 %ProgramData% 中。

有几种方法可以获得这个目录,但它们都应该给你相同的答案:

ReadEnvStr $0 "ALLUSERSPROFILE"
DetailPrint %ALLUSERSPROFILE%=$0


System::Call 'userenv::GetAllUsersProfileDirectory(t.r0,*i${NSIS_MAX_STRLEN})i.r1'
DetailPrint GetAllUsersProfileDirectory=$0


; In Vista+ %ALLUSERSPROFIL% and CSIDL_COMMON_APPDATA is the same directory:
SetShellVarContext all
DetailPrint All:Appdata=$AppData


!define FOLDERID_ProgramData {62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}
System::Call 'shell32::SHGetKnownFolderIDList(g"${FOLDERID_ProgramData}", i0x1000, i0, *i.r1)i.r0'
${If} $0 == 0
    System::Call 'shell32::SHGetPathFromIDList(ir1,t.r0)'
    System::Call 'ole32::CoTaskMemFree(ir1)'
    DetailPrint SHGetKnownFolderIDList=$0
${EndIf}

【讨论】:

    【解决方案2】:

    要扩展@Anders 回复,您还可以使用SHGetSpecialFolderPath 并进行简单的单行调用以接收操作系统上文件夹的路径。


    System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'
    

    将它与 CSIDL 值一起使用,您可以简单地调用一个函数并弹出返回值。

    Function ".OnInit"
      System::Call 'shell32::SHGetSpecialFolderPath(i $HWNDPARENT, t .r1, i 0x23, i0)i.r0'
      pop $1
      MessageBox MB_OK|MB_ICONINFORMATION "$1"
    FunctionEnd
    
    Section ""
      ; blank section (so the script runs)
    SectionEnd
    

    这会将 C:\ProgramData (Vista+)C:\Documents and Settings\All Users\Application Data (XP) 返回到 $1 strong> 并显示一个显示路径的消息框。

    通过切换 CSIDL 值 (0x23),您可以将路径返回到一堆不同的系统文件夹。


    以下是一些可用于返回路径的常见 CSIDL 值:

    • 0x0 桌面
    • 0x2 程序
    • 0x5 我的文档
    • 0x6 收藏夹
    • 0x7 启动
    • 0x8 最近的文档
    • 0x9 发送到文档
    • 0x10 桌面目录
    • 0x11 我的电脑
    • 0x14 字体目录
    • 0x15 Windows 模板
    • 0x20 互联网缓存
    • 0x21 Cookie
    • 0x22 历史记录
    • 0x23 通用应用程序数据
    • 0x25 系统
    • 0x26 程序文件
    • 0x27 我的图片
    • 0xb 开始菜单
    • 0xd 我的音乐
    • 0x1a 应用程序数据
    • 0x1c 本地应用程序数据
    • 0x2b 常用程序文件

    【讨论】:

    • 原生 NSIS 常量在后台使用 SHGetSpecialFolderPath。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多