С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
.NET 4.x

Процесс не закрывается

03.01.2018, 14:02. Показов 3102. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается закрыть процесс из массива
Фокус ещё в том что файл удаляется когда он открыт, но после удаления ( файла ) процесс висит в системе ( не закрытый )
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void ESA()
{
      foreach (var Files in (new string[] { "*.exe", "*.doc",  }).SelectMany(f => 
      new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).GetFiles(f)).ToArray())
      {
           foreach (var PC in Process.GetProcessesByName(Files.Name)) // Полагаю что проблема здесь.
           {
               PC.Kill(); // Функция не срабатывает
           }
 
          Files.Delete(); // Эта функция работает 
      }
}
Как добиться закрытия процесса перед его удалением?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2018, 14:02
Ответы с готовыми решениями:

Не закрывается процесс
у меня постоянно запущен процесс "zbpocdk.exe", причем в двух вариантах, если завершить, то он тут же появляется, грузит он проц, иногда до...

Процесс не закрывается
Проблема на 82ой строчке, второй параметр функции GetMessage(). Так как у меня создается одно окно второй параметр пишу 0. Но если будет...

не закрывается процесс excel.exe
добрый день столкнулся с проблемой в представленном ниже коде: не понятно по каким причинам не отрабатывается OpExcel.Quit. После...

19
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
03.01.2018, 14:52
Цитата Сообщение от chaleureux Посмотреть сообщение
C#
1
PC.Kill(); // Функция не срабатывает
Подозреваю что она не срабатывает потому что она даже не вызывается. А не вызывается она потому что Process.GetProcessesByName() нужно передавать имя процесса без расширения. Также передавать имя doc файла ей не имеет смысла.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
03.01.2018, 15:13  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
А не вызывается она потому что Process.GetProcessesByName() нужно передавать имя процесса без расширения.
Как это сделать?
Как перечесляя процессы получить путь до папки appdata и завершить процессы по маске ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
03.01.2018, 16:25
Цитата Сообщение от chaleureux Посмотреть сообщение
Как это сделать?
Path.GetFileNameWithoutExtension

Цитата Сообщение от chaleureux Посмотреть сообщение
Как перечесляя процессы получить путь до папки appdata и завершить процессы по маске ?
В смысле завершить все процессы которые были запущены из папки appdata? Как-то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
foreach (Process process in Process.GetProcesses())
{
    string mainModulePath;
    try
    {
        mainModulePath = process.MainModule.FileName;
    }
    catch (Win32Exception)
    {
        continue;
    }
    
    if (mainModulePath.StartsWith(appdata, StringComparison.OrdinalIgnoreCase))
    {
        process.Kill();
    }
}
"Маску" можно указать с помощью регулярного выражения.
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
03.01.2018, 16:34  [ТС]
Пробую сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void CleanAppData()
{
    foreach (var Application in (new string[] {"*.exe", "*.doc", }).SelectMany(f =>
    new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).GetFiles(f)).ToArray())
    {
         KillProcessByPartOfPath(Application.FullName);
    }
 
}
static void KillProcessByPartOfPath(string partOfPath)
{
     foreach (var process in Process.GetProcesses())
     {
          try
          {
              if (process.MainModule.FileName.IndexOf(partOfPath, comparisonType: StringComparison.OrdinalIgnoreCase) > 0)
              {
                  try
                  {
                      process.Kill();
                  }
                  catch (Exception e)
                  {
                      Console.WriteLine(e);
                  }
              }
          }
          catch (Exception e)
          {
             Console.WriteLine(e);
          }
    }
}
В итоге получаю ошибки:
32-разрядные процессы не могут получить доступ к 64-разрядному процессу
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
03.01.2018, 16:51
Цитата Сообщение от chaleureux Посмотреть сообщение
В итоге получаю ошибки: 32-разрядные процессы не могут получить доступ к 64-разрядному процессу
Есть такое ограничение. Нужно откомпилировать приложение под платформу x64 или под AnyCPU со снятым флажком "Prefer 32-bit".

Цитата Сообщение от chaleureux Посмотреть сообщение
C#
1
2
3
4
5
    foreach (var Application in (new string[] {"*.exe", "*.doc", }).SelectMany(f =>
    new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)).GetFiles(f)).ToArray())
    {
         KillProcessByPartOfPath(Application.FullName);
    }
Зачем в цикле вызывать метод с одним и тем же аргументом? Чтобы процесс завершился на 400%?

Цитата Сообщение от chaleureux Посмотреть сообщение
C#
1
if (process.MainModule.FileName.IndexOf(partOfPath, comparisonType: StringComparison.OrdinalIgnoreCase) > 0)
А если путь начинается с указанной строки?
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
03.01.2018, 16:54  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нужно откомпилировать приложение под платформу x64 или под AnyCPU со снятым флажком "Prefer 32-bit".
Так и делал, не помогло.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
03.01.2018, 17:28
chaleureux, у меня нет под рукой Windows x64 чтобы проверить, но это должно работать
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
04.01.2018, 01:17  [ТС]
Попробовал ваш способ:
C#
1
2
3
4
5
6
7
8
9
10
11
12
var AppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
foreach (var List in Process.GetProcesses())
{
   try
   {
      if (List.MainModule.FileName.StartsWith(AppData, StringComparison.OrdinalIgnoreCase))
      {
         List.Kill();
      }
   }
   catch { }
}
Процессы не закрываются, пишет отказано в доступе ( UnauthorizedAccessException )
Запустил пару процессов из папки appdata даже текстовый файл не закрыл.
Запускал с правами администратора, на папку права есть.
Что ему не нравится? ))
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
04.01.2018, 01:47
Используются функция http://referencesource.microso... 89d4e52d08 TerminateProcess https://msdn.microsoft.com/ru-... s.85).aspx
Вам нужно наличие привелегии SeDebugPrivilege и что бы она была включена у токена(процесса или потока)
https://msdn.microsoft.com/ru-... s.85).aspx

Если ее нету то можно добавить через GPO, кроме наличия она еще должна быть заэнеблина в вашем процессе или потоке.
Миниатюры
Процесс не закрывается   Процесс не закрывается  
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
04.01.2018, 01:50  [ТС]
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Вам нужно наличие привелегии SeDebugPrivilege и что бы она была включена
Она включена была
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
04.01.2018, 02:05  [ТС]
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Используются функция TerminateProcess
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool TerminateProcess(IntPtr hProcess, int uExitCode);
 
foreach (var ProcsList in Process.GetProcesses())
{
      try
      {
           if (ProcsList.MainModule.FileName.StartsWith(AppData, StringComparison.OrdinalIgnoreCase))
           {
              TerminateProcess(ProcsList.Handle, 0);
           }
       }
       catch (UnauthorizedAccessException) { }
       catch (IOException) { }
       catch (Win32Exception) { }
}
Результ:

************** Текст исключения **************
System.UnauthorizedAccessException: Отказано в доступе по пути "File.exe".
в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
Хоть просто из коробки убить, то через TerminateProcess доступа нету ( даже с включенным SeDebugPrivilege )
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
04.01.2018, 02:34
От того что в терминале есть такие привилегия(например в powershell можно выполнить kill и он отработает), абсолютно не значит что она есть у вашего приложения(процесса/потока) например из за UAC в windows

привилегии можно посмотреть например через эту тулу https://technet.microsoft.com/... lorer.aspx
Миниатюры
Процесс не закрывается  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14169 / 5366
Регистрация: 17.03.2014
Сообщений: 28,848
Записей в блоге: 1
04.01.2018, 13:15
_exp10der_, по моему SeDebugPrivilege здесь не нужна. Она слишком мощная. Не зря ее имеют только администраторы. Пользовательские процессы завершаются и без неё.

chaleureux, ты уверен что исключение возникает именно при вызове Kill? Трассировка стека говорит про I/O и кроме того ты же перехватываешь исключения и они должны просто игнорироваться. Может опишешь подробнее свою задачу? Что именно представляет твоя программа - консолька, настольное приложение, служба? Как она запускается - пользователем или может через Task Scheduler? Чьи процессы ты пытаешься завершить - свои или чужие?
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
04.01.2018, 17:39  [ТС]
OwenGlendower Как скажите БОСС.
Опишу задачу по подробнее: ( изменилось поведение программы ).
1 - Консольное приложение.
2 - Запускается программа пользователем ( от имени Администратора )
C#
1
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
3 - Пытаюсь завершить процессы ( которые были запущены из определенной папки ) на данный момент эта папка %AppData%

Теперь к изменениям:

Создал заново проект, засунул код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Метод
public static void KillData(string AppData)
{
   try
   {
      foreach (var ProcsList in Process.GetProcesses())
      {
         if (ProcsList.MainModule.FileName.StartsWith(AppData, StringComparison.OrdinalIgnoreCase))
         {
             ProcsList.Kill();
         }
      }
   }
   catch { }
}
// Вызов
private static void Main()
{
    KillData(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));     
    Console.Read();
}
Компилировал программу в разных платформах:
anycpu, x64,x32. так же менял в "Сборка - Диспетчер Конфигураций"




В папке %AppData% - запустил пару файлов: *.txt, *.exe
После запуска программы мне показывает ошибку:



И вот ещё лог ошибки:

Error.txt
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
04.01.2018, 21:22
OwenGlendower, Ну если быть точнее нам надо нужен хендл с этой функции OpenProcess где параметр dwDesiredAccess будет со значением PROCESS_TERMINATE просто нам могут отказать на открытие процесса с этим доступом, тогда нам придется получить привилегию SE_DEBUG_NAME

В этой статье можно взять готовый код который пытается открыть процесс с PROCESS_TERMINATE если у него не получается, то включает привилегию SE_DEBUG_NAME и пробует снова.
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.01.2018, 11:44
Цитата Сообщение от chaleureux Посмотреть сообщение
Компилировал программу в разных платформах:
Цитата Сообщение от OwenGlendower Посмотреть сообщение
со снятым флажком "Prefer 32-bit".
...
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
05.01.2018, 12:12  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
...
И что за пустое сообщение?
Пробовал снимать флажок и с флажком использовал, результат один и тот же.
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.01.2018, 12:24
Цитата Сообщение от chaleureux Посмотреть сообщение
Пробовал снимать флажок и с флажком использовал, результат один и тот же.
Сообщение об ошибке тоже не менялось? В скрине ругается на доступ к 64 из 32. С собраным исключительно для 64 ошибка таже?
0
 Аватар для chaleureux
25 / 28 / 19
Регистрация: 24.12.2014
Сообщений: 1,260
05.01.2018, 15:29  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Сообщение об ошибке тоже не менялось?
При компиляции в других платформах? Нет! Ошибка такая же: Нет доступа
Цитата Сообщение от Wolfdp Посмотреть сообщение
С собраным исключительно для 64 ошибка таже?
Всё верно.
В разных компилировал везде одна и та же ошибка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2018, 15:29
Помогаю со студенческими работами здесь

Процесс не закрывается даже с правами администратора (Отказано в доступе)
Всем привет, Не могу принудительно закрыть процесс на windows 10 x64, ни одним диспетчером задач запущенным с правами администратора. ...

Процессор загружен на 100, при включении диспетчера процесс закрывается и все приходит в норму
Прошу вашей помощи, добрые люди,перепробовал антивирусы- не помогает(((( Собственно в названии все написал, какой-то процесс грузит проц...

Запущен ли процесс? или Завершен ли дочерний процесс моей программы?
Моя программа выполняет execute('cmd', '/C ...'). На момент execute-а других экземпляров cmd.exe нет. Мне хочется узнать, когда окошко cmd...

Открыть процесс процесс на полный доступ, и запретить для других
Всем доброго времени суток. Друзья, HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); Так я открываю процесс на полный...

Процесс А инициализирует массив случайными значениями и записывает их в файл, а затем запускает процесс Б
В универ нужно сделать лабу по выше указанной теме. Мне не нужно чтобы за меня делали - нужен просто совет. Для начала: Задание:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru