Изменить совместимость исполняемого файла с кодом

У меня есть файл MyUtilities.exe,

Когда я бегу: Process.Start("MyUtilities.exe","SomeParameter");

код завершения этого процесса - 0 (ОК), если он запущен БЕЗ прав администратора. Если я запускаю этот код в качестве администратора, код выхода равен 1!

Так как я не создал MyUtilities.exe Я не могу изменить это.

В конце концов мне нужно бежать Process.Start("MyUtilities.exe","SomeParameter"); как администратор, и он должен вернуть код выхода = 0. Мне удалось это сделать, изменив его совместимость на:

(Щелкните правой кнопкой мыши файл-> Свойства-> Совместимость-> Запустите эту программу от имени администратора)

после изменения этого теперь я могу бежать Process.Start("MyUtilities.exe","SomeParameter"); как администратор, и он возвращает код выхода 0.

Поэтому мой вопрос заключается в том, как я могу изменить совместимость этого файла с кодом, чтобы мне не нужно было указывать пользователям щелкнуть правой кнопкой мыши файл, а затем изменить настройки.

1 ответ

Решение

Это выглядит довольно просто. Просто добавьте значение в реестр.

Ключ: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers-или же- HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Название: f:\ull\path\to\executable.exe

Значение: RUNASADMIN

Вот как вы могли бы сделать это в коде. Если вы пишете в HKCU, вызывающий процесс не должен быть запущен от имени администратора.

static void SetRunAsAdmin(string exeFilePath)
{
    var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", true);
    if (key == null)
        throw new InvalidOperationException(@"Cannot open registry key HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers.");
    using (key)
        key.SetValue(exeFilePath, "RUNASADMIN");
}

Если вызывающий процесс выполняется с правами администратора и запускает "MyUtilites.exe", он также запускается от имени администратора. Просто перейдите в свойства своего проекта и найдите файл манифеста, написанный в формате XML. В этом файле вы увидите asInvoker, измените его на requireAdministrator.

Другие вопросы по тегам