我有一个应用程序,其中一项功能是检查Anti-Virus是否正在使用WMI运行。
class AntiVirus
{
public delegate void AVStatusHandler(bool running);
public event AVStatusHandler AVStatus;
public delegate void AVStatusErrorHandler(string Error);
public event AVStatusErrorHandler AVStatusError;
public delegate void AVLogHandler(string Message);
public event AVLogHandler AVLog;
internal void GetAVStatus()
{
if (AVLog != null) AVLog("Getting AV Status");
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\Microsoft\\protectionManagement",
"SELECT * FROM MSFT_MpComputerStatus");
foreach (ManagementObject queryObj in searcher.Get())
{
if (AVStatus != null)
{
// AVStatus("Anti-Spyware Enabled", (bool)queryObj["AntispywareEnabled"]);
AVStatus((bool)queryObj["AntivirusEnabled"]);
// AVStatus("Behavior Monitor Enabled", (bool)queryObj["BehaviorMonitorEnabled"]);
// AVStatus("Ioav Protection Enabled", (bool)queryObj["IoavProtectionEnabled"]);
// AVStatus("NIS Enabled", (bool)queryObj["NISEnabled"]);
// AVStatus("Real Time Protection Enabled", (bool)queryObj["RealTimeProtectionEnabled"]);
}
}
if (AVLog != null) AVLog("Getting AV Status - Completed");
}
catch (ManagementException e)
{
if (AVLog != null) AVLog("Getting AV Status - Failed");
if (AVStatusError != null)
AVStatusError("An error occurred while querying for WMI data: " + e.Message);
}
}
}
它会在调用主窗体(AVStatus
)
frmMain
事件
private void GetAvDetails()
{
av.AVStatus += av_AVStatus;
av.GetAVStatus();
}
void av_AVStatus(bool running)
{
SetRichTextBoxText(rtbConOut, "Av Status = " + running.ToString());
Properties.Settings.Default.AntiVirusEnabled = running;
}
消息显示如下:
并且Properties.Settings.Default.AntiVirusEnabled
设置为布尔值running
。
当鼠标移动到应用程序的顶部时,会显示一个窗口,显示各种设置;将Properties.Settings.Default.AntiVirusEnabled
值分配给Checkbox.Checked
属性的位置。因此,如果AV正在运行,则会检查Checkbox
。
在VS2013中一切正常。但是,当我将其作为ClickOnce应用程序发布并在虚拟机(Hyper-V)上运行时,该程序不会引发AVStatus
事件或更新Checkbox
,如下所示:
Anti-Virus正在两台虚拟机上运行。
所以问题是:
为什么代码在Visual Studio中的虚拟机上正常工作,而在没有Visual Studio的虚拟机上却不能正常工作?
开发VM = Win 8.1 Enterprise x64 测试VM = Win 8.1 Professional x64 Visual Studio 2013 Ultimate。
答案 0 :(得分:1)
仅在找到至少一个ManagementObject时才会触发事件AVStatus。我猜想有一个正确的问题。尝试扩展日志记录并记录找到的ManagementObject的数量(例如,服务器上没有使用AVLog?)。