为什么我的控制台应用程序从System32运行?

3
我有一个控制台应用程序,它位于我的桌面上。我将其设置为定期运行,每隔20分钟运行一次,无限期地。我关闭了自动睡眠/休眠。然后我把我的PC开着并锁定了我的桌面,过了一个周末(2-3天)。
我的控制台应用程序是开发用来在捕获异常时向我发送电子邮件的。当我回来查看收件箱时,发现收到了几封包含以下内容的错误电子邮件:
“拒绝访问路径'C:\ WINDOWS \ system32 \ myLogs \'

似乎我的控制台应用程序是从 System32 而不是从我的 Desktop 运行。 问题: 为什么会这样呢?
这是我的创建 myLog 文件夹路径的字符串
var logpath = Directory.GetCurrentDirectory() + Properties.Settings.Default.LogPath;

这段代码检查文件夹是否存在,如果不存在则创建一个新的文件夹。

if (!Directory.Exists(logpath))
   Directory.CreateDirectory(logpath);

我认为错误是在检查/创建文件夹时触发的。 我的应用程序应该在与控制台应用程序相同的目录中创建myLog文件夹。

问:为什么它在System32文件夹中运行?

2个回答

11

计划任务由任务计划程序服务启动。此服务在C:\Windows\System32\svchost.exe可执行文件内运行。默认情况下,任务计划程序启动的所有应用程序都以C:\Windows\System32作为当前目录启动。

您可以在任务计划程序的“编辑操作”对话框中更改起始目录:

Task Scheduler: Edit Action dialog

您可以使用环境变量。例如,%USERPROFILE%将把起始目录设置为用户个人资料目录(例如 C:\Users\MyUsername)。

与其更改计划任务的起始目录,您可能希望找到控制台应用程序可执行文件所在的目录

System.Reflection.Assembly.GetExecutingAssembly().Location


那么,找到我的控制台应用程序的目录比调整任务计划程序更好吗? - Hexxed
完全取决于您的需求。如果应用程序应该在启动EXE的目录中创建一个日志目录(1),那么不要进行任何代码更改,而是调整任务计划程序设置。如果应用程序应该在与EXE相同的目录中创建一个日志目录(1),则使用System.Reflection.Assembly.GetExecutingAssembly().Location。您可以为两者编写代码,例如首先尝试目录(1),如果失败,则尝试目录(2)。 - Serge
谢谢,我会使用方案(2)。 - Hexxed

-1

控制台应用程序是“命令行”应用程序,它们在通常位于C:\Windows\System32\的CMD.EXE中运行。

我怀疑计划任务将当前目录设置为CMD.EXE所在的位置,然后通过指定完整文件夹来启动您的应用程序,

(注意,64位机器上32位命令行中有一个在\Syswow64\中)。


我的机器是64位的,但我设计的应用程序平台目标为x86(32位),这是因为我连接的旧数据库存在问题。 - Hexxed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接