2012-06-08 4 views
1

Я написал сценарий установки NSIS для postgresql 9.1. Установщик работает правильно, но после перезагрузки служба не запускается (сразу после установки, база данных запускалась должным образом)Как заставить NSIS создать файл в% APPDATA% другого пользователя?

Я думаю, это связано с тем, что пользователь службы postgres не имеет файла pgpass.conf в своем% APPDATA %. Насколько я понимаю, мой установочный скрипт, файл 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 написать файл pgpass.conf в c: \ Users \ postgres \ AppData \ postgresql.

Есть ли способ сделать это?

Thnk you!

+0

'pgpass.conf' - это клиентская вещь, этот файл не нужен для запуска службы. Посмотрите журнал событий Windows и/или файлы журнала postgres для сообщений об ошибках. –

ответ

1

Нет документального способа получить папку оболочки для другого пользователя без дескриптора маркера (а для получения дескриптора маркера вам нужен пароль пользователя или если пользователь зарегистрирован, вы можете получить свой токен, если вы используете как СИСТЕМА)

Затем мы переезжаем на территорию без документов; Вы можете попробовать this macro или построить путь самостоятельно с помощью GetProfilesDirectory в качестве корня.

1

SetShellVarContext ALL даст вам %programdata% места (в Win7) это другое место, чем %appdata% места (которое также получило от $APPDATA в NSIS. (Sym ссылка заставляет их казаться, что они такие же .. но они совершенно разный Dir-х !!!)

NSIS изменит контекст от %APPDATA% к %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% находится в документах & Настройки ... Я не помню точный путь. так что вам придется проверять!

Чтобы добавить к каждому пользователю в системе ... Зайдите в «Локализовать плагин» или получите список ВСЕХ пользователей в системе и выполните то же самое.

+0

На моем компьютере XP Документы и настройки на самом деле называются c: \ users \, это должно сказать вам, что пути жесткой кодировки - это плохая идея ... (Также помните, что pre Vista обычно локализовала имена некоторых системных папок) – Anders

0

SID (идентификатор безопасности) - это идентификатор безопасности, который идентифицирует учетную запись пользователя, группы, домен или компьютер для Windows NT. Система работает с идентификаторами SID учетной записи, а не с именами пользователей своего профиля. SID присваивается каждой учетной записи на момент ее создания, поэтому, если вы должны снова создать учетную запись с тем же именем и паролем, SID будет, конечно, отличаться. Повторное создание учетной записи приведет к генерации нового SID. Они уникальны, если вы подбирая то, что я устанавливающей ..

MACRO:

;=# 
;= ${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 

Теперь вот пример перечисления всех зарегистрированных учетных записей пользователей на хост-компьютере:

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 

Это было просто быстрое решение. Не уверен, что это сработает, но, возможно, шаг в правильном направлении для вас? Надеюсь это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^