我创建了一个作为 Windows 服务运行的应用程序(在 C++ 中,尽管我认为这并不重要),该服务的目的是启动和管理其他应用程序和脚本文件。
它必须运行的一些脚本文件需要创建和修改其他脚本和应用程序可以访问的环境变量。
如果我创建一个包含内容的 .bat 文件:
SETX /M fooVar 101010101
并从具有管理员权限的 cmd.exe 窗口运行它,然后它就可以工作了。但是,当我使用 Createprocess 从我的服务运行它时,如下所示:
CreateProcess( LPTSTR(filePath.c_str()), //path and application name
LPTSTR(cmdArgs.c_str()), // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
TRUE, // Set handle inheritance
NULL, // Creation flags
LPTSTR(envVars.c_str()), // Environment Variables
LPTSTR(launchDir.c_str()), // Starting Directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
在哪里:
filepath
= C:\Windows\System32\cmd.exe
cmdArgs
= /c "C:\testFiles\foo.bat"
然后标准输出显示:
C:>SETX /M fooVar 101010101
成功:指定的值已保存。
然而环境变量并没有改变。
我想避免更改我的应用程序,理想情况下,我正在寻找可setx /M
在 Windows 服务中工作的 bat 脚本中使用的替代方法。或者如果允许工作的话,可以给我的服务额外的权限setx /M
。