Определенные переменные среды в .bat не назначаются, если мы запускаем приложение, необходимое администратору - PullRequest
0 голосов
/ 21 ноября 2018

Следующая проблема появляется только в Windows 10, а не в Windows 7.

У меня есть приложение (C ++, Visual studio 2017), для которого требуются права администратора (flag /level='requireAdministrator' на компоновщике).Здесь я пытаюсь получить переменную среды RESOURCES:

Пример

  int main() {
  const char* buf;
  buf = getenv("RESOURCES");
  if (buf)
      cout << buf << endl;
  else
      cout << 0 << endl;

  system("pause");

  return 0;
}

В Windows 7 я использовал следующий пакетный файл, не запуская его от имени администратора:

@echo off

set WORKING_DIR=%~dp0
set APP=%WORKING_DIR%\ConsoleApplicationTest.exe
set RESOURCES=%WORKING_DIR%\resources

start "" "%APP%"

В результате - в Windows 10 RESOURCES переменная в коде c ++ пуста, в Windows 7 - правильный путь к ресурсам.Является ли единственным решением в Windows 10 запуск командного файла от имени администратора всегда?

1 Ответ

0 голосов
/ 21 ноября 2018

Ваша проблема в том, что если экземпляр cmd, на котором запущен пакетный файл, не повышен, но ваш исполняемый файл требует повышения прав, то процессы Application Information Service/UAC будут обрабатывать создание нового процесса и не будут передавать блок среды cmd (далее здесь и здесь ).

Таким образом, без изменения программного кода у вас есть только две опции: выполнить экземпляр cmd от имени администратора или установить переменную каксистемная переменная среды (да, это требует повышенного уровня процесса)

...