5

私のコードでは、特定のプロセスが実行されている時間を判断する必要があります。しかし、リクエストでアクセス拒否エラー メッセージが表示され、引き続き失敗しますProcess.StartTime。これは、ユーザーの資格情報で実行されるプロセスです (つまり、高特権プロセスではありません)。100% の確率で失敗するように StartTime プロパティがフレームワークにあるとは信じられないため、明らかにセキュリティ設定またはポリシー設定、またはこれを修正するためにいじる必要があるものがあります。

Google 検索では、クエリ コードを実行している資格情報を持つユーザーを "Performance Log Users" グループに追加することで、これを解決できることが示されました。ただし、このマシンにはそのようなユーザー グループは存在しません。

4

5 に答える 5

6

ラース、あなたが以前言ったことと似たようなことを読んだことがあります。残念ながら、問題のマシンでできることはいくらか制限されています (つまり、ユーザー グループを勝手に作成することはできません。これはサーバーであり、ランダムな PC ではありません)。

答えてくれてありがとう、ウィルとラース。残念ながら、彼らは私の問題を解決しませんでした。

これに対する究極の解決策は、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

そして、「Hey, Scripting Guy!」:

http://www.microsoft.com/technet/scriptcenter/resources/qanda/jul05/hey0720.mspx

于 2008-08-28T07:30:55.510 に答える
2

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

実際には、「Performance Counter Users Group」で十分です。グループはデフォルトでは存在しません。したがって、自分で作成する必要があります。

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

http://weblogs.asp.net/nunitaddin/archive/2004/11/21/267559.aspxを参照してください。

于 2008-08-26T19:49:18.293 に答える
1

基になるコードは、SeDebugPrivilege が必要な場合がある OpenProcess を呼び出すことができる必要があります。

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

于 2008-08-26T17:56:10.983 に答える
0

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

テストアプリを試してみます。また、C# の実装がすぐに適切に機能しない場合は、WMI を使用してこの情報を取得しようとします (これは重要な機能ではないため、何日も費やすことはできません)。

于 2008-08-26T19:23:44.017 に答える
0

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

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

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

于 2008-08-26T19:12:07.760 に答える