Как вы снимите привилегии для дочернего процесса

Я знаю, как запустить процесс с правами администратора из процесса, используя:

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());
    }
}