Windows Defender磁盘扫描会占用系统的大量性能。有没有办法让C#应用程序找出磁盘扫描当前是否正在运行?
发布于 2015-07-09 09:08:33
您可以检查MsMpEng.exe (反恶意软件服务可执行文件)当前正在生成的处理器负载。在我的电脑上,它以50%的CPU运行(一个CPU核心被完全占用),同时观察安装情况。
它阻止EXE或DLL文件,我的安装程序写入磁盘的时间长达25秒!(显然,安装程序挂起了。)
请注意,在控制面板中完全关闭WindowsDefender后,MsMpEng.exe仍在运行。因此,仅仅检查服务是否正在运行是不够的。您必须检查其当前的CPU负载。
Windows Defender扫描每个可执行文件和动态链接库文件,当你启动一个应用程序时,每次重新-尽管它已经扫描了所有这些文件,当应用程序已经安装!所以每次你启动一个应用程序时,你会有一个巨大的延迟:你的应用程序加载的DLL文件越多,速度就越慢。
特别是当你的应用程序使用像Themida或WinLicense这样的反盗版保护时,Windows Defender需要极长的时间来检查这些文件。
Windows Defender扫描每个可执行文件(EXE,DLL),当您的应用程序只打开文件而没有从文件中读取或写入一个字节时,这会导致CreateFile()延迟长达25秒!
很明显,微软不具备编写快速高效的反恶意软件的知识。(我从未见过任何杀毒软件运行25秒来扫描单个文件!)建议安装另一个防病毒程序,这将导致Windows Defender被自动禁用。
当用户打开/关闭Windows Defender时,以下注册表项会更改:
Windows 8关闭:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdBoot
"Group"= "_Early-Launch"
"Start"= 3 // SERVICE_DEMAND_START
"ImagePath"= "\SystemRoot\system32\drivers\WdBoot.sys"Windows 8 On:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WdBoot
"Group"= "Early-Launch"
"Start"= 0 // SERVICE_BOOT_START
"ImagePath"= "system32\drivers\WdBoot.sys"请注意,当您检查WdBoot服务的状态时,它通常不会运行,即使它已启用。它似乎只在启动Windows(?)时运行。
Windows 7、Windows 8和Windows 10关闭:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Real-Time Protection
"DisableRealtimeMonitoring"=1Windows 7、Windows 8和Windows 10:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Real-Time Protection
"DisableRealtimeMonitoring"=0
// or the entry does not exist管理员用户无法更改此密钥。写入权限仅授予用户SYSTEM和组WinDefend和TrustedInstaller。
从Windows10开始,不再可以从以"System/NT AUTHORITY“用户(拒绝->访问)运行的服务中写入此值。Microsoft可能会检查尝试写入此值的应用程序的数字签名。
而在Windows10上真正让吸的是,你可以关闭Windows Defender,重新启动电脑,然后它就会重新启用!
还有一个影响Windows Defender的密钥(默认情况下不存在,但可以作为普通管理员创建):
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows Defender
"DisableAntiSpyware" = 1此密钥的作用是,您单击控制面板中的"Windows Defender“,您将看到一个消息框,告诉您:”此应用程序已被组策略关闭……要允许此应用程序运行,请联系您的安全管理员,通过组策略启用此程序。“
请注意,此键不关闭 Windows Defender。它只禁止用户打开Windows Defender配置面板(MsAscUi.exe)。
发布于 2009-05-14 11:29:27
使用Internet Explorer的示例:
Process[] ProcInfo = System.Diagnostics.Process.GetProcessesByName("iexplore");https://stackoverflow.com/questions/862776
复制相似问题