Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432

Не отображать службы Microsoft

17.01.2025, 21:18. Показов 1063. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем привет, подскажите пожалуйста. Хочу получить список служб, которые не относятся к Microsoft, то есть мне нужно отсеять стандартные службы windows и получить список установленных сторонних служб.
Я думал сделать так: Взять список служб из реестра HKLM\System\CurrentControlSet\Services вывести все стандартные службы в массив строк и просто отсеивать по имени и если есть имена которые не в массиве строк добавлять их куда хочется.
Но такой способ очень плох во-первых при добавление microsoft какой-либо службы она не будет отсеиваться
во-вторых очень большой список получается из 720 наименований
в-третьих, я думаю есть способ более проще или надежнее, но я такой пока не нашел

а если точно, то хочется получить список такой же как в msconfig в разделе службы и выбрав галочку не отображать службы Microsoft
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2025, 21:18
Ответы с готовыми решениями:

Пришло письмо от службы поддержки разработчиков Microsoft: ?.ru был идентифицирован как объект правительственных санкций
Пришло письмо от службы поддержки разработчиков Microsoft: Мы рекомендуем вам обратиться за консультацией к внешнему...

Некорректно отображать сайт в Microsoft Edge
Если открыть сайт в браузерах: Opera, Mozila, Chrome или Internet Explorer. То, отображается нормально. Но если открыть сайт в...

Аналог службы Microsoft DFS под M$
Задача следующая. У меня есть w2k proffesional (w2kServera нет и не предлагать, 8) ), мне нужно на w2kprof установить службу...

12
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
17.01.2025, 22:58
pafka1997, попробуйте проверять цифровую подпись исполняемого файла. Это можно сделать с помощью пакета Microsoft.Security.Extensions.
C#
1
2
3
4
5
6
7
8
9
using (FileStream fs = File.OpenRead(fileName))
{
    FileSignatureInfo signatureInfo = FileSignatureInfo.GetFromFileStream(fs);
    if (signatureInfo.State == SignatureState.SignedAndTrusted
            && signatureInfo.SigningCertificate.IssuerName.Name.StartsWith("CN=Microsoft"))
    {
        // Файл подписан сертификатом от Microsoft
    }
}
1
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
18.01.2025, 19:00  [ТС]
OwenGlendower, я посмотрел ваш способ, пока не пробовал реализовать, но позже попробую. Я правильно понимаю, что с вашим способом нужно из реестра взять путь до файла или же можно через ServiceController
У меня получилось пока что, вот так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
foreach (var service in key.GetSubKeyNames())
{
    RegistryKey subkey = key.OpenSubKey(service, false);
    string GetValueImagePath = (string)subkey.GetValue("ImagePath");
 
    if (GetValueImagePath != null)
    {
        string lastWord = GetValueImagePath.Split('\\').Last();
        int index = lastWord.LastIndexOf("\"");
        if (index >= 0)
            lastWord = lastWord.Substring(0, index);
 
        string ch = "system32";
        string ch1 = "windows";
        var indexOfChar = GetValueImagePath.ToLower().Contains(ch);
        var indexOfChar1 = GetValueImagePath.ToLower().Contains(ch1);
        if (indexOfChar != true && indexOfChar1 != true)
        {
            NewListViewAndAdd(lastWord, GetValueImagePath);
        }
    }
}
Конечно тоже есть свои минусы с тем же отсеиванием по имени system32 an windows так как может встретиться в любой программе и уже не будет отображаться, но можно доработать и тогда будет работать хорошо.
Единственное пока не знаю как отличить программы такие как Gigabyte update service так как он устанавливается в корень винды, а все останые программы которые не в корне виндовс видит хорошо
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
18.01.2025, 21:21
Цитата Сообщение от pafka1997 Посмотреть сообщение
У меня получилось пока что, вот так:
По моему так лучше не делать. Место расположения сервиса никак не говорит о его авторстве. Сервисы Microsoft не обязаны находится только в папке windows. Точно так же в папке windows вполне могут находится сервисы других компаний. Поэтому лучше попробовать вариант с цифровой подписью.

Цитата Сообщение от pafka1997 Посмотреть сообщение
Я правильно понимаю, что с вашим способом нужно из реестра взять путь до файла или же можно через ServiceController
ServiceController не возвращает путь к сервису так что только через реестр. Тем не менее имеет смысл объединить эти два способа. Сначала получить имена сервисов с помощью ServiceController затем уже читать информацию из реестра. Так нам не нужно будет делать ручную фильтрацию чтобы отличить сервис от драйвера.
C#
1
2
3
4
5
6
7
8
9
10
11
var names = ServiceController.GetServices().Select(svc => svc.ServiceName);
foreach (var serviceName in names)
{
    using (RegistryKey serviceKey = key.OpenSubKey(serviceName))
    {
        string imagePath = (string)serviceKey.GetValue("ImagePath");
        string fullPath = Native.GetFileName(imagePath);
        string nameOnly = Path.GetFileName(fullPath);
        NewListViewAndAdd(nameOnly, fullPath);
    }
}
Код класса Native
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
static class Native
{
    public static string GetFileName(string cmdLine)
    {
        IntPtr argvPtr = CommandLineToArgvW(cmdLine, out _);
 
        if (argvPtr == IntPtr.Zero)
            throw new InvalidOperationException($"CommandLineToArgvW has failed with error code '{Marshal.GetLastWin32Error()}'");
 
        try
        {
            return Marshal.PtrToStringUni(Marshal.ReadIntPtr(argvPtr, 0));
        }
        finally
        {
            LocalFree(argvPtr);
        }
    }
 
    [DllImport("shell32.dll", SetLastError = true)]
    static extern IntPtr CommandLineToArgvW(
        [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine,
        out int pNumArgs);
 
    [DllImport("kernel32.dll")]
    static extern IntPtr LocalFree(IntPtr hMem);
}

Обратите внимание на использование функции Windows API CommandLineToArgvW. С её помощью мы упрощаем код разбора строки и, что важнее, избегаем возможных ошибок. Например, используя Split('\\') вы очевидно исходите что слеш может встретиться только в имени исполняемого файла. Но ведь он может использоваться в одном из аргументов. В таком случае вы получите неверное значение в качестве имени приложения. Также правила командной строки могут быть чуть сложнее чем вы думаете и поэтому лучше сделать разбор с помощью системной функции которая в курсе всех тонкостей.

Еще пара моментов в вашем коде которых стоит избегать в будущем.

1. Вы забываете что RegistryKey нужно Dispose()-ить чтобы не было утечек системных ресурсов. Лучше это делать с помощью блока using.

2. Взглянем на этот код
C#
9
10
11
        int index = lastWord.LastIndexOf(""");
        if (index >= 0)
            lastWord = lastWord.Substring(0, index);
Его назначение удалить кавычку в конце строки. Так если в этом назначение, то лучше вызвать TrimEnd.
C#
9
        lastWord = lastWord.TrimEnd('"'); // Коротко и ясно
Добавлено через пару минут: Ваш код отрезает хвост вместе с кавычкой так что мой совет про TrimEnd неверен. Но в других ситуациях он может вам пригодится.

3. Вместо .ToLower().Contains(ch) лучше использовать сравнение строк с игнорированием регистра - .IndexOf(ch, StringComparison.CurrentCultureIgnoreCase). Так приложение будет меньше мусорить в памяти.
C#
15
16
        var indexOfChar = GetValueImagePath.IndexOf(ch, StringComparison.CurrentCultureIgnoreCase);
        var indexOfChar1 = GetValueImagePath.IndexOf(ch1, StringComparison.CurrentCultureIgnoreCase)
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
18.01.2025, 23:12  [ТС]
OwenGlendower, Спасибо за такой открытый ответ.
Я делаю так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var names = ServiceController.GetServices().Select(svc => svc.ServiceName);
foreach (var serviceName in names)
{
    using (RegistryKey serviceKey = key.OpenSubKey(serviceName))
    {
        string imagePath = (string)serviceKey.GetValue("ImagePath");
        string fullPath = Native.GetFileName(imagePath);
        string nameOnly = Path.GetFileName(fullPath);
        NewListViewAndAdd(nameOnly, fullPath);
 
        using (FileStream fs = File.OpenRead(fullPath))
        {
            FileSignatureInfo signatureInfo = FileSignatureInfo.GetFromFileStream(fs);
            if (signatureInfo.State == SignatureState.SignedAndTrusted
                    && signatureInfo.SigningCertificate.IssuerName.Name.StartsWith("CN=Microsoft"))
            {
                Файл подписан сертификатом от Microsoft
            }
        }
    }
}
Вроде все правильно.
Установил пакет NuGet Microsoft.Security.Extensions. И тут ошибка FileSignatureInfo signatureInfo = FileSignatureInfo.GetFromFileStream(fs); Имя "FileSignatureInfo" не существует в текущем контексте.
Using нету, это случайно не класс ?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
18.01.2025, 23:43
Цитата Сообщение от pafka1997 Посмотреть сообщение
Using нету
Смотрите п.3 здесь.

Цитата Сообщение от pafka1997 Посмотреть сообщение
Вроде все правильно.
Вроде нет. Почему-то символы комментария пропали. Кроме того мой код лучше вынести в отдельный метод чтобы можно было написать код следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
var names = ServiceController.GetServices().Select(svc => svc.ServiceName);
foreach (var serviceName in names)
{
    using (RegistryKey serviceKey = key.OpenSubKey(serviceName))
    {
        string imagePath = (string)serviceKey.GetValue("ImagePath");
        if (MicrosoftSigned(imagePath)) continue;
        
        // Остальной код без изменений
        ...
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
18.01.2025, 23:47  [ТС]
OwenGlendower, Добавил using Microsoft.Security.Extensions; после чего пришлось кидать getfilesiginforedistwrapper.dll в ссылки чтобы using работал, сейчас же выдает ошибку "Не удается загрузить DLL "getfilesiginforedist.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)"

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Вроде нет. Почему-то символы комментария пропали.
я не внимательный скинул не посмотрев
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
19.01.2025, 00:00
pafka1997, какую версию .NET вы используете?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
19.01.2025, 00:55  [ТС]
Цитата Сообщение от pafka1997 Посмотреть сообщение
"Не удается загрузить DLL "getfilesiginforedist.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)"
Ошибку решил, не поддерживает Framework 4.8

Добавлено через 2 минуты
OwenGlendower, 4..8 использовал, сейчас поставил 4.7.2. Ошибка ушла теперь насколько я понимаю у меня нет прав так как выдает ошибку Файл 'C:\WINDOWS\System32\alg.exe' не найден.", а по факту есть
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
19.01.2025, 11:04  [ТС]
OwenGlendower, проверил все, выяснил, что на Framework не работает почему-то хотя на сайте написано, что поддерживается. Создал приложение microsoft win form на net 8.0 там все идеально работает

Добавлено через 2 часа 42 минуты
OwenGlendower, Сделал по-другому, получаю полную инфу сертификата так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var names = ServiceController.GetServices().Select(svc => svc.ServiceName);
foreach (var serviceName in names)
{
    using (RegistryKey serviceKey = key.OpenSubKey(serviceName))
    {
        string imagePath = (string)serviceKey.GetValue("ImagePath");
        string fullPath = Native.GetFileName(imagePath);
       // string nameOnly = Path.GetFileName(fullPath); //Позже нужно будет
 
        try
        {
            var signer = X509Certificate.CreateFromCertFile(fullPath);
            var certificate = new X509Certificate2(signer);
            var certificateChain = new X509Chain();
            var indexOfChar = certificate.ToString().Contains("CN=Microsoft");
            if (indexOfChar == false)
            {
                NewListViewAndAdd(serviceName, fullPath);
            }
        }
        catch { }
    }
}
try
{}
catch{}
Для того, чтобы не выдавало исключение, что не удается найти указанный файл. Пока не знаю как по другому сделать
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
19.01.2025, 13:52
Лучший ответ Сообщение было отмечено pafka1997 как решение

Решение

Цитата Сообщение от pafka1997 Посмотреть сообщение
проверил все, выяснил, что на Framework не работает
Работает, но нужно подкрутить немного. Во-первых, NuGet не добавляет ссылку на сборку.

Во-вторых, нужно настроить копирование getfilesiginforedist.dll в целевой каталог. Для этого добавляем команду в post build step.
Windows Batch file
1
copy $(SolutionDir)packages\Microsoft.Security.Extensions.1.3.0\runtimes\win-x86\native\getfilesiginforedist.dll $(TargetDir)
В третьих, проблема с alg.exe возникает из-за того что для 32-битных процессов система перенаправляет некоторые пути. Поэтому файл и не находится. Необходимо переделать код метода MicrosoftSigned добавив временное отключение перенаправления (в проект нужно добавить класс DisableFsRedirection)
Кликните здесь для просмотра всего текста
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
34
35
36
37
38
private static bool MicrosoftSigned(string fileName)
{
    try
    {
        try
        {
            using (FileStream fs = File.OpenRead(fileName))
            {
                return MicrosoftSigned(fs);
            }
        }
        catch (Exception ex)
            when (ex is FileNotFoundException || ex is DirectoryNotFoundException)
        {
            // Если файл не найден, то пробуем еще раз с выключенным перенаправлением путей
            using (new DisableFsRedirection())
            using (FileStream fs = File.OpenRead(fileName))
            {
                return MicrosoftSigned(fs);
            }
        }
 
    }
    catch (Exception ex)
        when (ex is FileNotFoundException || ex is DirectoryNotFoundException)
    {
        //MessageBox.Show("Failed for: " + fileName);
        return false;
    }
}
 
private static bool MicrosoftSigned(FileStream fileStream)
{
    FileSignatureInfo signatureInfo = FileSignatureInfo.GetFromFileStream(fileStream);
    return signatureInfo.State == SignatureState.SignedAndTrusted
           && signatureInfo.SigningCertificate.IssuerName.Name != null
           && signatureInfo.SigningCertificate.IssuerName.Name.StartsWith("CN=Microsoft");
}


Прикладываю проект где это сделано.

Цитата Сообщение от pafka1997 Посмотреть сообщение
Сделал по-другому
Хорошая попытка, но неверная. Класс X509Certificate работает с файлами сертификатов, а у нас на входе исполняемый файл с встроенной подписью. Это совсем другая ситуация.
Вложения
Тип файла: zip SvcList.zip (233.2 Кб, 6 просмотров)
1
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
19.01.2025, 15:19  [ТС]
OwenGlendower, Спасибо большое, так бы я точно не написал.
У меня еще один вопрос, а как убрать службы Windows Defender из списка? Он же является службой microsoft, видимо подписан какой-то другой подписью
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
19.01.2025, 15:51
Цитата Сообщение от pafka1997 Посмотреть сообщение
Спасибо большое, так бы я точно не написал.
Пожалуйста. Главное не пользуйтесь им вслепую, а внимательно изучите чтобы научится писать более красивый код. Здесь же нет ничего сложного. Код всего лишь следует принципу единственной ответственности.

Цитата Сообщение от pafka1997 Посмотреть сообщение
как убрать службы Windows Defender из списка?
Проблема с Windows Defender похоже вытекает из-за особенностей Windows которые мы обсуждали в теме Смена владельца ветки реестра. Приложение просто не может открыть файл на чтение. За неимением лучшего решения предлагаю исключать по имени. Немного измените конструктор ServiceDetails
C#
1
2
bool isWindowsDefender = name == "Sense" && displayName == "Windows Defender Advanced Threat Protection Service";
IsMicrosoftService = isWindowsDefender || MicrosoftSigned(path);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.01.2025, 15:51
Помогаю со студенческими работами здесь

Размещение службы WCF на Microsoft Virtual Machine
Имеется до жути простой чат(прикрепил). Как мне его перенести на VM Microsoft? Web.config сервера <?xml...

Сбой при запуске службы Microsoft AGPv3.5 Filter из-за ошибки.
В просмотре системных событий есть все время при включении компьютера уведомления: 1.Сбой при запуске службы Microsoft AGPv3.5 Filter...

Приложение, позволяющее группой флажков отображать или не отображать элементы управления в окне прило
Добрый вечер! Скажите, пожалуйста, как исправить код, чтобы элементы, при нажатии на флажок появлялись? И ещё почему-то не исчезает...

Не удаётся запустить службы криптографии и некоторые другие важные службы
Итак, расскажу всю историю по порядку. Где-то с полгода назад появилась проблема, что звук, примерно, после часа работы, пропадал,...

Остановка и запуск службы(сервиса) из другой службы или из приложения не используя консоль
Добрый день! Компилятор Embarcadero XE8 Скажите, как можно остановить и запустить некую службу(сервис) зная его имя (например...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru