System.Management.ManagementException "Access Denied" with Win32_ProcessStartTrace



我有一段代码来处理启动或停止特定进程的场景,为了实现这一点,我使用了managenteventwatcher。

       string queryStart = "SELECT * FROM Win32_ProcessStartTrace" +
                     " WHERE ProcessName LIKE '...'"; // WHERE clause includes all the processnames that I want to monitor 
       ManagementEventWatcher startWatch = new ManagementEventWatcher(
            new WqlEventQuery(queryStart));
        startWatch.EventArrived += new EventArrivedEventHandler(ProcessNewInstanceWhenCreated);
        startWatch.Start();

这段代码在我的机器上工作得很好,但是当我将它部署到其中一个服务器时,它抛出"Access denied"异常。在服务器上运行这个的用户没有管理员权限,因此我添加了这个用户,在这个链接中解释- http://world.episerver.com/faq/Items/SystemManagementManagementException-Access-denied/

这似乎不能解决问题。我是否必须执行任何其他操作才能使其在服务器上工作?

我添加了一个管理范围管理的teventhandler以及,但仍然没有帮助的原因。

       string scopeString = "\\" + System.Environment.MachineName + "\root\CIMV2";
        ManagementScope theScope = new ManagementScope(scopeString);
        ManagementEventWatcher startWatch = new ManagementEventWatcher(theScope,
            new WqlEventQuery(queryStart));

感谢您的宝贵时间和帮助

使用以下查询,我成功地获得了具有进程名和id的事件,而没有管理员权限:

string queryString = "SELECT * FROM __InstanceCreationEvent WITHIN .025 WHERE TargetInstance ISA 'Win32_Process'";
processWatcher = new ManagementEventWatcher(@"\.rootCIMV2", queryString);
processWatcher.EventArrived += ProcessStartHandler;
processWatcher.Start();

与您使用的查询不同,收到的事件没有填充其大部分属性。

但是,它们可以通过事件的TargetInstance属性访问。

private void ProcessStartHandler(object sender, EventArrivedEventArgs e)
{
    var targetInstance = ((System.Management.ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value);
    var processName = targetInstance.Properties["Caption"].Value.ToString();
    var processId   = (uint)targetInstance.Properties["ProcessId"].Value;
    var parentProcessId = (uint)targetInstance.Properties["ParentProcessId"].Value;
}

相关内容

  • 没有找到相关文章

最新更新