Получение текущего пользователя, вошедшего в систему при работе от имени администратора

StackOverflow https://stackoverflow.com/questions/439932

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Все мои установщики 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

Другие советы

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

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

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

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

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

Посмотрите на Программа логотипа Windows 7 документ.Говорится:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top