Как делают Вас de-elevate полномочия для дочернего процесса

То, о чем вы спрашиваете, подробно освещено Эриком Липпертом в его посте в блоге Закрытие переменной цикла, считающейся вредной , и ее продолжение.

Для меня наиболее убедительным аргументом является то, что наличие новой переменной в каждой итерации было бы несовместимо с циклом стиля for(;;). Ожидаете ли вы иметь новый int i в каждой итерации for (int i = 0; i < 10; i++)?

Наиболее распространенная проблема с этим поведением - сделать замыкание по переменной итерации, и он имеет простой обходной путь:

foreach (var s in strings)
{
    var s_for_closure = s;
    query = query.Where(i => i.Prop == s_for_closure); // access to modified closure

Сообщение в моем блоге об этой проблеме: Закрытие по переменной foreach в C # .

30
задан abatishchev 29 August 2010 в 19:20
поделиться

2 ответа

В итоге мы использовали образец из этой статьи проекта кода: Высокий уровень прав может быть плохим для вашего приложения: как запустить процесс без повышенных прав в конце установки

Похоже, что до сих пор это работает , Я так понимаю, что он внедряется в RunDll32.exe, мой C ++ / Win32 довольно слаб, поэтому я не особо разбирался в реальной реализации, просто его использую. Подтверждено, что он работает в Vista и Win7 как на x86, так и на x64 (по крайней мере, для нас x86 и x64 требуют разных dll, которые проверяются во время установки и используются правильные).

8
ответ дан 28 November 2019 в 00:24
поделиться

Вы можете использовать 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());
    }
}
-1
ответ дан 28 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: