2017-02-13 7 views
2

У меня есть консольное приложение, которое находится на моем рабочем столе. Я установил его в запланированную задачу для запуска каждые 20 минут на неопределенный срок. Я отключил автоматический спящий режим/спящий режим. Затем я оставил свой компьютер и заблокировал свой рабочий стол на выходные (2-3 дня).Почему приложение Console работает от System32?

Мое консольное приложение было разработано, чтобы отправлять мне по электронной почте каждый раз, когда он ловит исключение. Когда я вернусь, проверил, что мой почтовый ящик получил пару сообщений об ошибках, содержащих

Доступ к пути «C: \ WINDOWS \ system32 \ myLogs \» запрещен.

, казалось моя консоль приложение было запускается с System32 не из моего Desktop.

Вопрос: Почему это так?


это моя строка на создание моего myLog пути к папке

var logpath = Directory.GetCurrentDirectory() + Properties.Settings.Default.LogPath; 

это проверяет, если папка существует, если не создает новую папку.

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

Я считаю, что ошибка была инициирована при проверке/создании папки. Мое приложение должно создать папку myLog в том же каталоге, что и мое консольное приложение.

Вопрос: Почему он исходит от System32 Папка?

ответ

4

Запланированные задания запускаются Планировщик заданий. Эта служба выполняется внутри исполняемого файла C:\Windows\System32\svchost.exe. По умолчанию все приложения, запущенные Планировщиком задач, запускаются с C:\Windows\System32 в качестве текущего каталога.

Вы можете изменить каталог запуска в диалоговом окне Edit действий планировщика задач:

Task Scheduler: Edit Action dialog

Вы можете использовать переменные окружения. Например, %USERPROFILE% установит стартовый каталог в каталог профиля пользователя (например, C: \ Users \ MyUsername).

Вместо того, чтобы изменить каталог запуска для запланированной задачи, вы можете find the the directory where the console application executable is located:

System.Reflection.Assembly.GetExecutingAssembly().Location

+0

Значит, лучше найти каталог моего консольного приложения, чем настроить с помощью планировщика заданий? – Hexxed

+0

Зависит исключительно от того, что вы хотите. Если приложение должно создать каталог журнала _ в каталоге, в котором EXE был запущен_ (1), тогда не делайте никаких изменений кода и не настраивайте параметры планировщика заданий. Если приложение должно создать каталог журнала _ в том же каталоге, что и EXE_ (1), используйте «System.Reflection.Assembly.GetExecutingAssembly(). Вы можете использовать код для обоих, например, сначала попробуйте каталог (1), если это не удается, затем попробуйте каталог (2). – Serge

+0

Спасибо, я буду использовать сценарий (2). – Hexxed

-1

приложения Консольные «командной строки», и они работают с CMD.EXE, который обычно находится в C: \ Windows \ System32 \

Я подозреваю, что запланированное задание устанавливает текущий каталог, где CMD.EXE является и затем запускает ваше приложение, указав полную папку,

(обратите внимание, что в 32-битных командных строках для 64-разрядных машин есть один из них \ Syswow64 \).

+0

моя машина находится в 64Bit, но я разработал мое приложение с целевой платформе x86 (32Bit) из-за проблем со старой базой данных im, к которой подключается. – Hexxed