如果我们启动管理员所需的应用程序,则不会分配.bat中定义的环境变量



以下问题仅出现在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;
}

在Windows7上,我在没有以管理员身份运行的情况下使用了以下批处理文件:

@echo off
set WORKING_DIR=%~dp0
set APP=%WORKING_DIR%ConsoleApplicationTest.exe
set RESOURCES=%WORKING_DIR%resources
start "" "%APP%"

因此,在Windows 10中,c++代码中的变量为空,在Windows 7中,资源的正确路径为空。Windows 10上唯一的解决方案是始终以管理员身份启动批处理文件吗?

您的问题是,如果运行批处理文件的cmd实例没有提升,但您的可执行文件需要提升,那么Application Information Service/UAC进程将处理新进程的创建,并且不会传输cmd环境块(更多信息,请参阅此处(。

因此,在不更改程序代码的情况下,您只有两个选项:以管理员身份执行cmd实例或将变量设置为系统环境变量(是的,这需要提升进程(