Есть ли способ определить, установлено ли на компьютере антивирусное программное обеспечение, использующее C #? Я знаю, что Центр безопасности обнаруживает антивирусное программное обеспечение, но как вы можете обнаружить это на C #?
Обнаружение антивируса в Windows с помощью C #
Ответы (3)
Согласно Microsoft, Центр безопасности Windows использует двухуровневый подход к определению статуса обнаружения. Один уровень является ручным, а другой - автоматическим с помощью инструментария управления Windows (WMI). В ручном режиме обнаружения Центр обеспечения безопасности Windows выполняет поиск ключей и файлов реестра, предоставленных Microsoft независимыми производителями программного обеспечения. Эти ключи и файлы реестра позволяют Центру обеспечения безопасности Windows определять статус независимого программного обеспечения. В режиме WMI производители программного обеспечения определяют статус своего продукта и сообщают об этом статусе в Центр обеспечения безопасности Windows через поставщика WMI. В обоих режимах Центр обеспечения безопасности Windows пытается определить, верно ли следующее:
Антивирусная программа присутствует.
Сигнатуры антивируса актуальны.
Для антивирусных программ включено сканирование в реальном времени или сканирование при доступе.
Для брандмауэров Центр обеспечения безопасности Windows определяет, установлен ли брандмауэр стороннего производителя и включен ли брандмауэр.
Таким образом, чтобы определить наличие антивирусного программного обеспечения, вы можете использовать WMI, устанавливая соединение с пространством имен root\SecurityCenter
(начиная с Windows Vista, вы должны использовать пространство имен root\SecurityCenter2
), а затем запрашивать класс AntiVirusProduct
WMI.
Взгляните на этот образец кода
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();
}
}
}
\root\SecurityCenter2
- person RRUZ; 07.02.2011
... I ended up performing a dictonary search on the local system drivers and processes looking for a pattern of know anti-virus signatures (such as folder names, processes names, etc...)
- person RRUZ; 26.06.2013
Откройте C:\Windows\System32\wbem\wscenter.mof
в Блокноте. Он поможет вам, какие пространства имен и классы существуют:
Запрос C #:
// SELECT * FROM AntiVirusProduct
// SELECT * FROM FirewallProduct
// SELECT * FROM AntiSpywareProduct
ManagementObjectSearcher wmiData = new ManagementObjectSearcher(@"root\SecurityCenter2", "SELECT * FROM AntiVirusProduct");
ManagementObjectCollection data = wmiData.Get();
foreach (ManagementObject virusChecker in data)
{
var virusCheckerName = virusChecker["displayName"];
}
wscenter.mof:
#pragma autorecover
#pragma classflags(64)
#pragma namespace("\\\\.\\root")
[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")]
Instance of __namespace
{
Name = "SecurityCenter";
};
[NamespaceSecuritySDDL("O:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464G:S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464D:(A;CI;0x1;;;BU)(A;CI;0x1;;;BA)(A;CI;0x1;;;NS)(A;CI;0x1;;;LS)(A;CI;0x1;;;AU)(A;CI;0x6001D;;;S-1-5-80-3232712927-1625117661-2590453128-1738570065-3637376297)")]
Instance of __namespace
{
Name = "SecurityCenter2";
};
#pragma namespace("\\\\.\\root\\SecurityCenter")
class AntiVirusProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
[Not_Null] boolean productUptoDate;
boolean onAccessScanningEnabled;
boolean productHasNotifiedUser;
boolean productWantsWscNotifications;
uint8 productState;
string companyName;
string versionNumber;
string pathToSignedProductExe;
};
class FirewallProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
boolean enabled;
boolean productHasNotifiedUser;
boolean productWantsWscNotifications;
uint8 productState;
string companyName;
string versionNumber;
string pathToSignedProductExe;
};
class AntiSpywareProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
[Not_Null] boolean productUptoDate;
boolean productEnabled;
boolean productHasNotifiedUser;
boolean productWantsWscNotifications;
uint8 productState;
string companyName;
string versionNumber;
string pathToSignedProductExe;
};
#pragma namespace("\\\\.\\root\\SecurityCenter2")
class AntiVirusProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
[Not_Null] string pathToSignedProductExe;
[Not_Null] string pathToSignedReportingExe;
[Not_Null] uint32 productState;
string timestamp;
};
class FirewallProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
[Not_Null] string pathToSignedProductExe;
[Not_Null] string pathToSignedReportingExe;
[Not_Null] uint32 productState;
string timestamp;
};
class AntiSpywareProduct
{
[key,Not_Null] string instanceGuid;
[Not_Null] string displayName;
[Not_Null] string pathToSignedProductExe;
[Not_Null] string pathToSignedReportingExe;
[Not_Null] uint32 productState;
string timestamp;
};
#pragma autorecover
Запрос WMI немного изменился в Vista SP2 и более поздних версиях.
Попробуйте эту часть \ root \ SecurityCenter2 вместо \ root \ SecurityCenter
Результаты тоже немного отличаются. Вы по-прежнему можете получить отображаемое имя, но вам нужно будет немного скрыть бит для поля ProductState, чтобы определить, включен / отключен onAccessScanner и тип информации upToDate.