2011-01-15 10 views
2

すべてプロセスEXE名を実行しようとしていますが、これをXPゲストアカウントで試行したときに遭遇しました。 EnumProcessesを使用してすべてのプロセスIDを列挙できますが、PROCESS_QUERY_INFORMATIONまたはPROCESS_VM_READを使用してOpenProcessを試行すると、その関数は失敗します。Process ExplorerはXPゲストアカウントからすべてのプロセス名をどのように列挙しますか?

XPゲストアカウントでプロセスエクスプローラを起動し、すべてのプロセス名を列挙することができました(ただし、ゲストユーザー空間外のプロセスのほとんどの情報は存在しません)。

私の質問は、プロセスエクスプローラの魔法を複製して、サービスやプロセスのプロセス名をGuestアカウントのユーザー空間外で実行する方法です。

+1

...これについてはあまり知られていませんが、プロセスのエクスプローラがゲスト権限で実行されていることを確認してください(プログラムと同じ位置にあります)。おそらく起動時に管理権限で実行されているゲストによって。 – schnaader

+0

GetLastErrorはあなたに何を伝えますか? –

+0

はい、私のIDEと同じ特権を持つGuestアカウントプロセスとして実行されています。 –

答えて

3

プロセスエクスプローラでは、SystemProcessInformationNtQuerySystemInformationを使用してプロセスのリストを取得するとします。コード例については、my old answerを参照してください。さらに、関数NtQueryInformationProcessを使用して追加情報を取得します。ところで

、あなたがDependency Walker(メニュー「プロフィール」/「スタートプロファイリング」またはF7)の下でプロセスエクスプローラを起動した場合、あなたはプロセスエクスプローラが本当にNTDLL.DLLから使用しているすべての機能が表示されます。 NtQuerySystemInformationNtQueryInformationProcessが実際に使用されることがわかります。

+0

Oleg、ありがとう、これは私にプロセスとUNICODE_STRINGに格納されているプロセス名については、より多くの情報を提供します(より多くのVB6で)PROCESSENTRY32で返された文字列よりもきれいです。 –

+0

@Joe:ようこそ! – Oleg

0

プロセスが開始すると、アクセス権の基本セットが割り当てられます。一部のAPI呼び出しでは、正常に完了するために追加の権限が必要です。具体的には、OpenProcessは、場合によってはSeDebugPrivilege特権を必要とすることがあります。追加の権限を有効にするためにプロセストークンを変更する方法の例は、Enabling and Disabling Privileges in C++です。

+0

これは、プロセスエクスプローラが、限られたゲストアカウントでSeDebugPrivilegeを有効にして実行されないため、プロセスエクスプローラがプロセス名を列挙するために、他の手段を使用していることを意味します。 –

+0

@Joe:プロセス名では、実行可能ファイル名を意味しますか? EnumProcessesの代わりに、[tool help library](http://msdn.microsoft.com/en-us/library/ms686837%28v=vs.85%29.aspx)も同様の情報を得ることができます。 – casablanca

1

NtQuerySystemInformationはほとんど文書化されておらず、「将来のバージョンのWindowsで変更または使用できない可能性があります」CreateToolhelp32Snapshotは完全に文書化されており、イメージ名を示す必要があります。

+0

Anders、ありがとう、これは有効な答えです。なぜ私がPROCESSENTRY32の他のメンバーをチェックするのをやめなかったのか分かりません。 –

0

GetProcessImageFileNameでは、VistaではPROCESS_QUERY_LIMITED_INFORMATIONが必要ですが、XPではPROCESS_QUERY_INFORMATIONが必要です。

ゲストアカウントであるPROCESS_VM_READを取得する必要はありません。

関連する問題