При автозагрузке программа убивается

263
09 декабря 2016, 08:53

Приветствую,

Добавляю консольную программу в автозагрузку таким способом

        if ( this.autorun != 0 )
        {
            Microsoft.Win32.RegistryKey Key =
                Microsoft
                .Win32
                .Registry
                .CurrentUser
                .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true);
            Key.SetValue("имя_программы", Environment.CurrentDirectory + "\\имя_программы.exe");
            Key.Close();
        }
        else
        {
            Microsoft.Win32.RegistryKey key =
                Microsoft
                .Win32
                .Registry
                .CurrentUser
                .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", true);
            key.DeleteValue("имя_программы", false);
            key.Close();
        }

На Win7 работает правильно - после загрузки системы программа запускается и выполняет свою работу.

Проблема возникает на Win Vista - после загрузки системы программа запускается, но после этого кидает исключение. В логах пусто, тут закрались подозрения, сделал вывод в консоль и подозрения подтвердились - эксепшн вылетает при первой попытке записать в файл.

System.UnauthorizedAccessException: Отказано в доступе по пути "C:\Windows\system32\error.log".

error.log - собственно, файл логов. Почему-то пытается писать в C:\Windows\system32\. Сначала подумал на относительные пути, но при указании абсолютных - абсолютно то же самое. При ручном запуске всё в норме.

Непонятно куда копать.

@Pavel Mayorov

StreamWriter f = new StreamWriter( Environment.CurrentDirectory + "\\" + "error.log", true );
f.WriteLine( str );
f.Close();
Answer 1

Environment.CurrentDirectory + "/" + "error.log" - это вы называете "абсолютным путем"?! Очевидно же, что текущая директория "по умолчанию" - C:\Windows\system32\. Вот и файл лога оказывается там.

Где лучше разместить файл лога? Для приложений, которые ставятся в Program Files лучше всего размещать его где-нибудь в неперемещаемом профиле пользователя. Путь к нему можно получить как Enviroment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData).

Если же приложение является portable (т.е. предназначено для запуска из директории с доступом на запись) - то хорошей отправной точкой будет AppDomain.CurrentDomain.BaseDirectory или же Assembly.GetEntryAssembly().Location.

READ ALSO
Замена по регулярке

Замена по регулярке

Допустим, имеется текст text1(text2)text2 нужно получить text1 (text2) text2

287
Как определить текущий DispatcherPriority из метода который выполняет Dispatcher?

Как определить текущий DispatcherPriority из метода который выполняет Dispatcher?

Как определить текущий DispatcherPriority из метода который выполняет Dispatcher? Если я запускаю какой–то метод через Dispatcher с приоритетом (для примера)...

308
DataTableAdapter Report Viewer C# WinForms

DataTableAdapter Report Viewer C# WinForms

После компиляции приложения, не работает отчет в reportViewer если рядом с файломexe не лежит XML файл, в котором при компиляции прописывается сервер,...

293
Передача сообщений между потоками - C#

Передача сообщений между потоками - C#

Есть у меня простой класс-логгер:

752