2012-12-05 19 views
17

Widziałem próbki kodu podobnego do następujących wiele razy w moim poszukiwaniu odpowiedzi:Jak wykryć program antywirusowy w systemie Windows Server 2008 w języku C#?

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(); 
    } 

    } 
} 

Niestety, wydaje się, że Windows Server 2008 nie ma nazw SecurityCenter lub SecurityCenter2, więc mogę wyjątek Invalid namespace podczas próby tego podejścia.

Czy ktoś wie, w jaki sposób można sprawdzić, czy oprogramowanie antywirusowe działa w systemie Windows Server 2008? Każda pomoc jest doceniana!

+0

Widziałem ten post, ale naprawdę szukam odpowiedzi na C#. – athom

+15

Niezwiązane, ale nawyku używania 'return instances.Any();' zamiast 'Count> 0' - jeśli' instances' jest bardzo długą listą, licząc wszystkich członków tylko po to, aby zobaczyć, czy są one większe od zera to zły pomysł :) – carlpett

+0

Dzięki za napiwek! Po prostu skopiowałem przykład kodu z [tutaj] (http://stackoverflow.com/questions/1331887/detect-antivirus-on-windows-using-c-sharp), ale będę o tym pamiętał, gdybym kiedykolwiek moje działa! – athom

Odpowiedz

2

I w obliczu tego problemu jakiś czas temu dla klienta, a skończyło się na przeprowadzenie dictonary wyszukiwanie na miejscowych kierowców systemów i procesów szuka wzorca wiedzieć sygnatur antywirusowych (takie jak nazwy folderów, przetwarza nazwy, itd ...) nie jest w 100% pewny, ponieważ gdzieś ktoś dostarczy nowy anty-wirus, którego nie znasz, ale poza tym był bardzo skuteczny ...

+0

Naprawdę miałem nadzieję na łatwiejszą odpowiedź, ale zaczyna brzmieć tak, że to może być jedyny sposób, aby osiągnąć to, co chcę zrobić ... – athom

+0

Wiem, że to brzmi nużąco i "idiotycznie", ale naprawdę spędzam trochę czasu na myśleniu to (ok, może idiotyczne) ... – Leonardo

+0

I nie koniecznie mam na myśli twój konkretny sposób robienia tego, ale ogólną ideę skompilowania listy produktów antywirusowych do sprawdzenia. Szczególnie dlatego, że mój powód, dla którego sprawdzam antywirusa, wydaje się trywialny w porównaniu do wysiłku, jakiego potrzeba, by wymyślić listę programów antywirusowych, które sprawdzą haha. – athom

0

Zgodnie z większością stron internetowych program SecurityCenter i program SecurityCenter2 nie są dostępne w systemie Windows Server 2008 (co już zostało udowodnione dla użytkownika).

Znalazłem ten artykuł, który zawiera obejście tego artykułu. 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++

Wprawdzie jest to implementacja C++, ale nie widzę powodu, że nie może być przeniesione do C#

także znaleźć tę stronę, która sugeruje użycie ramy OESIS. http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c

+3

Jak wskazano w [Technet] (http://social.technet.microsoft.com/Forums/en/ITCG/thread/f0442942-231f-46ff-8207-2c0ef179bad3) implementacja C++, do której odnośnik jest NIE jest dostępna w systemie Windows Server 2008 ... używany interfejs API jest zgodny z MSDN dla "tylko aplikacji desktopowych"! – Yahia

+0

Odpowiedzi/komentarze w łączu również wskazują, że nie działa on w środowiskach systemu operacyjnego serwera. – wjhguitarman

1

To więcej niż idea idealne rozwiązanie. Jeśli chodzi o odpowiedź Leonardo, to co powiesz na użycie prawdziwego oprogramowania antywirusowego (link do niego) w celu wyszukania innego oprogramowania antywirusowego? ClamAV jest open source i miłym punktem do rozpoczęcia. Musisz "tylko" zdefiniować nową, a raczej specyficzną bazę sygnatur.

6

Użyj wirusa testowego EICAR.

  1. Czy aplikacja spróbować napisać jeden z tych plików na dysku: http://www.eicar.org/85-0-Download.html
  2. złapać wyjątek

To nie będzie tylko pracować na każdym antywirusa na ziemi, ale również powiedzieć jeśli aktywny jest antywirus!

Może się okazać, że trudno, aby pobrać plik testowy, jeśli masz antywirusowe aktywny, więc możesz używać tego ciągu Zamiast:

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

pamiętać, prawdopodobnie chcesz zachować ciąg zakodowane w twojej aplikacji i dekodować go tuż przed zapisaniem go na dysk.W przeciwnym razie można zaryzykować swoją aplikację wykrywany jako wirus :)

Na EICAR miejscu, mówią:

Każdy produkt anty-wirus, który obsługuje pliku testowego EICAR powinien wykryć go w dowolnym pliku dostarczanie że plik zaczyna się od następujących 68 znaków i ma długość dokładnie 68 bajtów

jednak nie liczyłbym deweloperzy AV Przeczytałem spec, więc lepiej po prostu zachować ciąg zakodowany. W rzeczywistości próbowałem zapisać ciąg w pliku .txt na moim pulpicie z dodatkowymi znakami, a Windows Defender zaczął krzyczeć.

+0

Jak dokładnie będę mógł stwierdzić, czy antywirus jest aktywny po uruchomieniu pliku testowego? – athom

+0

Nie uruchamiasz pliku testowego. Nie będzie można zapisać pliku. Program antywirusowy uniemożliwi ci to. Więc jeśli spróbujesz napisać plik tekstowy na dysk z powyższym ciągiem w nim, powinieneś dostać wyjątek. Aby dwukrotnie sprawdzić, możesz spróbować odczytać plik. Nie powinno tam być, ponieważ antywirus wykrył i usunął go. Jeśli nie, lepiej sprawdź, czy AV działa poprawnie. –

+0

Skopiowałem powyższy ciąg do pliku tekstowego i zapisałem go w porządku. Tak więc program Symantec Endpoint Protection nie obsługuje tego łańcucha lub nie obejmuje wszystkich. – wjhguitarman

3

Hmmm, skończyło się odtwarzanie z 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" 
} 

Wydaje się działać zarówno na naszym Windows Server 2008 i 2008 R2 przypadkach ...

Więcej informacji tutaj: https://serverfault.com/questions/12343/how-can-i-determine-whether-an-antivirus-product-is-installed

+0

Obecna wersja McAfee na moim komputerze pojawia się jako "McAfee VirusScan Enterprise", więc "-filter" Nazwa taka jak "% virus%" "" może pasować do większej liczby przypadków. –