2012-12-05 102 views
17

我看到類似下面的無數次的代碼樣本中我尋找一個答案:如何在C#中檢測Windows Server 2008上的防病毒?

using System; 
using System.Text; 
using System.Management; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    public static bool AntivirusInstalled() 
    { 

     string wmipathstr = @"\\" + Environment.MachineName + @"\root\SecurityCenter"; 
     try 
     { 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmipathstr, "SELECT * FROM AntivirusProduct"); 
     ManagementObjectCollection instances = searcher.Get(); 
     return instances.Count > 0; 
     } 

     catch (Exception e) 
     { 
     Console.WriteLine(e.Message); 
     } 

     return false; 
    } 

    public static void Main(string[] args) 
    { 
     bool returnCode = AntivirusInstalled(); 
     Console.WriteLine("Antivirus Installed " + returnCode.ToString()); 
     Console.WriteLine(); 
     Console.Read(); 
    } 

    } 
} 

不幸的是,它似乎在Windows Server 2008不具備SecurityCenterSecurityCenter2命名空間,所以我得到一個Invalid namespace例外當嘗試這種方法。

有誰知道一種方法來確定是否有在Windows Server 2008上運行的防病毒軟件?任何幫助表示讚賞!

+0

我看過那篇文章,但我確實在尋找C#特定的答案。 – athom

+15

不相關,但習慣於使用'returns instances.Any();'而不是'Count> 0' - 如果'instances'是一個非常長的列表,只計算所有成員以查看它們是否大於零是一個壞主意:) – carlpett

+0

感謝您的提示!我只是從[這裏]複製代碼示例(http://stackoverflow.com/questions/1331887/detect-antivirus-on-windows-using-c-sharp),但我會記住這一點,如果我得到我的工作! – athom

回答

2

我面對這個問題,前一段時間的客戶和我結束了表演上的本地系統驅動程序dictonary搜索和工藝尋找知道防病毒簽名(如文件夾名稱的圖案,工藝名稱,等等......)它不是100%確定的,因爲某處有人會裝入一個你不知道的全新的防病毒軟件,但除此之外,它非常有效......

+0

我真的很希望有一個更容易的答案,但它開始聽起來像這可能是唯一的方法來完成我想要做的事情... – athom

+0

我知道這聽起來很乏味和「白癡」,但我真的花了一些時間思考這個(好吧,也許是非常愚蠢的)... – Leonardo

+0

而且我甚至不一定指您的具體做法,而是編寫要檢查的防病毒產品列表的一般想法。特別是因爲我檢查一個殺毒軟件的原因似乎有點微不足道的工作量將需要拿出一個防病毒列表來檢查哈哈 – athom

0

根據大多數網絡,SecurityCenter和SecurityCenter2在Windows Server 2008上不可用(正如您已經爲自己設計的那樣)。

我發現這個SO文章,其中包含一個解決方法。 How to detect antivirus installed on windows 2003 server and 2008 server 2003 server R2and 2008 server R2 using WMI or other then WMI in C++

誠然,這是一個C++實現,但我看不出有任何理由認爲它不能被移植到C#

也發現了這個網頁,其中建議使用OESIS框架。 http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c

+3

正如[Technet]上指出的(http://social.technet.microsoft.com/Forums/en/ITCG/thread/f0442942-231f-46ff-8207-2c0ef179bad3),您鏈接到的C++實現在Windows上不可用Server 2008 ...使用的API是根據MSDN的「僅適用於桌面應用程序」! – Yahia

+0

鏈接中的答案/評論還指出,它不適用於服務器操作系統環境。 – wjhguitarman

1

這比想法更多完美的解決方案。關於萊昂納多的回答,如何使用實際的反病毒軟件(鏈接反對它)來執行其他反病毒軟件的搜索? ClamAV是開源的,也是一個很好的開始。你「只」需要定義一個新的而且相當具體的簽名數據庫。

6

使用EICAR測試病毒。

  1. 讓應用程序嘗試寫入磁盤上的這些文件中的一個:http://www.eicar.org/85-0-Download.html
  2. 捕獲異常

它不僅在地球上的每個反病毒工作,但它也將告訴你如果反病毒是活躍的!

您可能會發現很難下載測試文件,如果你有抗病毒活性,所以你可能想用這個字符串,而不是:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 

請記住,你可能想保留字符串編碼到您的應用程序並在將其寫入磁盤之前對其進行解碼。否則,你可能會被檢測爲病毒:)

在EICAR現場風險您的應用程序,他們說:

任何支持EICAR測試文件的反病毒產品應該檢測 它在任何文件中提供該文件有以下68個 字符開頭,並且是完全68個字節長

不過,我不會指望AV開發商已經閱讀該規範,所以最好只保留編碼字符串。實際上,我只是試圖將字符串保存在桌面上的.txt文件中,並在其中添加了一些字符,並且Windows Defender開始尖叫。

+0

運行測試文件後,我究竟能夠確定防病毒是否處於活動狀態? – athom

+0

您不運行測試文件。您將無法保存該文件。防病毒會阻止你這樣做。因此,如果您嘗試使用上述字符串將文本文件寫入磁盤,則應該會發生異常。要仔細檢查,您可以嘗試閱讀文件。它不應該在那裏,因爲反病毒檢測到並刪除它。如果沒有,請更好地檢查AV是否正常工作。 –

+0

我將上面的字符串複製到一個文本文件中並保存起來很好。因此,Symantec Endpoint Protection不會處理該字符串,或者它並非全部包含在內。 – wjhguitarman

3

嗯,我結束了使用PowerShell玩弄:

$avSoftware = get-wmiobject -class "Win32_Product" -namespace "root\cimv2" -computername "." -filter "Name like '%antivirus%'" 
if ($avSoftware.Count -gt 0) { 
    foreach ($av in $avSoftware) { 
     write-host $p.Name 
    } 
} else { 
    write-host "No AV software found" 
} 

看來我們的Windows Server 2008和2008 R2實例上進行的工作都...

此處瞭解詳情:https://serverfault.com/questions/12343/how-can-i-determine-whether-an-antivirus-product-is-installed

+0

當前版本的McAfee在我的計算機上顯示爲「McAfee VirusScan Enterprise」,因此'-filter「名稱(如」%virus%「)可能會匹配更多的案例。 –