Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何让NSIS在另一个用户的%APPDATA%中创建文件?_Postgresql_Nsis_Appdata - Fatal编程技术网

Postgresql 如何让NSIS在另一个用户的%APPDATA%中创建文件?

Postgresql 如何让NSIS在另一个用户的%APPDATA%中创建文件?,postgresql,nsis,appdata,Postgresql,Nsis,Appdata,我为postgresql 9.1编写了一个NSIS安装程序脚本。安装程序工作正常,但在重新启动后,服务未启动(安装后,数据库已正确启动) 我猜这是因为postgres服务用户的%APPDATA%中没有pgpass.conf文件。就我所了解的安装脚本而言,pgpass.conf文件被添加到运行安装程序的用户的%APPDATA%中(在我的例子中是管理员帐户)。这没有帮助 我尝试了以下方法,将pgpass.conf添加到所有用户,我想这会将其添加到一种通配符中,而不是每个用户的%APPDATA%: S

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

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

我尝试了以下方法,将pgpass.conf添加到所有用户,我想这会将其添加到一种通配符中,而不是每个用户的%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文件

有办法做到这一点吗


谢谢

没有记录在案的方法可以为另一个没有令牌句柄的用户获取shell文件夹(要获取令牌句柄,您需要用户密码,或者如果用户已登录,如果您作为系统运行,您可以获取他们的令牌)


然后我们转移到无证件的地区;您可以尝试或构建自己作为根的路径。

SetHellVarContext ALL将为您提供
%programdata%
位置(在Win7中)这是一个不同于
%appdata%
位置(也从NSIS中的
$appdata
获取)。 (Sym-link使它们看起来像是一样的..但它们是完全不同的Dir!!!)

NSIS将上下文从
%APPDATA%
更改为
%PROGRAMDATA%
,具体取决于
SetShellVarContext
all vs current开关。但仍使用
$APPDATA
var

简而言之,我猜你的文件放错地方了。 我相信你只是想以管理员的身份安装,但是让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%
位于文档和设置中…我不记得确切的路径。因此您必须验证

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

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

这只是一个快速解决方案。甚至不确定这是否有效,但可能是朝着正确方向迈出的一步?希望这有帮助!

pgpass.conf
是客户端的东西,启动服务不需要该文件。请查看windows事件日志和/或postgres日志文件以获取错误消息。在我的XP机器上,文档和设置tings实际上被称为c:\users\,这应该告诉您硬编码路径是一个坏主意…(还要记住,在Vista之前,一些系统文件夹的名称通常是本地化的)