.Net事件不在Visual Studio调试器之外触发

时间:2015-04-10 12:18:42

标签: c# winforms visual-studio events wmi

我有一个应用程序,其中一项功能是检查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;
        }

消息显示如下: Out put Example 并且Properties.Settings.Default.AntiVirusEnabled设置为布尔值running

当鼠标移动到应用程序的顶部时,会显示一个窗口,显示各种设置;将Properties.Settings.Default.AntiVirusEnabled值分配给Checkbox.Checked属性的位置。因此,如果AV正在运行,则会检查Checkbox

Checkbox Checked

在VS2013中一切正常。但是,当我将其作为ClickOnce应用程序发布并在虚拟机(Hyper-V)上运行时,该程序不会引发AVStatus事件或更新Checkbox,如下所示:

Not Functioning Event Not Checked Checkbox

Anti-Virus正在两台虚拟机上运行。

所以问题是:

为什么代码在Visual Studio中的虚拟机上正常工作,而在没有Visual Studio的虚拟机上却不能正常工作?

开发VM = Win 8.1 Enterprise x64 测试VM = Win 8.1 Professional x64 Visual Studio 2013 Ultimate。

1 个答案:

答案 0 :(得分:1)

仅在找到至少一个ManagementObject时才会触发事件AVStatus。我猜想有一个正确的问题。尝试扩展日志记录并记录找到的ManagementObject的数量(例如,服务器上没有使用AVLog?)。