Программа перезапуска не повышена

По какой-то причине моей программе на C # необходимо перезапустить с повышенными привилегиями. Для этого я использую следующий код:

private static void RestartForPermissionsFix()
{
    ProcessStartInfo processInfo = new ProcessStartInfo();
    processInfo.Verb = "runas";
    processInfo.FileName = Assembly.GetExecutingAssembly().Location;

    Process.Start(processInfo);
}

Это прекрасно работает.

После того, как я «исправлю свои права», я хочу перезапустить программу без прав. Я пробовал то же, что и выше, без "рун", но не работает. Я предполагаю, что процесс, запускаемый с повышенного уровня, автоматически становится повышенным. Любая идея?


person coffee_machine    schedule 18.07.2011    source источник


Ответы (2)


Я считаю, что для запуска процесса со средней степенью целостности из процесса с высокой степенью целостности вам нужно будет получить токен текущего процесса, используя _ 1_, продублируйте его, удалите SID с высокой степенью целостности из токена с помощью _2 _, а затем используйте этот токен для создания нового процесса с помощью CreateProcessAsUser. Это будет похоже на этот пример, за исключением того, что вместо добавления SID с низким уровнем целостности у вас будет удалить высокопрочный. Примечание: я не тестировал это, поэтому я не уверен на 100%, что это сработает.

Я предлагаю вам оставить исходный процесс без повышенных прав запущенным и дать ему дождаться завершения своего аналога с повышенными правами (например, используя Process.WaitForExit ). Как только это закончится, оно может продолжаться без повышения, как раньше. Это было бы намного проще и надежнее.

person Sven    schedule 18.07.2011
comment
Я поддерживаю идею позволить первому (не повышенному) процессу работать и возобновить его, когда второй (повышенный) процесс будет завершен (вы можете использовать Process.WaitForExit()). - person Otiel; 18.07.2011
comment
Спасибо, Свен. Конечно, ваше предложение намного проще. Я немного реорганизовал свою программу, чтобы не было проблем с параллельной работой двух экземпляров. - person coffee_machine; 18.07.2011
comment
@coffee_machine: Еще одна информация: одна из причин, по которой повторный запуск без повышенных прав будет плохой идеей, заключается в том, что пользователь является фактическим ограниченным пользователем. В этом случае повышение прав выполняет процесс в другой учетной записи, и вам нужно будет каким-то образом выяснить, какой была исходная учетная запись, чтобы запустить процесс с использованием этих учетных данных. Я сам работаю в такой конфигурации. - person Sven; 18.07.2011
comment
elevation executes the process in a different account - Раймонд объясняет, что делать в этой ситуации . - person GSerg; 11.02.2014

У меня была такая же проблема с приложением, которое я хотел обновить автоматически (программа обновления требует повышенных прав).

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

Затем я встроил этот .exe в свое основное приложение и запустил этот .exe непосредственно перед тем, как покинуть свое приложение, когда я его обновляю.

person Otiel    schedule 18.07.2011