То, о чем вы спрашиваете, подробно освещено Эриком Липпертом в его посте в блоге Закрытие переменной цикла, считающейся вредной , и ее продолжение.
Для меня наиболее убедительным аргументом является то, что наличие новой переменной в каждой итерации было бы несовместимо с циклом стиля 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 # .
В итоге мы использовали образец из этой статьи проекта кода: Высокий уровень прав может быть плохим для вашего приложения: как запустить процесс без повышенных прав в конце установки
Похоже, что до сих пор это работает , Я так понимаю, что он внедряется в RunDll32.exe, мой C ++ / Win32 довольно слаб, поэтому я не особо разбирался в реальной реализации, просто его использую. Подтверждено, что он работает в Vista и Win7 как на x86, так и на x64 (по крайней мере, для нас x86 и x64 требуют разных dll, которые проверяются во время установки и используются правильные).
Вы можете использовать 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());
}
}