2012-12-05 16 views
17

ho visto esempi di codice simili ai seguenti numerose volte nella mia ricerca di una risposta:Come rilevare l'antivirus su Windows Server 2008 in 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(); 
    } 

    } 
} 

Purtroppo, sembra che Windows Server 2008 non ha lo spazio dei nomi SecurityCenter o SecurityCenter2, così ho ottenere un'eccezione Invalid namespace quando provi questo approccio.

Qualcuno conosce un modo per determinare se è in esecuzione un software antivirus su Windows Server 2008? Qualsiasi aiuto è apprezzato!

+0

Ho visto quel post, ma sono davvero alla ricerca di una risposta specifica per C#. – athom

+15

Non correlati, ma abituati a usare 'return instance.Any();' invece di 'Count> 0' - se' instances' è una lista molto lunga, contando tutti i membri solo per vedere se sono più di zero è una cattiva idea :) – carlpett

+0

Grazie per il suggerimento! Ho semplicemente copiato l'esempio di codice da [qui] (http://stackoverflow.com/questions/1331887/detect-antivirus-on-windows-using-c-sharp), ma terrò questo a mente se mai dovessi il mio lavoro! – athom

risposta

2

Ho affrontato questo problema qualche tempo fa per un cliente e ho finito per eseguire una ricerca dictonary sui driver di sistema locale e ai processi alla ricerca di un modello di conoscere le firme anti-virus (come ad esempio i nomi delle cartelle, processi nomi, ecc ...) non è sicuro al 100% perché da qualche parte qualcuno scaricherà un nuovo anti-virus che non conosci, ma a parte questo è stato molto efficace ...

+0

Speravo davvero in una risposta più semplice, ma sta cominciando a sembrare che questo potrebbe essere l'unico modo per realizzare ciò che voglio fare ... – athom

+0

so che questo suona noioso e "idiota", ma io davvero spendo un po 'di tempo a pensare questo fuori (ok, forse sono un idiota) ... – Leonardo

+0

E non so nemmeno necessariamente che il modo specifico di farlo, ma l'idea generale di compilare un elenco dei prodotti antivirus per verificare la presenza. Soprattutto perché il mio motivo per il controllo di un antivirus sembra un po 'banale in confronto alla quantità di sforzo che ci vorrà per trovare un elenco di antivirus da verificare per haha ​​ – athom

0

In base alla maggior parte del Web, SecurityCenter e SecurityCenter2 non sono disponibili su Windows Server 2008 (come avete già elaborato personalmente).

Ho trovato questo articolo SO, che contiene una soluzione alternativa. 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++

Certo, questa è un'implementazione C++, ma non vedo alcuna ragione per cui non può essere portato su C#

Anche trovato questa pagina che suggerisce di utilizzare il quadro OESIS. http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/b0806608-fee0-413c-a34d-674aeb11be3c

+3

Come indicato su [Technet] (http://social.technet.microsoft.com/Forums/en/ITCG/thread/f0442942-231f-46ff-8207-2c0ef179bad3) l'implementazione C++ a cui si fa il collegamento NON è disponibile su Windows Server 2008 ... l'API usata è secondo MSDN per "solo applicazioni desktop"! – Yahia

+0

Anche le risposte/commenti nel collegamento indicano che non funziona sugli ambienti SO Server. – wjhguitarman

1

Questa è un'idea più che una soluzione perfetta. Per quanto riguarda la risposta di Leonardo, che ne dici di utilizzare un vero e proprio software anti-virus (link contro di esso) per eseguire una ricerca di altro software anti-virus? ClamAV è opensource e un buon punto di partenza. Devi solo "definire" un nuovo database delle firme piuttosto specifico.

6

Utilizzare il virus di test EICAR.

  1. avere la vostra applicazione provare a scrivere uno di questi file sul disco: http://www.eicar.org/85-0-Download.html
  2. intercettare l'eccezione

E non solo lavorare su ogni antivirus sulla terra, ma sarà anche dire tu se l'anti-virus è attivo!

Si possono trovare difficoltà a scaricare il file di test se si dispone di anti-virus attivo, quindi si consiglia di utilizzare questa stringa invece:

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

tenere a mente, che probabilmente vuole mantenere la stringa codificato sulla tua app e decodificarlo appena prima di scriverlo su disco.In caso contrario, si può rischiare la vostra applicazione viene rilevato come un virus :)

Sul sito EICAR, dicono:

Qualsiasi prodotto antivirus che supporta il file di test EICAR dovrebbe rilevare in qualsiasi tipo di file che fornisce che il file inizia con i seguenti 68 caratteri, ed è esattamente lungo 68 byte

Comunque, io non ci conterei sviluppatori AV hanno letto le specifiche, quindi meglio tenere solo la stringa codificata. In effetti, ho appena provato a salvare la stringa su un file .txt sul desktop con alcuni caratteri aggiuntivi e Windows Defender ha iniziato a urlare.

+0

In che modo riuscirò a capire se l'anti-virus è attivo dopo aver eseguito il file di test? – athom

+0

Non si esegue il file di test. Non sarai in grado di salvare il file. L'anti-virus ti impedirà di farlo. Quindi se provi a scrivere un file di testo sul disco con la stringa sopra citata, dovresti ottenere un'eccezione. Per ricontrollare, puoi provare a leggere il file. Non dovrebbe essere lì perché l'anti-virus ha rilevato e rimosso. In caso contrario, è meglio controllare se l'AV funziona correttamente. –

+0

Ho copiato la stringa sopra in un file di testo e l'ho salvata bene. Pertanto, Symantec Endpoint Protection non tratta questa stringa, o non è completa. – wjhguitarman

3

Hmmm, ho finito per giocare con 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" 
} 

Sembra di essere al lavoro sia sul nostro Windows Server 2008 e 2008 R2 casi ...

Maggiori informazioni qui: https://serverfault.com/questions/12343/how-can-i-determine-whether-an-antivirus-product-is-installed

+0

La versione corrente di McAfee sulla mia macchina si presenta come "McAfee VirusScan Enterprise", quindi il nome "-filter" come "% virus%" "" potrebbe corrispondere a più casi. –