2009-09-22 8 views
5

Mam aplikację i próbuję upewnić się, że działa w bezpiecznym środowisku. Przede wszystkim sprawdzam, czy jest to Windows is genuine, co zwiększa prawdopodobieństwo, że użytkownik będzie je aktualizował. Jeśli nie, po prostu pojawia się komunikat ostrzegający użytkownika, że ​​istnieje potencjalne ryzyko, ponieważ nadal musi zweryfikować system Windows.Jak wykryć, czy zainstalowany jest wirus wirusowy i/lub zapora sieciowa? (I kilka innych Q związanych z bezpieczeństwem.)

Teraz chcę zrobić jeszcze więcej. Chcę również sprawdzić, czy użytkownik zainstalował wirusscanner. Nie obchodzi mnie, który z nich, o ile go zainstalował. To samo dotyczy sprawdzania, czy firewall jest zainstalowany. Jeśli to możliwe, chcę sprawdzić, kiedy użytkownik zaktualizował swój system Windows/skaner/zaporę po raz ostatni, aby upewnić się, że nie jest zbyt stary. A więc:

1) Jak mogę sprawdzić, czy zainstalowany jest wirus-skaner?
2) Jak ustalić, kiedy wirus został zaktualizowany?
3) Jak wykryć, kiedy wirus wirusowy wykonał ostatnią kontrolę całego systemu?
4) Jak wykryć, czy zapora jest zainstalowana i czy jest aktywna?
5) Jak sprawdzić, czy system Windows otrzymał najnowszą aktualizację?

Zasadniczo, gdy moja aplikacja się uruchamia, chcę wyświetlić ekran z ostrzeżeniami (tylko raz dziennie), na wypadek gdyby któraś z tych rzeczy miała problem. To dlatego, że moja aplikacja działa z wszystkimi rodzajami poufnych informacji, które użytkownik zbiera od swoich klientów. (Który zawiera numery kont bankowych, numery identyfikacyjne paszportów, NAW + DOB, dochody i wiele więcej.) Zasadniczo, jeśli system ma problem, użytkownik musi potwierdzić, że jest świadomy tych problemów. Odracza możliwą odpowiedzialność z mojej aplikacji, jeśli nadal będzie wiedział, że jego system jest prawdopodobnie niepewny ...


A język? Zasadniczo C++ lub Delphi dla przykładów WIN32 i C# dla przykładów .NET. Chodzi raczej o .NET/Windows API/.NET niż język.

Odpowiedz

7

myślę, że można zrobić większość tego poprzez WMI

coś takiego:

ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter", "SELECT * FROM AntiVirusProduct"); 
ManagementObjectCollection data = wmiData.Get(); 

foreach (ManagementObject virusChecker in data) 
{ 
    // This is the virus checkers name. 
    String virusCheckerName = virusChecker["displayName"]; 
} 

[Nie wspominając co język, więc próbka powyżej jest w C#, ale WMI może Zrobić z prawie wszystko]

[Edytuj: Możesz zrobić to samo, ale z "FirewallProduct" zamiast dla informacji zapory. Ponadto w przypadku antywirusa można sprawdzić właściwość "productUptoDate" w wynikach, aby uzyskać informacje na temat aktualności.

Numer WMI reference powinien pomóc w znalezieniu innych. (1, 2, 3 i 4 Jestem prawie pewny, że są dostępne przez WMI.) 5 Nie jestem tego pewien, ale myślę, że prawdopodobnie tak będzie)

Będziesz prawdopodobnie znaleźć WMI Code Creator pomocne w testowaniu i ustalenie, jakich kwerend/obiektów należy użyć. Użyteczne mogą być również Scriptomatic i WMI Admin tools.

+0

C# jest w porządku, chociaż język nie ma znaczenia. Liczy się połączenie API/.NET. –

+0

Fajnie, mam nadzieję, że to pomogło. Twoje pytanie jest nieco trudne, ponieważ ma tak wiele części. Gdy już trochę zgłębisz WMI, jeśli nadal utkniesz na jednym z nich, opublikuj nowe pytanie i skup się na jednym punkcie. Miejmy nadzieję, że dostaniesz kogoś, kto dokładnie wie, gdzie szukać tych danych. Nie znam WMI bardzo dobrze poza podstawowym poziomem. –

3

Ponieważ szukałem C++, a nie zależnego od platformy .NET, pomieszałem tę odpowiedź z MSDN example: Getting WMI Data from the Local Computer.

Te, które powinny zostać zmienione w celu uzyskania nazwy AV polecenia są:

  • _bstr_t(L"ROOT\\CIMV2") do _bstr_t(L"ROOT\\SecurityCenter2"). Należy pamiętać, że program SecurityCenter2 jest przeznaczony dla systemów Win 7, Vista SP2 i innych, zgodnie z this.Poniżej Vista SP2, musisz użyć SecurityCenter.
  • bstr_t("SELECT * FROM Win32_OperatingSystem") do bstr_t("SELECT * FROM AntivirusProduct")
  • hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); do hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);.

Ten zmieniony kod został sprawdzony i w pełni działa.

Aby uzyskać prostszą metodę, możesz zawsze wykonać iterację ponad this algorithm i wyszukać swój AV według nazwy.

Powiązane problemy