2008-08-26 33 views
3

私のコードでは、特定のプロセスの実行時間を判断する必要があります。しかし、それは、Process.StartTime要求でアクセス拒否エラーメッセージで失敗し続けます。これは、ユーザーの資格情報(つまり、特権の高いプロセスではない)で実行されているプロセスです。はっきりとセキュリティ設定やポリシー設定、または何か私はこの問題を解決するために悩む必要があります。私はStartTimeプロパティがフレームワークにあるとは信じられません。Process.StartTimeアクセスが拒否されました

Google検索では、クエリコードが実行されているユーザーを「パフォーマンスログユーザー」グループに追加することで、この問題を解決できることが示されました。ただし、このマシンにこのようなユーザーグループは存在しません。

答えて

1

SeDebugPrivilegeが必要なOpenProcessを呼び出すことができる必要があります。

StartTimeリクエストを実行しているプロセスは、自分のプロセスとは別のユーザーとして実行していますか?

0

OK、申し訳ありませんでした...私はASP.NETの偽装に関する専門家ではありません、私はあなたがW2Kで行うことはできないと思うアプリケーションプールを使用する傾向があります。同じクエリを実行し、それをさまざまなユーザーとして実行するアプリですか?

ここにMSフレームワークコードのチャンクを投稿することには消極的ですが、リフレクターまたはhttp://www.codeplex.com/NetMassDownloaderのいずれかを使用してフレームワークの関連ビットのソースコードを取得して、さまざまなビットを実装してそれは失敗する。

アクセス拒否を取得せずにプロセスに関するその他の情報を取得できますか?

0

私はプロセスを列挙することができます(つまり、GetProcessById関数が機能します).EXE名とその他の情報を取得するためのコードがあります。

私はテストアプリに試してみましょう。私はC#の実装が短期間で正しく動作しない場合(これは重要な機能ではないため、数日かかることもありません)、この情報を得るためにWMIを使用しようとしています。

2

.Net 1.1のプロセスは、パフォーマンスカウンタを使用して情報を取得します。無効になっているか、ユーザーに管理者権限がありません。パフォーマンスカウンターが有効で、ユーザーが管理者であることを確認することで、コードが機能するようにする必要があります。

実際には、「パフォーマンスカウンターユーザーグループ」で十分です。グループはデフォルトでは存在しません。だから自分でそれを作成する必要があります。

.Net 2.0のプロセスは、パフォーマンスカウンタに依存しません。

私はあなたが過去、ラースで言ったものと同様のものを読んだhttp://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspx

3

を参照してください。残念なことに、私は問題のマシンで何ができるのかに幾分制限されています(言い換えれば、ランダムなPCだけではなく、サーバーでもあります)。

回答ありがとう、WillとLars。残念ながら、彼らは私の問題を解決しませんでした。

アルティメットこれに対する解決策は、WMIを使用することです:

http://www.codeproject.com/KB/system/win32processusingwmi.aspx

そして "さん、こんにちは!"::

本の

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.microsoft.com/technet/scriptcenter/resources/qanda/jul05/hey0720.mspx

関連する問題