Как вы снимите привилегии для дочернего процесса
Я знаю, как запустить процесс с правами администратора из процесса, используя:
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
где proc - System.Diagnostics.Process. Но как делать наоборот?
Если процесс, в котором вы находитесь, уже повышен, как вы запускаете новый процесс без прав администратора? Более точно, нам нужно запустить новый процесс с тем же уровнем разрешений, что и проводник Windows, поэтому никаких изменений, если UAC отключен, но если UAC включен, но наш процесс работает повышенным, нам необходимо выполнить определенную операцию un-elevated потому что мы создаем виртуальный диск, и если он создан с повышенными разрешениями, а проводник Windows работает без изменений, он не будет отображаться.
Не стесняйтесь менять заголовок на что-то лучшее, я не мог найти хорошего описания.
Ответы
Ответ 1
В результате мы использовали образец из этой статьи Code Project: Высокое повышение может быть плохой для вашего приложения: как начать не-поднятый процесс в конце установки
Кажется, что работает до сих пор, я понимаю, что он вводит в RunDll32.exe, мой С++/Win32 довольно слаб, поэтому я не слишком много смотрю на фактическую реализацию, просто использую. Подтверждено, что он работает в Vista и Win7 как x86, так и x64 (по крайней мере для нас, x86 и x64 требуется другая dll, которая проверяется во время установки, и используется соответствующая).
Ответ 2
Решение для вас - использовать EXPLORER.exe.
Идея состоит в том, чтобы запустить процесс в режиме UN-ELEVATED, используя процесс проводника Windows explorer.exe
(info).
Допустим, что процесс, который мы хотим запустить, находится на $TEMP\MyUnElevatedProcess.exe
.
Итак, для кода NSIS я просто напишу: (но может быть запущен на любом языке)
Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'
Пример кода (с помощью установщика NSIS)
Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"'
*** код, взятый из http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html
Ответ 3
Вы можете использовать ProcessStartInfo.UserName и ProcessStartInfo.Password указать учетную запись, для которой вы хотите, чтобы ваш процесс выполнялся.
class Program
{
static void Main(string[] args)
{
var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe");
var password = new SecureString();
password.AppendChar('s');
password.AppendChar('e');
password.AppendChar('c');
password.AppendChar('r');
password.AppendChar('e');
password.AppendChar('t');
psi.Password = password;
psi.UserName = "username";
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
var p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
Console.WriteLine(p.StandardOutput.ReadToEnd());
}
}