検出は、Windowsサービスが削除されたときです


9

Windowsサービスが削除されたことを検出する方法はありますか?イベントログを確認しましたが、追加されただけの削除済みアクションは取得されません。

監査ログを使用する方法があると思いますが、これを行う方法がわかりません。

どんな助けでも大歓迎です。

ありがとう

回答:


6

イベントログまたは監査ログにサービス削除の痕跡はありませんが、できることは、サービスが存在するかどうかを検出する小さなコンソールアプリを作成し、このアプリをアタッチしてWindows Task Scheduler、頻度またはトリガーに基づいて実行がスケジュールされるようにしますサービスが追加または削除れた場合などにアラートを受け取るように、要件に合わせてカスタマイズできます。

コンソールアプリケーションは、最初の実行時に、それはシステム上で、それが経由してサービスに加えられた変更を追跡されます以降の実行上のすべてのサービスをログに記録するように設計されているservicesRemovedと、 servicesAddedこれで我々はサービスが持っているときにとるべきアクションを決めることができ、変更れた

コンソールアプリ:ServiceDetector.exe

static void Main(string[] args)
{
    var path = @"C:\AdminLocation\ServicesLog.txt";

    var currentServiceCollection = ServiceController.GetServices().Select(s => s.ServiceName).ToList(); //Queries the most current Services from the machine

    if (!File.Exists(path)) //Creates a Log file with current services if not present, usually means the first run
    {
        // Assumption made is that this is the first run
        using (var text = File.AppendText(path))
        {
            currentServiceCollection.ForEach((s) => text.WriteLine(s));
        }
        return;
    }

    // Fetches the recorded services from the Log
    var existingServiceCollection = File.ReadAllLines(path).ToList();

    var servicesRemoved = existingServiceCollection.Except(currentServiceCollection).ToList();
    var servicesAdded = currentServiceCollection.Except(existingServiceCollection).ToList();

    if (!servicesAdded.Any() && !servicesRemoved.Any())
    { Console.WriteLine("No services have been added or removed"); return; }

    //If any services has been added
    if (servicesAdded.Any())
    {
        Console.WriteLine("One or more services has been added");
        using (var text = File.AppendText(path))
        {
            servicesAdded.ForEach((s) => text.WriteLine(s));
        }
        return;
    }
    //Service(s) may have been deleted, you can choose to record it or not based on your requirements
    Console.WriteLine("One or more services has been removed");

}

スケジューリングタスク

Windows Start> Task Scheduler> Create Basic Task> Set Trigger> Attach your exe> Finish


提案をありがとう、これに関する問題は、削除されるサービスの名前を特に知らない任意のサービスである可能性があることです。
BillyDay

@BillyDay、ああ、なるほど、答えが更新されました
クリント

これが最善のアプローチだと思います。起動時に実行されるサービスを作成してループし、サービスが削除されたことを検出して、ファイルに書き込むか、イベントを発生させます。ありがとう
BillyDay

0

Windowsサービスを削除すると、システムイベントログにイベントが追加されることは間違いありません(ソース:https : //superuser.com/questions/1238311/how-can-we-detect-if-a-windows- service-is-deleted-is-there-an-event-log-id-for-i)。

私の知る限り、サービスの削除を監査する監査ポリシーはありません。もしあったら、ここにリストされていると思います:https : //docs.microsoft.com/en-us/windows/security/threat-protection/auditing/基本的な監査プロセスの追跡

ServiceController.GetServices()サービスのアンインストール時にプログラムが実行されていない可能性があるため、ポーリングは問題外だと思いますか?


私のプロセスが実行されていない可能性があります。
BillyDay

OK、それでは、@ BillyDayで運が悪いと思います
simon-pearson

なぜそのサービスに関連付けられたファイルをチェックしないのですか...例myService.exe
johnny 5

レジストリをチェックして、サービスがHKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ servicesであることを確認することもできます。サービスが削除されていないことを確認したい場合は、独自のキャッシュを追加する必要があります
johnny 5

0

何が優れたインストルメンテーションであるかを理解するまで、インストルメンテーションを構築する方法はたくさんあります。私のハウツーは基本的にWikipediaのエントリhttps://en.wikipedia.org/wiki/Instrumentationから直接取得されます

インストルメンテーションハウツー

http://www.powersemantics.com/e.html

  • 非統合
  • 一次データのみ
  • 引くのではなく引く
  • プロセス別に整理
  • オフラインにしない

インジケーターの測定の問題に対する解決策は存在しますが、「プッシュベースの」計装信号を別のシステムに送る方法を概念化することに行き詰まっています。私のE記事で説明しているように、計測器は常にデータをプルし、プッシュしないでください。イベント駆動型シグナリングは、不要な潜在的な障害ポイントです。

別のアプリケーションの構築についての不確定性や疑問を解消するために、モニターは通常独立しています(ウィキペディアが言うように統合されていない)プロセス。したがって、モニターが「実行されていない可能性がある」とは、統合されていない実際のモニターを構築することを選択していないことを意味します。コンシューマーシステムは、チェックを独自のプロセスに統合しているため、計測を正しくモデル化していません。

これらの責任を分離して続行します。機器が削除されたサービスを合理的にポーリングし、タイマーでデータをポーリングする頻度を決定します。API呼び出しsimon-pearsonを使用すると、サービスが追加されたことを検出することもできます。もちろん、モニターはサービスリストのコピーをローカルにキャッシュして、インジケーターが追加または削除されたものを推測できるようにする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.