Process.StartTime 访问被拒绝
Posted
技术标签:
【中文标题】Process.StartTime 访问被拒绝【英文标题】:Process.StartTime Access Denied 【发布时间】:2010-09-06 22:06:59 【问题描述】:我的代码需要确定特定进程已经运行了多长时间。但它继续失败,并在Process.StartTime
请求上显示拒绝访问错误消息。这是一个使用用户凭据运行的进程(即,不是高权限进程)。显然有一个安全设置或策略设置,或者 一些东西 我需要调整来解决这个问题,因为我无法相信 StartTime 属性在框架中只是这样它就可以 100% 失败时间。
Google 搜索表明我可以通过将运行查询代码的凭据的用户添加到“性能日志用户”组来解决此问题。但是,这台机器上不存在这样的用户组。
【问题讨论】:
【参考方案1】: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);
其中部分内容来自 Code Project:
http://www.codeproject.com/KB/system/win32processusingwmi.aspx
还有“嘿,脚本专家!”:
http://www.microsoft.com/technet/scriptcenter/resources/qanda/jul05/hey0720.mspx
【讨论】:
【参考方案2】:.Net 1.1 的进程使用性能计数器来获取信息。它们被禁用或用户没有管理权限。确保启用了性能计数器并且用户是管理员应该使您的代码正常工作。
其实“性能计数器用户组”就足够了。默认情况下该组不存在。所以你应该自己创建它。
.Net 2.0 的进程不依赖于性能计数器。
见http://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspx
【讨论】:
【参考方案3】:底层代码需要能够调用 OpenProcess,为此您可能需要 SeDebugPrivilege。
您正在执行 StartTime 请求的进程是否以与您自己的进程不同的用户身份运行?
【讨论】:
【参考方案4】:好的,抱歉,这不起作用...我不是 ASP.NET 模拟方面的专家,我倾向于使用我认为您无法在 W2K 上使用的应用程序池您是否尝试过编写一个很小的测试应用程序哪个执行相同的查询,然后以不同的用户身份运行?
我不愿意在这里发布一大块 MS 框架代码,但您可以使用 Reflector 或这个:http://www.codeplex.com/NetMassDownloader 来获取框架相关位的源代码,以便您可以尝试实现各种位以查看它失败的地方。
您能否在不被拒绝访问的情况下获得有关该过程的任何其他信息?
【讨论】:
【参考方案5】:我可以枚举进程(即 GetProcessById 函数有效),我们还有其他代码可以获取 EXE 名称和其他信息。
我会试试测试应用程序。如果我不能让 C# 实现在短时间内正常工作,我还将尝试使用 WMI 来获取这些信息(这不是关键功能,所以我不能花几天时间在上面)。
【讨论】:
以上是关于Process.StartTime 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章