Получение в настоящее время вошедшего в систему пользователя при запуске от имени администратора - PullRequest
3 голосов
/ 13 января 2009

Я написал установщик, использующий NSIS, и он мне нужен для установки некоторых файлов (DLL-файлов и т. Д.) В стандартном месте, например C: / Program Files / App Name /. Мне также нужно установить файлы в каталоге данных приложения текущего пользователя. Проблема в том, что когда пользователь не является администратором в Vista, мне нужно повысить привилегии, и при этом переменные среды меняются, так что текущий пользователь теперь выглядит как пользователь-администратор, и я заканчиваю установку в каталог пользователя-администратора вместо фактический пользователь. Вы должны поднять, когда вы запускаете установщик, поэтому я не могу получить имя пользователя, а затем поднять. Есть ли какой-нибудь разумный способ выяснить, кто является настоящим пользователем, когда я запускаю установщик в качестве администратора?

Edit: К сожалению, копирование данных при первом запуске не вариант. Приложение не будет работать без того, что я пишу в каталог пользователя, потому что это шаблон MS Word. Мои материалы не запустились бы без шаблона, поэтому я ДОЛЖЕН написать шаблон при установке, а Word требует, чтобы шаблон находился в директории пользователя AppData.

Ответы [ 3 ]

3 голосов
/ 07 мая 2009

Все мои установщики NSIS используют этот плагин UAC: http://nsis.sourceforge.net/UAC_plug-in.

Вы можете перейти в администратор, как только запустите программу установки. Это порождает второй экземпляр вашего установщика, который выполняет всю работу. Но вы можете выполнять вызовы сегментов кода, которые будут выполняться в исходном процессе, как пользователь, запустивший установщик.

Таким образом, у вас может быть такой раздел для установки:

Section "Install My Program" SecMain
    ...    
    # Install files to common folders
    ...
    !insertmacro UAC.CallFunctionAsUser CopyUserWordTemplate
    ...
SectionEnd

Function CopyUserWordTemplate
    SetOutPath $LOCALAPPDATA
    File "MyWordTemplate.dot"
FunctionEnd
2 голосов
/ 14 января 2009

Что если другой пользователь попытается запустить приложение? Тогда файлы не будут доступны - это проблема, с которой я боролся в течение многих месяцев ...

Лучшим решением, которое я нашел, было использование малоизвестной (и полностью недокументированной) функции Windows под названием Active Setup . См. http://www.etlengineering.com/installer/activesetup.txt для хорошего описания того, как это работает.

Это та же функция, которую IE использует для установки пользовательских настроек, чтобы суммировать вышеуказанную ссылку, в основном вы создаете раздел реестра, который Windows проверяет каждый раз, когда пользователь входит в систему. Если значение в ключе HKCU меньше найденный в HKLM, он запускает ваш определенный скрипт / программу / что угодно. Вы устанавливаете файлы для каждого пользователя в папку программных файлов, а затем используете функцию Active Setup, чтобы скопировать их в профиль пользователя при следующем входе в систему. Если вам нужно убедиться, что они есть там после завершения установки, запланируйте перезагрузку после завершения установки.

PS. если вы используете MSI вместо NSIS, вам не нужно повышать уровень при запуске программы установки, а Vista должна запускать повышение прав в начале последовательности «Выполнение» (если программа установки спроектирована правильно - мало кто из них), однако, поскольку вы используете NSIS тогда я предполагаю, что вам нужно будет запускать повышение прав при запуске программы установки.

РЕДАКТИРОВАТЬ: Ха-ха, моя точная проблема была также с шаблонами MS Word! Решение, которое я нашел для шаблонов Word, - это прочитать каталог установки из HKLM\SOFTWARE\Microsft\Windows\CurrentVersion\App Paths\Winword.exe и установить в папку STARTUP под путем, указанным в этом разделе реестра. Пользователю будет предложено разрешить выполнение макросов при первом запуске, даже если он имеет цифровую подпись, но он будет доступен для всех пользователей. Убедитесь, что шаблон также доступен только для чтения, чтобы избежать ошибок разрешений в дальнейшем.

1 голос
/ 14 января 2009

Посмотрите на документ Windows 7 Logo Program . В нем говорится:

Обратите внимание, что при установке на компьютере пользовательские данные должны записываться при первом запуске, а не во время установки, поскольку нет правильного местоположения пользователя для хранения даты во время установки.

Если ваша заявка только для одного пользователя. Затем вы должны установить в папку Local settings (я думаю, что несколько другое имя в Vista и Windows 7).

...