【问题标题】:Why is my Console app running from System32?为什么我的控制台应用程序从 System32 运行?
【发布时间】:2017-06-30 23:02:38
【问题描述】:

我有一个控制台应用程序,它位于我的桌面上。我已将其设置为计划任务,以无限期地每 20 分钟运行一次。我已关闭自动睡眠/休眠。然后我把我的电脑打开并锁定我的桌面周末(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文件夹运行?

【问题讨论】:

    标签: c# io scheduled-tasks console-application system32


    【解决方案1】:

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

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

    您可以使用环境变量。例如,%USERPROFILE% 会将起始目录设置为用户的配置文件目录(例如 C:\Users\MyUsername)。

    与其更改计划任务的开始目录,不如find the the directory where the console application executable is located

    System.Reflection.Assembly.GetExecutingAssembly().Location

    【讨论】:

    • 所以找到我的控制台应用程序的目录比使用任务计划程序进行调整更好?
    • 完全取决于你想要什么。如果应用程序应该在启动 EXE 的目录中创建日志目录 (1),则不要进行任何代码更改,而是调整任务计划程序设置。如果应用程序应该在与 EXE 相同的目录中创建日志目录 (1),则使用System.Reflection.Assembly.GetExecutingAssembly().Location。您可以为两者编写代码,例如先尝试目录 (1),如果失败,然后再尝试目录 (2)。
    • 谢谢,我将使用场景(2)。
    【解决方案2】:

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

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

    (注意 \Syswow64\ 中有一个用于 64 位机器的 32 位命令行)。

    【讨论】:

    • 我的机器是 64 位的,但由于我连接到的旧数据库存在问题,我将我的应用程序设计为平台目标为 x86(32 位)。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2020-12-09
    • 2019-01-30
    相关资源
    最近更新 更多