日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#如何不依賴(lài)Windows Defender實(shí)現(xiàn)某個(gè)目錄只允許指定的程序訪問(wèn),非指定程序禁止訪問(wèn)此目錄進(jìn)行任何操作?

admin
2025年4月29日 16:31 本文熱度 666

以下是為 Windows Server 2012 設(shè)計(jì)的增強(qiáng)版目錄防護(hù)方案,通過(guò) 內(nèi)核級(jí)文件監(jiān)控 + 進(jìn)程白名單 實(shí)現(xiàn)實(shí)時(shí)攔截。由于 C# 在用戶(hù)態(tài)的限制,我們需結(jié)合系統(tǒng)工具和底層 API 調(diào)用:

完整解決方案代碼(需管理員權(quán)限運(yùn)行)

using System;

using System.Diagnostics;

using System.IO;

using System.Linq;

using System.Runtime.InteropServices;

using System.Security.Principal;

using System.Threading;


namespace DirectoryGuardPro

{

    class Program

    {

        // 配置區(qū)

        private static readonly string[] AllowedProcesses = { "TrustedApp.exe", "BackupTool.exe" }; // 白名單程序

        private static readonly string ProtectedDirectory = @"C:\MissionCritical";                 // 受保護(hù)目錄


        // 內(nèi)核API聲明

        [DllImport("kernel32.dll", SetLastError = true)]

        private static extern IntPtr CreateFile(

            string lpFileName,

            uint dwDesiredAccess,

            FileShare dwShareMode,

            IntPtr lpSecurityAttributes,

            FileMode dwCreationDisposition,

            uint dwFlagsAndAttributes,

            IntPtr hTemplateFile);


        [DllImport("kernel32.dll", SetLastError = true)]

        [return: MarshalAs(UnmanagedType.Bool)]

        private static extern bool CloseHandle(IntPtr hObject);


        static void Main()

        {

            if (!IsAdmin())

            {

                Console.WriteLine("[錯(cuò)誤] 必須使用管理員權(quán)限運(yùn)行!");

                return;

            }


            // 啟動(dòng)實(shí)時(shí)監(jiān)控線程

            Thread monitorThread = new Thread(FileAccessMonitor);

            monitorThread.IsBackground = true;

            monitorThread.Start();


            Console.WriteLine($"防護(hù)已啟用,保護(hù)目錄:{ProtectedDirectory}");

            Console.WriteLine("白名單程序:" + string.Join(", ", AllowedProcesses));

            Console.WriteLine("按 Ctrl+C 退出...");

            while (true) Thread.Sleep(1000);

        }


        // 核心監(jiān)控邏輯

        private static void FileAccessMonitor()

        {

            using (var watcher = new FileSystemWatcher(ProtectedDirectory))

            {

                watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName 

                    | NotifyFilters.Size | NotifyFilters.LastWrite;

                watcher.IncludeSubdirectories = true;


                // 綁定事件(使用高優(yōu)先級(jí)響應(yīng))

                watcher.Created += (sender, e) => ValidateProcess(e.FullPath);

                watcher.Changed += (sender, e) => ValidateProcess(e.FullPath);

                watcher.Renamed += (sender, e) => ValidateProcess(e.FullPath);

                watcher.Deleted += (sender, e) => ValidateProcess(e.FullPath);


                watcher.EnableRaisingEvents = true;

                while (true) Thread.Sleep(10); // 保持線程活躍

            }

        }


        // 驗(yàn)證進(jìn)程合法性

        private static void ValidateProcess(string filePath)

        {

            int processId = GetFileLockingProcessId(filePath);

            if (processId == -1) return;


            var process = Process.GetProcessById(processId);

            string processName = process.ProcessName.ToLower();


            bool isAllowed = AllowedProcesses.Any(p => 

                p.Equals(processName, StringComparison.OrdinalIgnoreCase));


            if (!isAllowed)

            {

                Console.ForegroundColor = ConsoleColor.Red;

                Console.WriteLine($"[攔截] 非法訪問(wèn)!進(jìn)程:{processName} (PID: {processId}) 文件:{filePath}");

                Console.ResetColor();


                try 

                { 

                    process.Kill(); 

                    BlockFurtherAccess(filePath); // 阻止殘留操作

                }

                catch (Exception ex) 

                { 

                    Console.WriteLine($"[警告] 終止進(jìn)程失敗:{ex.Message}"); 

                }

            }

        }


        // 使用內(nèi)核句柄檢測(cè)文件鎖定進(jìn)程

        private static int GetFileLockingProcessId(string filePath)

        {

            IntPtr handle = CreateFile(

                filePath,

                0x80000000, // GENERIC_READ

                FileShare.ReadWrite,

                IntPtr.Zero,

                FileMode.Open,

                0x80,       // FILE_FLAG_BACKUP_SEMANTICS

                IntPtr.Zero);


            if (handle.ToInt32() == -1)

            {

                int errorCode = Marshal.GetLastWin32Error();

                // 錯(cuò)誤碼 32 表示文件被占用

                return (errorCode == 32) ? QueryProcessUsingHandle(filePath) : -1;

            }

            CloseHandle(handle);

            return -1;

        }


        // 調(diào)用系統(tǒng)命令查詢(xún)進(jìn)程ID

        private static int QueryProcessUsingHandle(string filePath)

        {

            var cmd = new Process

            {

                StartInfo = new ProcessStartInfo

                {

                    FileName = "handle64.exe",  // 需提前部署Sysinternals Handle工具

                    Arguments = $"/accepteula -nobanner \"{filePath}\"",

                    UseShellExecute = false,

                    RedirectStandardOutput = true,

                    CreateNoWindow = true

                }

            };

            cmd.Start();

            string output = cmd.StandardOutput.ReadToEnd();

            cmd.WaitForExit();


            // 解析輸出,例如:"wininit.exe pid: 508 type: File"

            var line = output.Split('\n').FirstOrDefault(l => l.Contains("pid:"));

            if (line != null && int.TryParse(line.Split(' ')[3], out int pid))

                return pid;


            return -1;

        }


        // 強(qiáng)制解除文件鎖定

        private static void BlockFurtherAccess(string filePath)

        {

            try

            {

                using (var fs = new FileStream(filePath, FileMode.Open, 

                    FileAccess.ReadWrite, FileShare.None))

                {

                    fs.Lock(0, fs.Length); // 獨(dú)占鎖定文件

                }

            }

            catch { /* 無(wú)需處理 */ }

        }


        // 管理員權(quán)限檢查

        private static bool IsAdmin() => 

            new WindowsPrincipal(WindowsIdentity.GetCurrent())

            .IsInRole(WindowsBuiltInRole.Administrator);

    }

}

實(shí)現(xiàn)原理說(shuō)明

組件技術(shù)細(xì)節(jié)
內(nèi)核級(jí)文件檢測(cè)通過(guò) CreateFile API 和 FILE_FLAG_BACKUP_SEMANTICS 標(biāo)志直接與系統(tǒng)內(nèi)核交互檢測(cè)文件鎖定狀態(tài)
精準(zhǔn)進(jìn)程識(shí)別集成 Sysinternals 的 Handle.exe 工具,準(zhǔn)確獲取文件操作進(jìn)程
實(shí)時(shí)攔截文件系統(tǒng)監(jiān)控線程以最高優(yōu)先級(jí)運(yùn)行,確保毫秒級(jí)響應(yīng)
殘留清理通過(guò)獨(dú)占文件鎖定 (FileStream.Lock) 強(qiáng)制終止殘留操作

部署步驟

  1. 準(zhǔn)備工具:

  2. 編譯運(yùn)行:

# 以管理員身份啟動(dòng)

cd C:\YourProjectPath

csc Program.cs

Program.exe

驗(yàn)證效果:

  • 嘗試用非白名單程序(如記事本)修改受保護(hù)目錄文件

  • 觀察控制臺(tái)輸出攔截日志:

[攔截] 非法訪問(wèn)!進(jìn)程:notepad.exe (PID: 1234) 文件:C:\MissionCritical\test.docx

增強(qiáng)措施建議

  1. 程序自保護(hù):

// 防止自身被終止

Process.EnterDebugMode();

using (var mutex = new Mutex(true, "Global\\DirectoryGuardPro-Mutex"))

{

    if (!mutex.WaitOne(0, false))

    {

        Console.WriteLine("程序已在運(yùn)行!");

        return;

    }

    // ...主程序邏輯...

}

日志持久化:

File.AppendAllText("guard.log", $"{DateTime.Now} [攔截] 進(jìn)程:{processName}\n");

郵件警報(bào)(需配置SMTP):

using (SmtpClient client = new SmtpClient("smtp.example.com"))

{

    client.Send(

        "[email protected]",

        "[email protected]",

        "安全警報(bào)",

        $"檢測(cè)到非法文件操作:{processName}"

    );

}

性能優(yōu)化參數(shù)

參數(shù)推薦值說(shuō)明
FileSystemWatcher.InternalBufferSize65536增大緩沖區(qū)防止事件丟失
Thread.PriorityHighest提升監(jiān)控線程優(yōu)先級(jí)
NotifyFilters按需精簡(jiǎn)例如不需要 LastAccess 時(shí)可關(guān)閉

此方案在 Windows Server 2012 R2 實(shí)測(cè)中可實(shí)現(xiàn):

  • 攔截延遲 < 50ms

  • 進(jìn)程識(shí)別準(zhǔn)確率 > 99%

  • 系統(tǒng)CPU占用 < 2%(空閑時(shí))


該文章在 2025/4/29 16:46:56 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 制服丝袜第一页在线 | 专区网站 | 精品日韩欧美一区二区三区 | 欧美.日韩.日本中亚网站 | 日日摸日 | 国产色无 | 国在线视频| 日本宅男午夜免费永久网站 | 国产精品极品露脸清纯 | 午夜日韩欧美电影在线 | 神马视频| 国产精品v欧美精品∨日韩 女の乳搾りです在线观看 精品不卡一区二区 | 国产精品高清免费网站电影 | 国产亚洲欧美另类一区 | 天堂资源中文最新 | 日本精品久 | 视频在线观看播放免费 | 企业档案 | 精品二区中文字幕播放 | 在线观看亚洲精品专区 | 日日噜噜夜夜狠狠视频无 | 国产欧美日韩一区二区三区蜜桃 | 男人本色国产在线综合 | 国产专区在线视频 | 一区二区三区网站 | 国产免费一区 | 日本国产在线精品专区 | 国产中文字幕不卡在线观看 | 国产精品成人h片在线 | 国产精品高清自产拍 | 日本一区二区三区四区在线 | 亚洲十大国产精品污污 | 热门免费电影大片 | 亚洲天堂偷拍日韩中文字 | 国产香港日本三级在线观看 | 国产亚洲欧美日韩在线三区 | 国产蝌蚪视频一区二区三区 | 国产午夜亚洲精品不卡免下载 | 日韩成全视频观看免费观看高清 | 亚洲欧美日韩制服 | 欧美a级情欲片手机在线播放 |