Получить текущее имя пользователя при запуске с UAC - PullRequest
1 голос
/ 13 июля 2011

Наша установка имеет встроенный манифест, который запускает UAC перед запуском приложения.(Приложения запускаются от имени администратора).Однако если для установки требуется установить .NET Framework, мы должны продолжить установку после перезагрузки.По этой причине мы должны создать раздел реестра в RunOnce текущего пользователя.

К сожалению, HKEY_CURRENT_USER указывает на реестр администратора.Нам нужно выяснить пользователя, который в данный момент вошел в систему и начал установку.(Обычный пользователь щелкнул файл setup.exe, администратор ввел свои данные в приглашении UAC. Нам нужно выяснить, кто был ПОЛЬЗОВАТЕЛЕМ)

Я испробовал все обычные методы (Environment.UserName, WindowsIdentity..GetCurrent ())

Спасибо!

Ответы [ 4 ]

1 голос
/ 13 июля 2011

Вы можете использовать функцию LsaEnumerateLogonSessions , чтобы получить то, что вам нужно. Однако это вызов функции Winapi C. Если вам нужна управляемая версия, я верю, что вы можете посмотреть исходный код для Cassia , которая использует эту функцию в своем API служб терминалов. Звонок должен быть таким же. Вы также можете посмотреть здесь .

Также вы можете использовать функцию NetWkstaUserEnum WINAPI. Вы можете найти для него управляемую оболочку здесь

С библиотекой Cassia этот код работает нормально:

ITerminalServicesManager manager = new TerminalServicesManager();
ITerminalServicesSession session = manager.CurrentSession;

string userInfo = session.DomainName + "\\" + session.UserName;
NTAccount account = session.UserAccount;
0 голосов
/ 13 июля 2011

Возвращает имя зарегистрированного пользователя Windows, удаляя домен:

using System.Security.Principal;  // here is the security namespace you need

...

string userName = WindowsIdentity.GetCurrent().Name.Replace("\\", "|");
string[] split = userName.Split(new Char[] { '|' });
lblDebug.Text = (split.Count() > 1) ? split[1] : userName;
0 голосов
/ 13 июля 2011

Невозможно получить первоначального пользователя, если ваше приложение запущено от имени администратора:

Если пользователь запускает программу установки, щелкнув правой кнопкой мыши его EXE-файл и выбрав «Запуск от имени администратора», то этого флага, к сожалению, не будет эффект, потому что программа установки не имеет возможности запускать какой-либо код с оригинальные учетные данные пользователя. То же самое верно, если программа установки запущена из уже возвышенный процесс. Обратите внимание, однако, что это не Inno Специфичное для установки ограничение; Установщики на основе установщика Windows не могут в таких случаях вернитесь к исходным учетным данным пользователя.

Источник: Справка InnoSetup

Как сказал Мэтью в комментариях, вы не должны запускать ваше приложение от имени администратора, а только запускать UAC, когда это необходимо в вашем коде.

0 голосов
/ 13 июля 2011

Запустите исходный файл setup.exe в виде небольшого исполняемого файла, который отображает заставку, вызывая реальную программу установки как дочерний процесс. Небольшой EXE-файл не запускается от имени администратора и может передать зарегистрированное имя пользователя дочернему процессу. Дочерний процесс вызывает UAC и запускается в контексте администратора, но уже имеет зарегистрированное имя пользователя в качестве параметра командной строки.

...