Как запустить программу с разрешениями пользователя вместо активных разрешений - PullRequest
6 голосов
/ 22 сентября 2010

У меня есть приложение C #, которое запускается и отображает значок в трее.У меня есть установщик для моего приложения в трее, который запускает приложение после установки.Программа установки требует прав администратора, а значок на панели задач должен быть запущен с обычными разрешениями.Мой инсталлятор в настоящее время ломает это - когда запускается установленное приложение в трее, оно наследует права администратора от процесса инсталлятора.

Как часть моего инсталлятора, я запускаю приложение C # для выполнения некоторой пользовательской работы.Это небольшое приложение в настоящее время запускает приложение в трее, вызывая:

Process.Start(@"path/to/my/tray/app.exe"); 

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

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

Я использую WiX для создания установщика MSI, поэтому я бы также принял решения, которые работают непосредственно из WiX / MSI.

Ответы [ 3 ]

3 голосов
/ 23 сентября 2010

Есть два подхода. Самое простое - это использовать оболочку exe, которая сначала запускает задачу администратора с повышенными правами (множество способов сделать это; я предпочитаю манифест), а затем другую задачу без повышения прав. Если вы по какой-либо причине отказываетесь сделать это, взгляните на сообщение в блоге и проект CodePlex, на который я ссылаюсь, из своего сообщения в блоге по этому адресу: http://www.gregcons.com/KateBlog/NonElevatedFromElevatedManagedThisTime.aspx

1 голос
/ 28 ноября 2011

В качестве альтернативы, вы можете использовать Windows API CreateProcessAsUser, который, кажется, выполняет эту работу.

0 голосов
/ 22 сентября 2010

Очень хороший вопрос. Ответы, которые я нашел, что якобы работа, все немного грязно; Самым элегантным в целом является обертка EXE.

Взгляните на эту статью: http://www.codeproject.com/KB/vista-security/RunNonElevated.aspx. В ней описывается метод, с помощью которого вы можете получить встроенную привязку к одному из окон оболочки, которая работает без прав, и попросить оболочку запустить ваш код для вы. Нативные хуки в C # требуют очень высоких разрешений CAS; чтобы получить эти разрешения, ваш установщик должен иметь строгое имя и подпись, а код должен требовать или утверждать SecurityPermission с SecurityPermissionFlag.UnmanagedCode.

Класс ProcessStartInfo .NET Framework также содержит логическое свойство UseShellExecute, которое, если оно установлено, сообщает Process.Start (), чтобы он вызывал оболочку, а не запускал процесс непосредственно из текущего домена приложения. Я не знаю, если это будет делать то, что вам нужно, но это определенно гораздо проще попробовать; вы просто используете перегрузку ProcessStartInfo Process.Start (), с объявленным ProcessStartInfo с установленным флагом.

Помните, что вы не можете сказать оболочке запустить EXE как пользователь, отличный от текущего пользователя, вошедшего в систему (имя пользователя и пароль не должны быть установлены в ProcessStartInfo). Вы также должны указать путь к EXE-файлу, используя свойство WorkingDirectory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...