при извлечении Установленного Антивируса через ManagementObjectSearcher
в случае Защитника Windows путь, возвращаемый через «pathToSignedProductExe», буквально «windowsdefender: //», как я могу перевести это на фактический путь?
Я пробовал System.Environment.ExpandEnvironmentVariables
, Path.GetFullPath
или CD в CMD, и ничто не распознает это.
В случае «Microsoft Forefront Endpoint Protection» (Microsoft Security Client) возвращаемый путь - «C: \ Program Files \ Microsoft Security Client \ msseces.exe» и может быть легко использован.
Мой пример тестового кода (требуется установка Защитника Windows):
[TestClass]
public class AntiVirusExampleClass
{
[TestMethod]
public void GetAntiVirusPath()
{
var av = GetAntiVirusExe("Windows Defender");
Assert.AreEqual(true, !string.IsNullOrEmpty(av), "Windows Defender not found");
}
public string GetAntiVirusExe(string avName)
{
string path = null;
// Microsoft Security Client
// SELECT * FROM AntiVirusProduct
// SELECT * FROM FirewallProduct
// SELECT * FROM AntiSpywareProduct
// We are searching for Antivirus Product in Security Center (C:\Windows\System32\wbem\wscenter.mof)
using (var wmiData = new ManagementObjectSearcher(@"root\SecurityCenter2", "Select * from AntivirusProduct"))
{
ManagementObjectCollection getSearchResult = wmiData.Get();
if (getSearchResult.Count > 0)
{
foreach (ManagementObject virusChecker in getSearchResult)
{
var antivirusName = virusChecker["displayName"] as string;
var pathToSignedProductExe = virusChecker["pathToSignedProductExe"] as string;
pathToSignedProductExe = System.Environment.ExpandEnvironmentVariables(pathToSignedProductExe);
if(!Path.IsPathRooted(pathToSignedProductExe))
pathToSignedProductExe = Path.GetFullPath(pathToSignedProductExe);
//Path here should be "C:\Program Files\Windows Defender"? :(
if (pathToSignedProductExe != null && pathToSignedProductExe.Contains(avName))
{
path = pathToSignedProductExe;
break;
}
}
}
}
return path;
}
}