我有一段代码来处理启动或停止特定进程的场景,为了实现这一点,我使用了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;
}