Windows 在系统'中生成的文件;s%appdata%,而不是用户';运行mpi时%s%appdata%

Windows 在系统'中生成的文件;s%appdata%,而不是用户';运行mpi时%s%appdata%,windows,mpi,appdata,Windows,Mpi,Appdata,我正在windows上运行使用外部DLL的应用程序(sample.exe)(即,我没有此DLL的源代码)。外部DLL在%appdata%文件夹中生成一些数据。当应用程序独立运行时,一切正常 现在,当我使用MPI运行sample.exe时,日志将在中生成,即C:\Windows\System32\config\systemprofile\AppData“ 我知道这是系统的%appdata%。此外,MPI使用“smpd”服务来运行,该服务需要以管理员身份安装。因此,我认为sample.exe可能属于

我正在windows上运行使用外部DLL的应用程序(sample.exe)(即,我没有此DLL的源代码)。外部DLL在
%appdata%
文件夹中生成一些数据。当应用程序独立运行时,一切正常

现在,当我使用MPI运行sample.exe时,日志将在
中生成,即C:\Windows\System32\config\systemprofile\AppData“

我知道这是系统的
%appdata%
。此外,MPI使用
“smpd”
服务来运行,该服务需要以管理员身份安装。因此,我认为sample.exe可能属于系统,而不是用户。但是,当从任务管理器中选中时,应用程序的所有者仍然是用户(
%username%


我不明白为什么日志是在系统的appdata文件夹而不是用户的appdata文件夹中生成的。

可能的解释是,在LOCALSYSTEM帐户下运行的服务正在保存文件。我对应用程序的体系结构知之甚少,因此无法详细说明这是如何实现的

由于
sample.exe
是您自己的应用程序,您可以通过添加日志代码来解决问题。例如:

  • 调用SHGetKnownFolderPath以确定应用程序数据文件夹
  • 调用GetUserName检查您运行的用户帐户
  • 调用GetEnvironmentStrings以确定如何设置环境变量,特别注意%APPDATA%和%LOCALAPPDATA%
  • 如果这是一个C程序,那么也可以使用getenv(“APPDATA”)和getenv(“LOCALAPPDATA”);IIRC,C运行时库保存了它自己的环境变量副本

如果应用程序数据文件夹正确,但环境变量不正确(这是我对该问题的第一个猜测),那么您可以尝试在加载外部库之前使用SetEnvironmentVariable和/或_putenv来更正路径。

这是因为您的Windows服务使用“本地系统帐户”运行。转到服务的属性和“登录”选项卡。将本地系统帐户更改为“此帐户”,并提供您的凭据。否,服务应在用户帐户中运行,并应使用用户AppData。

请注意,进程的所有者、可执行文件的所有者以及进程运行时所在上下文的用户帐户是三种不同的东西。(进程通常由其运行环境的用户拥有,但不一定如此。)