2008-08-26 6 views
3

Мой код должен определить, сколько времени работает определенный процесс. Но он продолжает терпеть неудачу с сообщением об ошибке отказа в доступе в запросе Process.StartTime. Это процесс, выполняющийся с учетными данными пользователя (т. Е. Не с высоким уровнем привилегий). Там явно установлен параметр безопасности или параметр политики, или что-то, что мне нужно покрутить, чтобы исправить это, так как я не могу поверить, что свойство StartTime находится в Framework только для того, чтобы оно могло терпеть неудачу в течение 100% времени.Process.StartTime Access Denied

Поиск в Google показал, что я могу разрешить это, добавив пользователя, чьи учетные данные для кода запроса запущены для группы «Пользователи журнала производительности». Однако на этой машине нет такой группы пользователей.

ответ

1

Базовый код должен иметь возможность вызвать OpenProcess, для которого может потребоваться SeDebugPrivilege.

Это процесс, когда вы выполняете запрос StartTime при запуске как отдельный пользователь для вашего собственного процесса?

0

ОК, извините, что не сработало ... Я не эксперт по олицетворению ASP.NET, я склонен использовать пулы приложений, которые я не думаю, что вы можете делать на W2K. Пробовали ли вы писать крошечный небольшой тест приложение, которое выполняет тот же запрос, а затем запускает это как различные пользователи?

Я не хочу размещать кусок кода рамки MS здесь, но вы можете использовать Reflector или это: http://www.codeplex.com/NetMassDownloader, чтобы получить исходный код для соответствующих битов фреймворка, чтобы вы могли попробовать реализовать различные биты, чтобы увидеть, где он не работает.

Можете ли вы получить любую другую информацию о процессе, не получив отказ от доступа?

0

Я могу перечислить процесс (т. Е. Работает функция GetProcessById), и у нас есть другой код, который получает имя EXE и другие биты информации.

Я попробую тестовое приложение. Я также попытаюсь использовать WMI для получения этой информации, если я не смогу правильно реализовать реализацию C# в короткие сроки (это не критическая функциональность, поэтому я не могу проводить на ней дни).

2

Процесс .Net 1.1 использует счетчики производительности для получения информации. Либо они отключены, либо пользователь не имеет административных прав. Убедитесь, что счетчики производительности включены, а пользователь - администратор, чтобы ваш код работал.

На самом деле «группа пользователей счетчиков производительности» должна быть достаточно. По умолчанию группа не существует. Поэтому вы должны создать его самостоятельно.

Процесс .Net 2.0 не зависит от счетчиков производительности.

См http://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspx

3

Я что-то подобное тому, что вы говорили в прошлом, Ларс читать. К сожалению, я несколько ограничен тем, что я могу сделать с рассматриваемой машиной (другими словами, я не могу создавать группы пользователей волей-неволей: это сервер, а не только случайный ПК).

Спасибо за ответы, Уилл и Ларс. К сожалению, они не решили мою проблему.

Окончательное решение этой проблемы является использование 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