どのように親プロセスです。純管理方法
質問
この多くのための方法を親プロセスです。純がみつかるP/呼び出します。
解決
このコードは、親プロセスのオブジェクトを見つけるための素晴らしいインターフェイスを提供し、アカウントに同じ名前を持つ複数のプロセスの可能性を取る
使用方法:
Console.WriteLine("ParentPid: " + Process.GetProcessById(6972).Parent().Id);
コード:
public static class ProcessExtensions {
private static string FindIndexedProcessName(int pid) {
var processName = Process.GetProcessById(pid).ProcessName;
var processesByName = Process.GetProcessesByName(processName);
string processIndexdName = null;
for (var index = 0; index < processesByName.Length; index++) {
processIndexdName = index == 0 ? processName : processName + "#" + index;
var processId = new PerformanceCounter("Process", "ID Process", processIndexdName);
if ((int) processId.NextValue() == pid) {
return processIndexdName;
}
}
return processIndexdName;
}
private static Process FindPidFromIndexedProcessName(string indexedProcessName) {
var parentId = new PerformanceCounter("Process", "Creating Process ID", indexedProcessName);
return Process.GetProcessById((int) parentId.NextValue());
}
public static Process Parent(this Process process) {
return FindPidFromIndexedProcessName(FindIndexedProcessName(process.Id));
}
}
他のヒント
ここでのソリューションです。これは、p /呼び出す使用していますが、うまく動作しているようですが、32または64のcpuます:
/// <summary>
/// A utility class to determine a process parent.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct ParentProcessUtilities
{
// These members must match PROCESS_BASIC_INFORMATION
internal IntPtr Reserved1;
internal IntPtr PebBaseAddress;
internal IntPtr Reserved2_0;
internal IntPtr Reserved2_1;
internal IntPtr UniqueProcessId;
internal IntPtr InheritedFromUniqueProcessId;
[DllImport("ntdll.dll")]
private static extern int NtQueryInformationProcess(IntPtr processHandle, int processInformationClass, ref ParentProcessUtilities processInformation, int processInformationLength, out int returnLength);
/// <summary>
/// Gets the parent process of the current process.
/// </summary>
/// <returns>An instance of the Process class.</returns>
public static Process GetParentProcess()
{
return GetParentProcess(Process.GetCurrentProcess().Handle);
}
/// <summary>
/// Gets the parent process of specified process.
/// </summary>
/// <param name="id">The process id.</param>
/// <returns>An instance of the Process class.</returns>
public static Process GetParentProcess(int id)
{
Process process = Process.GetProcessById(id);
return GetParentProcess(process.Handle);
}
/// <summary>
/// Gets the parent process of a specified process.
/// </summary>
/// <param name="handle">The process handle.</param>
/// <returns>An instance of the Process class.</returns>
public static Process GetParentProcess(IntPtr handle)
{
ParentProcessUtilities pbi = new ParentProcessUtilities();
int returnLength;
int status = NtQueryInformationProcess(handle, 0, ref pbi, Marshal.SizeOf(pbi), out returnLength);
if (status != 0)
throw new Win32Exception(status);
try
{
return Process.GetProcessById(pbi.InheritedFromUniqueProcessId.ToInt32());
}
catch (ArgumentException)
{
// not found
return null;
}
}
}
この道ます:
public static Process GetParent(this Process process)
{
try
{
using (var query = new ManagementObjectSearcher(
"SELECT * " +
"FROM Win32_Process " +
"WHERE ProcessId=" + process.Id))
{
return query
.Get()
.OfType<ManagementObject>()
.Select(p => Process.GetProcessById((int)(uint)p["ParentProcessId"]))
.FirstOrDefault();
}
}
catch
{
return null;
}
}
ここに私の試みは、管理ソリューションでいます。
これをポーリングパフォーマンスカウンタすべてのプロセスの親PIDに子PIDの辞書を返します。そして、あなたがあなたの親など、祖父母を、見るためにあなたの現在のPIDで辞書をチェックすることができます。
これは確かに、それは取得する方法多くの情報では過剰です。最適化すること自由に感じています。
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace PidExamples
{
class ParentPid
{
static void Main(string[] args)
{
var childPidToParentPid = GetAllProcessParentPids();
int currentProcessId = Process.GetCurrentProcess().Id;
Console.WriteLine("Current Process ID: " + currentProcessId);
Console.WriteLine("Parent Process ID: " + childPidToParentPid[currentProcessId]);
}
public static Dictionary<int, int> GetAllProcessParentPids()
{
var childPidToParentPid = new Dictionary<int, int>();
var processCounters = new SortedDictionary<string, PerformanceCounter[]>();
var category = new PerformanceCounterCategory("Process");
// As the base system always has more than one process running,
// don't special case a single instance return.
var instanceNames = category.GetInstanceNames();
foreach(string t in instanceNames)
{
try
{
processCounters[t] = category.GetCounters(t);
}
catch (InvalidOperationException)
{
// Transient processes may no longer exist between
// GetInstanceNames and when the counters are queried.
}
}
foreach (var kvp in processCounters)
{
int childPid = -1;
int parentPid = -1;
foreach (var counter in kvp.Value)
{
if ("ID Process".CompareTo(counter.CounterName) == 0)
{
childPid = (int)(counter.NextValue());
}
else if ("Creating Process ID".CompareTo(counter.CounterName) == 0)
{
parentPid = (int)(counter.NextValue());
}
}
if (childPid != -1 && parentPid != -1)
{
childPidToParentPid[childPid] = parentPid;
}
}
return childPidToParentPid;
}
}
}
他のニュースでは、私は私のマシン上であったどのように多くのパフォーマンスカウンタを学びました:13401.聖なる牛が
、より多くの文書化されて良い方法は、あります NtQueryInformationProcess:すなわち、PROCESSENTRY32(CreateToolhelp32Snapshot、Process32First、Process32Next)。これは、このポストするに示すです。
微妙な細部にはに注意してください そして、のコミュニティのコメントで指摘したように、実際には、これらは、完全に無関係であり、PIDがクリエーターPID必ずしもではないこと、親に注意してください PROCESSENTRY32 に。
ご来をひと突き処刑されるはずのBCL場合、当該お客様は見ることの方を見親プロセスは意図的に回避され、この例:
ご覧のとおり、ソースコードが含まれますが包括的な構造や輸入にネイティブメソッドは絶対に十分に作成"にチェックを入れます。しかし、場合でもアクセス方法について説明し反射ことが可能となります見出せない方法です。私は答えないのに、なぜまだこの現象の原因を問いったらやや繰り返し、例えば:
たな答えはないとしてのコードを使用 CreateToolhelp32Snapshot このスレッドも追加--そんなことをすれば、この構造の定義および氏名ま盗からのMSの"理解"、"好感度"や源:)
コード
using System.Diagnostics; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; using System;
public static class Toolhelp32 { public const uint Inherit = 0x80000000; public const uint SnapModule32 = 0x00000010; public const uint SnapAll = SnapHeapList|SnapModule|SnapProcess|SnapThread; public const uint SnapHeapList = 0x00000001; public const uint SnapProcess = 0x00000002; public const uint SnapThread = 0x00000004; public const uint SnapModule = 0x00000008; [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr handle); [DllImport("kernel32.dll")] static extern IntPtr CreateToolhelp32Snapshot(uint flags, int processId); public static IEnumerable<T> TakeSnapshot<T>(uint flags, int id) where T : IEntry, new() { using(var snap = new Snapshot(flags, id)) for(IEntry entry = new T { }; entry.TryMoveNext(snap, out entry);) yield return (T)entry; } public interface IEntry { bool TryMoveNext(Toolhelp32.Snapshot snap, out IEntry entry); } public struct Snapshot:IDisposable { void IDisposable.Dispose() { Toolhelp32.CloseHandle(m_handle); } public Snapshot(uint flags, int processId) { m_handle=Toolhelp32.CreateToolhelp32Snapshot(flags, processId); } IntPtr m_handle; } }
[StructLayout(LayoutKind.Sequential)] public struct WinProcessEntry:Toolhelp32.IEntry { [DllImport("kernel32.dll")] public static extern bool Process32Next(Toolhelp32.Snapshot snap, ref WinProcessEntry entry); public bool TryMoveNext(Toolhelp32.Snapshot snap, out Toolhelp32.IEntry entry) { var x = new WinProcessEntry { dwSize=Marshal.SizeOf(typeof(WinProcessEntry)) }; var b = Process32Next(snap, ref x); entry=x; return b; } public int dwSize; public int cntUsage; public int th32ProcessID; public IntPtr th32DefaultHeapID; public int th32ModuleID; public int cntThreads; public int th32ParentProcessID; public int pcPriClassBase; public int dwFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public String fileName; //byte fileName[260]; //public const int sizeofFileName = 260; }
public static class Extensions { public static Process Parent(this Process p) { var entries = Toolhelp32.TakeSnapshot<WinProcessEntry>(Toolhelp32.SnapAll, 0); var parentid = entries.First(x => x.th32ProcessID==p.Id).th32ParentProcessID; return Process.GetProcessById(parentid); } }
しますので利用しています:
試験
public class TestClass { public static void TestMethod() { var p = Process.GetCurrentProcess().Parent(); Console.WriteLine("{0}", p.Id); } }
代替終..
によるドキュメンテーションまでを、一対の繰り返し処理方法種類のエントリなどの Process32First
や Process32Next
の繰り返し処理のプロセスんのxxxxFirstボックス内の検索フィールドは必要なくなり、その思い入れの繰り返し処理方法とそれに対応する入力す。でんきやすく実と理解できる(たしかにその通りだと思い..).
だけど Toolhelp32
チンと 助, と思い静的ヘルパークラスは、この明確な修飾名などの Toolhelp32.Snapshot
または Toolhelp32.IEntry
そうすると無関係す。
一度の親プロセスが得られた場合、さらに取得したい詳細示,ウンターまでお問合わせくださいこの簡単、例えば、繰り返し処理を実行し、そのモジュールを追加:
コード-WinModuleEntry
[StructLayout(LayoutKind.Sequential)] public struct WinModuleEntry:Toolhelp32.IEntry { // MODULEENTRY32 [DllImport("kernel32.dll")] public static extern bool Module32Next(Toolhelp32.Snapshot snap, ref WinModuleEntry entry); public bool TryMoveNext(Toolhelp32.Snapshot snap, out Toolhelp32.IEntry entry) { var x = new WinModuleEntry { dwSize=Marshal.SizeOf(typeof(WinModuleEntry)) }; var b = Module32Next(snap, ref x); entry=x; return b; } public int dwSize; public int th32ModuleID; public int th32ProcessID; public int GlblcntUsage; public int ProccntUsage; public IntPtr modBaseAddr; public int modBaseSize; public IntPtr hModule; //byte moduleName[256]; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string moduleName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string fileName; //byte fileName[260]; //public const int sizeofModuleName = 256; //public const int sizeofFileName = 260; }
テ..
public class TestClass { public static void TestMethod() { var p = Process.GetCurrentProcess().Parent(); Console.WriteLine("{0}", p.Id); var formatter = new CustomFormatter { }; foreach(var x in Toolhelp32.TakeSnapshot<WinModuleEntry>(Toolhelp32.SnapModule, p.Id)) { Console.WriteLine(String.Format(formatter, "{0}", x)); } } } public class CustomFormatter:IFormatProvider, ICustomFormatter { String ICustomFormatter.Format(String format, object arg, IFormatProvider formatProvider) { var type = arg.GetType(); var fields = type.GetFields(); var q = fields.Select(x => String.Format("{0}:{1}", x.Name, x.GetValue(arg))); return String.Format("{{{0}}}", String.Join(", ", q.ToArray())); } object IFormatProvider.GetFormat(Type formatType) { return typeof(ICustomFormatter)!=formatType ? null : this; } }
したい場合は、コード例では..