Изменить совместимость исполняемого файла с кодом
У меня есть файл 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.