1

我为 postgresql 9.1 编写了一个 NSIS 安装程序脚本。安装程序正常工作,但重新启动后,服务未启动(安装后,数据库正常启动)

我猜这是因为 postgres 服务用户的 %APPDATA% 中没有 pgpass.conf 文件。据我了解我的安装脚本,pgpass.conf 文件被添加到运行安装程序的用户的 %APPDATA% (在我的例子中是管理员帐户)。这无济于事。

我尝试了以下方法,将 pgpass.conf 添加到所有用户,bt 我想这会将它添加到一种通配符,而不是每个用户的 %APPDATA% :

SetShellVarContext "all"
SetOutPath "$APPDATA\postgresql"
File config\pgpass.conf
SetShellVarContext "current"
SetOutPath "$APPDATA\postgresql"
File config\pgpass.conf

我在文档中找不到 c:/Users/postgres 的宏名称。这可能是实现它的一种方式。但是对于 WindowsXP,7,我希望我需要一种可移植的方式来处理 /Users 目录。

我希望我可以使用 SetShellVarContext "postgres" 之类的东西,然后让 NSIS 在 c:\Users\postgres\AppData\postgresql 中写入 pgpass.conf 文件。

有没有办法做到这一点 ?

谢谢 !

4

3 回答 3

1

没有记录的方法可以在没有令牌句柄的情况下为另一个用户获取 shell 文件夹(并且要获取令牌句柄,您需要用户密码,或者如果用户已登录,如果您以 SYSTEM 身份运行,则可以获取他们的令牌)

然后我们搬到无证领土;您可以尝试此宏或以GetProfilesDirectory作为根目录自己构建路径。

于 2012-06-08T16:37:03.120 回答
1

SetShellVarContext ALL将为您提供%programdata%位置(在 Win7 中),这是与位置不同的%appdata%位置(也从$APPDATANSIS 中获得。(符号链接使它们看起来是相同的......但它们是完全不同的目录!!!)

NSIS 将根据all 与 current 切换将上下文从 更改%APPDATA%为。但仍然使用var。 %PROGRAMDATA%SetShellVarContext$APPDATA

所以简而言之,我猜测您的文件将位于错误的位置。我相信您只想以管理员身份安装,但让 postgres 的本地用户拥有一个附加文件pgpass.conf

根据它的Win7或WinXP设置一个变量,因为您要写入的路径都不同。

要进行测试,只需将文件写入您知道 postgres 用户所在的位置!

StrCpy $WINVER_VAR "C:\Users\postgresql\AppData\Roaming" ;;or whatever based on OS
SetOutPath "$WINVER_VAR\postgresql"

或者更好的是使用

File /oname=$WINVER_VAR\postgresql\pgpass.conf pgpass.conf

只需从安装程序复制到您想要的位置,并且在管理员目录中没有其他未使用的副本。

注意:在 XP 中%APPDATA%是在文档和设置中...我不记得确切的路径。所以你必须验证!

要添加到系统上的每个用户...查看“定位插件”或获取系统上所有用户的列表,然后执行相同操作。

于 2012-06-15T23:38:25.720 回答
0

SID(安全标识符)是用于标识 Windows NT 的用户帐户、组、域或计算机的安全标识符。系统使用帐户 SID 而不是他们的个人资料用户名进行操作。SID 在创建时分配给每个帐户,因此如果您要使用相同的名称和密码再次创建帐户,SID 当然会有所不同。重新创建帐户将导致生成新的 SID。它们是独一无二的,如果你拿起我放下的东西..

宏:

;=#
;= ${GETUSERSID} $0 "Username"
;       $0          = The returning SID value
;       "Username"  = The username of the account you wish the SID
;                   If the username is an empty value, then the SID of the
;                   current user will be given to $0.
!define GETUSERSID "!insertmacro _GETUSERSID"
!macro _GETUSERSID _RESULT _USER
      System::Store S
      StrCpy $0 ${_USER}
      StrCmp $0 "" 0 +2
      ExpandEnvStrings $0 "%USERNAME%"
      System::Call "*(&t1024)i.r1"
      System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
      IntCmp $0 1 0 +2 +2
      System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
      IntCmp $0 1 +2 0 0
      Push error
      System::Free $1
      System::Store L
      Pop "${_RESULT}"
!macroend

${GETUSERSID} $0 "Username"
MessageBox MB_ICONINFORMATION|MB_OK "User's SID:$\r$\n$$0 is holding $0" IDOK

下面是一个列出主机 PC 上所有注册用户帐户的示例:

System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
${If} $R4 = 0
    ${For} $R4 1 $R0
        System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
        IntFmt "$R2" ${STR} $R2
        IntFmt "$R3" ${STR} $R3
        ${GetUserSID} "$R2" "$R5"
        IntOp $R1 $R1 + 24
        DetailPrint "-----------------"
        DetailPrint "Name: $R2"
        DetailPrint "SID: $R5"
        DetailPrint "$R3"
    ${Next}
    System::Call "netapi32::NetApiBufferFree(iR1)"
${EndIf}

现在我不确定这是否可行(可能是前提,但总是有 ACL),但这里有一个例子(如果我正确理解你的问题)来暗示你在问什么。

${GETUSERSID} $0 "postgres"
ReadRegStr $1 HKU "$0\Volatile Environment" "APPDATA"
DetailPrint "APPDATA: $1"
AccessControl::GrantOnFile $1 "USER" "ListDirectory + GenericRead + GenericExecute" 
AccessControl::EnableFileInheritance $1
SetOutPath "$1\postgresql"
File config\pgpass.conf

这只是一个快速修复..甚至不确定这是否会奏效,但也许是您朝着正确方向迈出的一步?希望这可以帮助!

于 2017-06-06T05:23:09.547 回答