我的代码需要确定特定进程的运行时间。但它继续失败,并在Process.StartTime
请求上显示拒绝访问错误消息。这是一个使用用户凭据运行的进程(即,不是高权限进程)。显然有一个安全设置或策略设置,或某些东西我需要扭转以解决这个问题,因为我无法相信StartTime属性只是在框架中,因此它可以100%失败当时。
Google搜索表明我可以通过将运行查询代码的凭据添加到“性能日志用户”组来解决此问题。但是,此计算机上不存在此类用户组。
答案 0 :(得分:3)
我读过类似于你过去所说的内容,Lars。不幸的是,我对使用该机器所能做的事情有所限制(换句话说,我不能毫不犹豫地创建用户组:它是一台服务器,而不仅仅是一些随机PC)。
感谢Will和Lars的回答。不幸的是,他们没有解决我的问题。
最终的解决方案是使用WMI:
using System.Management;
String queryString = "select CreationDate from Win32_Process where ProcessId='" + ProcessId + "'";
SelectQuery query = new SelectQuery(queryString);
ManagementScope scope = new System.Management.ManagementScope(@"\\.\root\CIMV2");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection processes = searcher.Get();
//... snip ... logic to figure out which of the processes in the collection is the right one goes here
DateTime startTime = ManagementDateTimeConverter.ToDateTime(processes[0]["CreationDate"].ToString());
TimeSpan uptime = DateTime.Now.Subtract(startTime);
部分内容是从代码项目中删除的:
http://www.codeproject.com/KB/system/win32processusingwmi.aspx
和“嘿,脚本专家!”:
http://www.microsoft.com/technet/scriptcenter/resources/qanda/jul05/hey0720.mspx
答案 1 :(得分:2)
.Net 1.1的过程使用性能计数器来获取信息。它们被禁用或用户没有管理权限。确保性能计数器已启用且用户是管理员应该可以使您的代码正常工作。
实际上“性能计数器用户组”应该足够了。该组默认不存在。所以你应该自己创建它。
.Net 2.0的过程不依赖于性能计数器。
请参阅http://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspx
答案 2 :(得分:1)
底层代码需要能够调用OpenProcess,您可能需要SeDebugPrivilege。
您正在以自己的进程作为不同用户运行StartTime请求的进程吗?
答案 3 :(得分:0)
好的,抱歉没有用...我不是ASP.NET模拟的专家,我倾向于使用我认为你无法在W2K上做的应用程序池你是否尝试过编写一个小小的测试应用程序它执行相同的查询,然后作为各种用户运行?
我不愿意在这里发布一大块MS框架代码,但您可以使用Reflector或者:http://www.codeplex.com/NetMassDownloader来获取框架相关位的源代码,以便您可以尝试实现各种位看它失败的地方。
在没有拒绝访问的情况下,您是否可以获得有关该流程的任何其他信息?
答案 4 :(得分:0)
我可以枚举该过程(即GetProcessById函数有效),我们还有其他代码可以获取EXE名称和其他信息。
我会试试测试应用程序。如果我不能让C#实现在短时间内正常工作,我也会尝试使用WMI来获取这些信息(这不是关键功能,所以我不能花太多时间)。